1、目 录一、课题设计任务分析-二、程序模块设计分析-三、程序的实现思路-四、程序流程图-五、源代码及注释-六、测试情况-七、小结-一、课程设计任务分析:(1)需求分析:能够实现学生学号、姓名、各科成绩的录入;能够实现对学生信息的浏览、查找、删除;弄够实现对学生信息按学号顺序显示,成绩排名;能够对各科成绩统计情况输出。(2)系统功能要求:要求实现如下功能: 成绩的输入(学号、姓名、英语、数学、C+语言)。成绩统计(各科平均成绩、各科成绩“优秀”“良好”“中等”“及格” “不及格”的人数及其所占比例)。总成绩统计(学生的总成绩、平均成绩及成绩排名)。 成绩的统计结果显示。 学生数据的添加、修改、与删
2、除。 学生数据的读取与存储。(3)系统的功能分析:资料维护:系统维护包括对各学生姓名、成绩、学号的录入操作,对数据表中的信息进行浏览。成绩查询:可以对学生成绩进行详细查询及各科成绩的优秀和不及格人数、各科总平均成绩等相关信息的浏览。排序显示:包括统计学生排名成绩、不及格科目情况、各科总平均成绩。二、程序模块设计分析:(1)添加数据: 把用户输入的数据添加到学生类对象数组中,然后再将其入堆,使其有序。 (2)删除数据: 由用户输入要删除的学生的学号,然后将其从学生类对象数组中删除,使数组中的数据仍然有序。(3)查找数据: 由用户输入要查找的学生的学号,然后调用 leo 类中关于查找的函数,将查找
3、结果显示 在屏幕上。(4)显示数据: 调用 leo 类中关于显示数据的函数,把所有的学生数据都显示在屏幕上。 (5)清除数据: 调用 leo 类中关于清除数据的函数,把所有的学生数据都清空。(6)退出程序: 若用户输入了数字 0,则主函数结束循环,同时程序也就结束了。三、程序的实现思路:先创建一个学生元素类,用于存放学生的各种数据。然后创建另一个类,把数据存储, 可便进行各种操作。本程序中比较核心的技术就是用到了堆排序,将学生按优先级(高的排 前面,低的排后面)的大小进行有序排列。堆排序的时间复杂度较一般排序(如:冒泡,选 择等)来得低,可使程序显示数据时效率更高。(1)“成绩录入”模块:序号
4、录入:对各个学生序号录入;数据录入:对学生科目和成绩进行录入。(2)“查询修改”模块:可以对学生数据进行指定查找、修改或查看全部学生信息;选择输出单科成绩统计情况。(3)“排序显示”模块:可自行按学号顺序显示所有学生信息;可选择查看学生总分排名,排序显示到用户屏幕。四、程序流程图:程序中一共包括了六个模块,分别是:添加模块、删除模块、排序模块、统计模块、查找模块、界面模块。 (1)添加信息:(2)删除信息:(3)信息排序:(4)统计信息:(5)查找信息:(6)界面模块:五、源代码及注释:#include#include#include#include#define max 300using n
5、amespace std;struct student string num;string name;float english;float math;float cyuyan;/定义c+float geten()return english;float getma()return math;float getcy()return cyuyan;string getnu()return num;string getna()return name;int rank3;int row;/排名int sinto(string,string,float,float,float);/输入数据void o
6、utput();/输出数据float sum();/ 求和float average();/求平均void subject();/成绩分类; void shows()/普通函数coutsetw(6)排名setw(6)学号setw(10)姓名setw(6)英语setw(6)数学setw(6)c+setw(6)总分setw(10)平均分endl;int student:sinto(string a1,string a2,float b1,float b2,float b3 )num=a1;name=a2;english=b1;math=b2;cyuyan=b3;return 0;void stud
7、ent:output()/输出coutsetw(6)rowsetw(6)numsetw(10)namesetw(6)englishsetw(6)mathsetw(6)cyuyansetw(6)sum()setw(10)setiosflags(ios:fixed)setprecision(1)average()endl;coutsetiosflags(ios:fixed)setprecision(0);float student:sum()/求总分 return english+math+cyuyan;float student:average()/求平均分return sum()/3;void
8、 student:subject() int n;rank0=(int)english;rank1=(int)math;rank2=(int)cyuyan;for(int i=0;i3;i+) n=ranki/10;switch(n) case 9:n=1;break;case 8:n=2;break;case 7:n=3;break;case 6:n=4;break;default:n=5;ranki=n;/类student结束/类leo开始class leoprivate:student itemmax;int size;public:leo();void lsize(int);/设置数组
9、大小void lempty();/清空void linsert();/添加void ldelet(string);/删除void lsearch(string);/查找void lmodify(string);/修改void lsort();/成绩分类void lrow();/排序 void obave();/求平均void lview();/显示全部数据void lcin();/从磁盘输出void lcout();/储存到磁盘;leo:leo() student itemmax;lsize(0);void leo:lsize(int i)size=i;void leo:lempty() ls
10、ize(0);cout学生数据清除成功endl;cout当前无学生数据。请添加!endl;void leo:ldelet(string a) int k=0;string c;for(int i=0;isize;i+)if(itemi.getn()=a)cout你将要删除的数据如下:endl;shows();itemi.output();coutc;if(c=y|c=Y) itemi=item-size;k=1; if(k!=1)coutn删除失败!endl;else coutn删除成功!max)cout超出范围,不能再添加!endl;else coutn请输入学号、姓名、英语、数学、c+成绩
11、:a1a2b1b2b3;for(int i=0;isize;i+)if(itemi.getnu()=a1) mn+;cout输入的数据与下面的数据重复!endl;shows();/输出重复的学号,姓名,英语,数学,c+成绩itemi.output();if(!mn)itemsize+.sinto(a1,a2,b1,b2,b3);coutn添加成功!;couta;void leo:lsearch(string a)/查找int N=0;for(int i=0;isize;i+)if(itemi.getnu()=a)N+;shows();/输出学号,姓名,英语,数学,c+itemi.output(
12、);if(!N)cout输入有误或该学生数据不存在endl;void leo:lmodify(string a)/修改 if(size=0)cout当前学生数据为空,请添加!endl;elseint N=0;for(int i=0;isize;i+)if(itemi.getnu()=a) N+;cout你将要修改的数据如下:endl;shows();itemi.output();cout请输入要修改学生的学号,姓名,英语,数学,c+成绩a1a2b1b2b3;itemi.sinto(a1,a2,b1,b2,b3);cout修改成功!endl;if(!N)cout输入的学号有误!1)for(int
13、 i=0;isize-1;i+) temb=itemi;for(int j=i+1;jsize;j+)if(itemi.sum()itemj.sum() itemi=itemj;itemj=temb; item0.row=1;for(int i=0;iitemi+1.sum() itemi+1.row=i+2;else itemi+1.row=i+1;/并列排名else if(size=1) item0.row=1;void leo:lview()/显示if(size=0)cout当前学生数据为空,请添加!endl;else cout共有学生数据size条endlendl;shows();fo
14、r(int i=0;isize;i+) itemi.output();void leo:obave()/统计科目 if(size!=0)float sum3=0;for(int i=0;isize;i+)sum0+=itemi.geten();sum1+=itemi.getma();sum2+=itemi.getcy();cout英语平均的成绩为:setiosflags(ios:fixed)setprecision(1)sum0/sizen;cout数学平均的成绩为:sum1/sizen;coutc+的平均成绩是:sum2/sizen;coutsetiosflags(ios:fixed)set
15、precision(0)endl;else cout当前无学生数据,请添加!;void leo:lsort() /成绩分类 int p3300;float tem=100.00/size;string a3=英语,数学,c+;if(size!=0) for(int i=0;isize;i+) itemi.subject();p0i=itemi.rank0;p1i=itemi.rank1;p2i=itemi.rank2;for(int k=0;k3;k+) int b5=0; for(int i=0;isize;i+) switch(pki)case 1: b0+;break;case 2: b
16、1+;break;case 3: b2+;break;case 4: b3+;break;case 5: b4+;break;default:break; coutak成绩分类人数: 优b0人 良b1人 中b2人 及格b3人 不及格b4人endl;coutsetiosflags(ios:fixed)setprecision(1)ak成绩分类比例: 优(float)b0*tem% 良(float)b1*tem% 中(float)b2*tem% 及格(float)b3*tem% 不及格(float)b4*tem%endlendl;coutsetiosflags(ios:fixed)setpreci
17、sion(0)endl;void leo:lcin() string a300,b300;float c300,d300,e300;int f300;ifstream infile(ok.txt,ios:in);if(! infile) cerr初次使用此系统,请选择先清除所有数据。endl;for(int i=0;iaibicidieifi;itemsize.sinto(ai,bi,ci,di,ei);size+;if(fi=1) break; infile.close();void leo:lcout()ofstream outfile(ok.txt,ios:out);if(! outfi
18、le) cerr文件打开失败!endl;for(int i=0;isize;i+)outfileitemi.num itemi.name itemi.english itemi.math itemi.cyuyan size-iendl;outfile.close();void showmenu()cout ;cout|*|endl;cout ;cout|欢迎使用学生成绩统计管理系统|endl;cout ;cout|*|endl;cout ;cout| 1.显示:显示所有学生数据(按总分排序)|endl;cout ;cout| 2.查看:查看所有统计结果 |endl;cout ;cout| 3.
19、添加:插入一个学生数据 |endl;cout ;cout| 4.删除:删除一个学生数据 |endl;cout ;cout| 5.查找: 查找指定学生数据 |endl;cout ;cout| 6.修改:修改指定学生数据 |endl;cout ;cout| 7.清空:清除所有学生数据 |endl;cout ;cout| 8.帮助:查看系统注意事项 |endl;cout ;cout| 0.退出:将数据保存到磁盘 |endl;cout ;void showtip() coutntt操作完成!endl;couttt选择0-8继续endl;int main()leo leo1;string c=s,a;s
20、ystem(cls);/清屛showmenu();cout正在打开文件,请稍后!endl;leo1.lcin();coutc;while(c!=0)system(cls);showmenu();if(c=1) cout你选择了1,学生数据显示如下:endlendl;leo1.lrow();/排序leo1.lview();if(c=2) cout你选择了2,统计结果如下:endl;leo1.obave();/各科平均成绩,leo1.lsort();/各科分类情况if(c=3) cout你选择了3,请输入学生数据;leo1.linsert();if(c=4) cout你选择了4,请输入要删除的学号
21、:a;leo1.ldelet(a);if(c=5)cout你选择了5,请输入要查找的学号:a;leo1.lsearch(a);if(c=6)cout你选择了6,请输入要修改的学号:a;leo1.lmodify(a);if(c=7) cout你选择了7,全部数据将要清空endl;cout你确定清空吗?输入y确定,n退出a;if(a=y|a=Y)leo1.lempty ();if(c=8) cout1.本系统最多可容纳300个学生数据.endl;cout2.如不能正常添加数据,请检查使用前是否清空了数据.endl;cout3.选择相应的数字输入,不同数据间留空隔,输完后按回车键 .endl;cou
22、t4.注意操作完后将数据保存.c;system(cls);leo1.lcout();cout欢迎下次使用!endl;return 0;六、测试情况:程序测试结果良好,基本实现了所有要求。运行结果截图如下:刚运行系统之前首先要清空所有学生数据,然后才能添加数据。七、小结:经过一个学期以来在老师的指导下对C+程序设计的学习, 我学到了C+的基本理论知识,了解了C+作为一种面向对象的程序设计语言的思想,这些知识为我的课程设计实践和进一步学习打下了坚实的基础。在这一个月的课程设计中,我体会颇多,学到了很多的东西。也加强了对这门课程的认识,复习了以前的知识。通过小组成员的努力,最终顺利的完成了这次课程设
23、计。虽然这次课设是在参考程序的基础上进行的,但我们也做了一点修改,但改进并不明显,而且有些部分仍不是很理解,还是创新能力缺乏,知识内容掌握的不完全,并且仍有一些地方的改动使程序无法达到理想效果。另外由于时间紧迫,任务重,对知识的了解仍不广泛,造成系统还存在某些缺陷,功能上还不完善。通过这次课设,我认识到自己在哪些方面还不足,需要继续提高。与此同时,我意识到,c+是一门很有内涵的课程,它不仅需要自己独立查阅资料,还需要集体的合作,进行讨论,还学会了许多老师课本上没讲的东西,如int void的区别,setw的意思等,加深了对这门课程的理解,了解了更多知识,受益匪浅。总而言之,这次课程设计让我收获很大。参考文献:谭浩强, C+程序设计(第二版),清华大学出版社,2011年8月出版2012年9月24日