数据结构课程设计之学生成绩管理程序.docx
- 文档编号:15843171
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:31
- 大小:790.32KB
数据结构课程设计之学生成绩管理程序.docx
《数据结构课程设计之学生成绩管理程序.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之学生成绩管理程序.docx(31页珍藏版)》请在冰点文库上搜索。
数据结构课程设计之学生成绩管理程序
##大学
数据结构课程设计报告
题目:
学生成绩管理系统
院(系):
运算机工程学院
学生姓名:
班级:
学号:
起迄日期:
—
指导教师:
指导教师评语:
成绩:
签名:
年月日
2010—2011年度第2学期
一、需求分析
1.问题描述:
按照程序要求,对两个学生成绩文本和进行归并,并输出所有学生成绩和需要补考学生成绩需要实现查找功能。
设计思路:
第一,对文本和进行读取,并把成绩赋给结构体变量p[a];第二,对p[a]依照总分进行排序,掏出需要补考成绩q[j],把p[a]保留在,q[j]保留在;最后,输入学生的名字或学号,对其进行查询。
2.大体功能
第一个模块——主函数main()功能是:
挪用各个函数,对学生成绩读取、排序、查找并输出。
第二个模块——shuru()功能是:
对和的成绩进行读取。
第三个模块——fuzhi()能是:
把归并后的成绩赋值到新的结构体数组p[a]中。
第四个模块——qipao();xuanze()charu()功能是:
对新的结构体数组p[a]进行气泡排序、选择排序和插入排序。
第五个模块——fuzhi1()功能是:
把成绩中需要补考的学生成绩保留在数组q[j]中。
第六个模块——allscore()功能是:
创建文本,并把所有学生的成绩p[a]保留在文本中。
第七个模块——failscore()功能是:
创建文本,并把需要补考的学生成绩q[j]保留在文本中。
第八个模块——namefind();namezheban()功能是:
两种名字查找方式,别离为顺序查找和折半查找。
第九个模块——numfind();numzheban()功能是:
两种学号查找方式,别离为顺序查找和这般查找。
第十个模块——print();功能是:
打印需要打印的学生成绩。
3.输入输出
输入在文本中,为结构体魄式,对应文本中已经存在的数据即可,对文本进行归并操作。
输出为结构体魄式,包括学生的姓名、姓名和成绩。
并有查找功能,查找时,输入姓名或学号,输出为机构体魄式。
数据的值符合真实情形。
二、概要设计
1.设计思路:
对于成绩的管理:
第一,需要对成绩进行读取,这点比较麻烦,要利用结构体的存储形式进行读取,并利用文件部份的函数和文件指针。
第二,对成绩进行排序,本程序理由了三种排序放法,别离为:
气泡法,选择法,插入法。
然后,要创建和,利用文件函数和文件指针的左右,把成绩保留在其中。
最后,对成绩进行查找,别离提供了姓名查找和学号查找,本程序也提供了顺序查找和折半查找两种方案。
2.数据结构设计:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}
ElemSet为结构体structscore{charname[6];intnum;floatmath;floateng;floatcom;floatdate;};
数据关系:
R1={
大体操作:
shuru1()
初始条件:
线性表不存在
操作结果:
读取数据,存入r[100]。
shuru2()
初始条件:
线性表不存在
操作结果:
读取数据,存入s[100]。
fuzhi(i,j)
初始条件:
r[100],s[100]已存在
操作结果:
归并r[100],s[100]为p[a]。
fuzhi1(a,j)
初始条件:
p[a]存在。
操作结果:
抽取p[a]不合格成绩。
存入q[j]。
charu(inta)
初始条件:
p[a]存在。
操作结果:
对p[a]依照总分降序排序。
allscore(a)
初始条件:
p[a]存在。
操作结果:
保留p[a]到中。
failscore(intj)
初始条件:
q[j]存在。
操作结果:
保留q[j]到中。
print(i,j)
初始条件:
p[a],q[j]存在。
操作结果:
打印成绩。
namefind(a)
初始条件:
p[a]存在。
操作结果:
对p[a]中成绩进行名字查询。
numfind(a)
初始条件:
p[a]存在。
操作结果:
对p[a]中成绩进行学号查询。
3.软件结构设计:
各个模块的函数原型:
voidallscore(inta);
voidcharu(inta);
voidfailscore(intj);
voidfuzhi(inti,intj);
intfuzhi1(inta,intj);
voidnamefind(inta);
voidnumfind(inta);
voidprint(inti,intj);
intshuru1();
intshuru2()
其中,各个函数挪用关系,在主函数中很明显,在详细设计的主函数挪用关系图中。
三、详细设计
1.概念程序中所有效到的数据及其数据结构,及其大体操作的实现;
FILE*fp;inti;
structscore
{charname[6];intnum;floatmath;floateng;floatcom;floatdate;};
structscorep[100],q[100],r[100],s[100],t,tmp;
charch,sh,c,d,fname[6];intk,m,fum,j=0;
在每一个函数中概念不同的数据,并有其独特的类型,有的是结构体,有的是整形,有的是字符型。
在每一个函数中都有其大体操作的实现,在每一个函数的流程图中能够看到其实现进程,详细进程在流程图中。
2.主函数和其他函数的伪码算法
intshuru1()
{if((fp=fopen("","r"))==NULL)ame,&r[i].num,&r[i].math,&r[i].eng,&r[i])!
=EOF)
{r[i].date=r[i].math+r[i].eng+r[i];i++;}ame,&s[j].num,&s[j].math,&s[j].eng,&s[j])!
=EOF)
{s[j].date=s[j].math+s[j].eng+s[j];j++;}
}
fclose(fp);ng<60||p[i].math<60||p[i]<60)
{q[j]=p[i];j++;}}
returnj;ate
{t=p[i];p[i]=p[i+1];p[i+1]=t;}
if(p[i].date==p[i+1].date)
{if(p[i].num>p[i+1].num)
{t=p[i];p[i]=p[i+1];p[i+1]=t;}}
}}
voidxuanze(inta)ate>p[k].date)k=j;
if(p[i].date==p[i+1].date)
{if(p[i].num>p[i+1].num)
{k=j;}}}
if(k!
=i)
{t=p[i];p[i]=p[k];p[k]=t;}}
}*/
voidcharu(inta)ate>p[i-1].date)
{tmp=p[i];p[i]=p[i-1];for(j=i-1;j>-1&&>p[j].date;j--)
p[j+1]=p[j];p[j+1]=tmp;}}
}
voidallscore(inta)-6.1f-6.1f-11.1f-6.1fame,p[i].num,p[i].math,p[i].eng,p[i],p[i].date);
}fclose(fp);-6.1f-6.1f-11.1f-6.1fame,q[i].num,q[i].math,q[i].eng,q[i],q[i].date);
}fclose(fp);
}
voidprint(inti,intj)-6.1f-6.1f-11.1f-6.1fame,p[j].num,p[j].math,p[j].eng,p[j],p[j].date);
}
}
voidnamefind(inta)ame,fname))续查找2.返回主菜单0.退出:
\t");
scanf("%s",&x);
if(x=='1')namefind(a);um)
{printf("\n您所查找的学生成绩如下:
\n\n");print(i,i);}}
printf("\n请继续选择操作:
1.继续查找2.返回主菜单0.退出:
\t");
scanf("%s",&x);
if(x=='1')numfind(a);
if(x=='0')exit(0);
}
/*voidnamecharu(inta)ame,p[i-1].name)<0)
{tmp=p[i];p[i]=p[i-1];for(j=i-1;j>-1&&strcmp,p[j].name)<0;j--)
p[j+1]=p[j];p[j+1]=tmp;}}
}
voidnamezheban(inta)ame,fname))
{printf("\n您所查找的学生成绩如下:
\n\n");print(mid,mid);break;}
elseif(strcmp(fname,p[mid].name)<0)high=mid-1;
elselow=mid+1;}
printf("\n请继续选择操作:
1.继续查找2.返回主菜单0.退出:
\t");
scanf("%s",&x);
if(x=='1')namezheban(a);
if(x=='0')exit(0);
}
voidnumcharu(inta)um
{tmp=p[i];p[i]=p[i-1];
for(j=i-1;j>-1&&
p[j+1]=p[j];p[j+1]=tmp;}}
}
voidnumzheban(inta)um==fnum)
{printf("\n您所查找的学生成绩如下:
\n\n");print(mid,mid);break;}
elseif(fnum
elselow=mid+1;}
printf("\n请继续选择操作:
1.继续查找2.返回主菜单0.退出:
\t");
scanf("%s",&x);
if(x=='1')numzheban(a);
if(x=='0')exit(0);}*/
voidmain()
{system("color5a");
printf("\n\n\n\n\n\t\t\t**********************\n\t\t\t*欢迎利用成绩管理系统*\n\t\t\t**********************\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t制作人:
邵伟\n\n\n\t按任意键进入系统");
d=getch();
system("cls");
3a名字查找成绩2.按学号查找成绩0.退出\n");while(c=getchar())
{if(c=='1'){namefind(a);printf("\n\n\n请选择您要执行的操作:
1.按名字查找成绩2.按学号查找成绩0.退出\n");}
if(c=='2'){numfind(a);printf("\n\n\n请选择您要执行的操作:
1.按名字查找成绩2.按学号查找成绩0.退出\n");}
if(c=='0')break;}
/*while(c=getchar())
{if(c=='1'){namecharu(a);namezheban(a);printf("\n\n\n请选择您要执行的操作:
1.按名字查找成绩2.按学号查找成绩0.退出\n");}
if(c=='2'){numcharu(a);numzheban(a);printf("\n\n\n请选择您要执行的操作:
1.按名字查找成绩2.按学号查找成绩0.退出\n");}
if(c=='0')break;
}*/
}
3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。
()模块:
该模块创建并把p[a]保留在其中
2.charu(inta)模块:
该模块利用插入法,对p[a]进行插入排序
3.failscore(intj)模块:
把需要补考的学生成绩输出。
4.fuzhi(inti,intj)模块:
读取文本,并把成绩赋值给结构体数组。
5.namefind(inta)模块:
依照名字顺序查找。
6.numfind(inta)模块:
依照学号顺序查找。
7.print(inti,intj)模板:
打印成绩。
8.shuru()模块:
读取文本中的数据。
4.画出函数之间的挪用关系图。
四、调试分析
1.实际完成的情形说明(完成的功能,支持的数据类型等);
完成了程序的设计要求:
1实现对两个文件数据进行归并,生成新文件。
2.抽掏出三科成绩中有补考的学生并保留在一个新文件。
3.对归并后的文件中的数据按总分降序排序(至少采用两种排序方式实现)。
4.输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方式实现)。
5.要求利用结构体,链或数组等实现上述要求。
除此之外,程序本身还丰硕了查找功能,不仅可实现名字查找,还能够实现学号查找。
归并功能支持的数据类型为结构体structscore类型,而查找功能的数据类型能够是字符型char或整形int。
2.程序的性能分析,包括时空分析;
程序的性能分析:
程序有较强的循环能力,能够反复的实现查找。
程序的核心:
第一,是文件的读取,把其数据赋给结构体数组(将文件内容结构体数组,然后数组进行排序、查找等最后把结构体数组保留到文件);第二,对结构体数组的各类排序及其查找。
时刻复杂度:
成立数组,则其时刻复杂度为O(n)。
排序时:
气泡法、插入排序和选择排序,时刻复杂度均为O(n*n)。
查找时:
顺序查找,时刻复杂度为O(n);折半查找,时刻复杂度为O(lnN)。
3.上机进程中出现的问题及其解决方案;
1.文件的打开并读取,通过查找C语言,反复的试探,最终解决了文件的读取问题,并解决了在文件中依照必然方式读取。
2.对文件的排序,通过所学内容,选择了三种排序方式(气泡法、插入排序和选择排序)对结构体数组p[a]依照总分进行排序。
3.对数据的查找,依照数据结构的算法,想到两种最适合的方式,别离是顺序查找和折半查找,顺序查找较为简单,可是折半查找,需要先排序才能查找,所以又用到了上述的查找方式。
4.对于循环问题,通过不断的改善,别离运用了while和goto函数对程序加以改良,实现了循环查找,如此更便捷。
4.程序中能够改良的地方说明;
功能上:
能够增加插入功能,插入学生的成绩,是插入更方便,不用打开文件即可在控制台插入;能够增加删除功能,使功能更人性化。
空间上:
能够对代码进行加倍精简的改良,对其瘦身,达到程序的空间性更突出;对程序变量更充分的利用,来减少变量的概念,从而达到节约内存的目的。
5.程序中能够扩充的功能及设计实现假想。
插入,对结构体数组后边未利用部份,依照顺序对其赋值即可。
删除。
能够删除其中的某个元素,把后边的元素依次前移即可。
对多个函数的一路相同部份进行抽取,并归并成新函数,并在其他函数中挪用该函数,这能够减少空间的占用。
五、测试结果
1.读取成绩测试:
文件:
姓名学号语文数学英语
张明明01677882
李成友02789188
张辉灿03688256
王露04564577
陈东明05673847
文件:
姓名学号语文数学英语
陈果31576882
李华明32889068
张明东33484256
李明国34504587
陈道亮35475877
2.归并排序成绩测试:
3.保留所有成绩测试:
4.保留不合格成绩测试:
5.姓名查找测试
6.学号查找测试:
六、用户手册
第一,进入欢迎界面
第二,按任意键进入系统后,会出现和的成绩显示界面,而且显示归并后的成绩。
显示完毕后,选择查找功能,即可查找您想查找的学生成绩信息,能够选择姓名查找和学号查找,按照能够输入,简单快捷。
下边的利用用户,运行程序时就可以够实现功能,不需要再多做说明。
七、体会与自我评价
通过十天的不懈尽力,课程设计圆满结束,通过这次实践让我加深了对线性表主如果结构体、数组、排序、查找和文件的读取熟悉,让我在这方面的知识加以巩固和强化,为以后的程序设计打下了良好的基础。
在程序设计中虽然碰到了许多不同程度的问题,可是通过尽力分析、翻阅图书、咨询老友、网上查找,每一个问题都的取得了解决。
一个完美的程序是由许多的个不同功能的模块通过完美的挪用组合而成的。
在设计进程中通过主函数中分析需要实现的功能,别离概念各个功能的函数,并编写代码实现其功能。
对每一个分函数慢慢细化、精简,模块化分析、结构化编码,最后完成设计。
通过自己亲手实践,我觉察设计进程中存在好多问题,这并非是想一想能解决的,很多不同复杂度的问题,需要通过不同的实践操作,解决各类bug和错误,这些问题丰硕了我的经验,以后解决问题时,会更易。
这次程序中,有很多收获:
对于需要解决的问题,需要仔细试探问题,分析问题的要点,需要解决什么,找到解决方式分步把那个问题解决,解决进程中,要不断的完善,做到最好。
这次课程设计,我学会了独立试探、亲自动手操作,真正的把理论和实践结合起来。
另外,我了解到团队的力量,一个人的力量是有限的。
无论什么问题,要结合团队的力量去解决,问题不论大小,团队的力量是无穷的,咱们能够完美的解决问题,这是一个人办不到的,同时也给自己带来了快乐。
每次程序设计,都能了解一些不同的知识,控制台的输出字体颜色和背景颜色能够改变,这使得程序界面面目一新;第二是清屏函数,它能够在不需要一些内容时,及时清理,使功能的实现更完美。
不同的经历、不同的考验、不同的挫折,这些都能让咱们学会许多。
没有不能解决的问题,只要你肯尽力,就可以解决。
源代码:
#include<>
#include<>
#include<>
FILE*fp;
inti;
structscore
{
charname[6];
intnum;
floatmath;
floateng;
floatcom;
floatdate;
};
structscorep[100],q[100],r[100],s[100],t,tmp;
intshuru1()
{
charch;
if((fp=fopen("","r"))==NULL)
{
printf("不能打开文件");gotoloop;
}
else
{
while(ch!
='\n')
{
ch=fgetc(fp);ame,&r[i].num,&r[i].math,&r[i].eng,&r[i])!
=EOF)
{
r[i].date=r[i].math+r[i].eng+r[i];
i++;
}
}
fclose(fp);
loop:
returni;
}
intshuru2()
{
intj=0;
charsh;
if((fp=fopen("","r"))==NULL)
{
printf("不能打开文件");gotoloop1;
}
else
{
while(sh!
='\n')
{
sh=fgetc(fp);ame,&s[j].num,&s[j].math,&s[j].eng,&s[j])!
=EOF)
{
s[j].date=s[j].math+s[j].eng+s[j];
j++;
}
}
fclose(fp);
loop1:
returnj;
}
voidfuzhi(inti,intj)
{
intk,m;
for(k=0;k
{
p[k]=r[k];
}
for(m=k;m { p[m]=s[m-k]; } } intfuzhi1(inta,intj) { for(i=0;i { if(p[i].eng<60||p[i].math<60||p[i]<60) { q[j]=p[i]; j++; } } returnj; } /*voidqipao(inta) { intj; for(j=0;j for(i=0;i { if(p[i].date { t=p[i]; p[i]=p[i+1]; p[i+1]=t; } if(p[i].date==p[i+1].date) { if(p[i].num>p[i+1].num) { t=p[i]; p[i]=p[i+1]; p[i+1]=t; } } } } voidxuanze(inta) { intj,k; for(i=0;i { k=i;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 学生 成绩 管理程序