资源描述
C+课程设计报告课程设计题目: 学生成绩管理系统 学 生 姓 名 : 吴 深 深 学 号: 201420181013 专 业: 软 件 工 程 班 级: 1421810 指 导 教 师 : 邓 微 2015年 6 月 27 日目 录1功能需求分析32总体设计33数据结构的设计54算法设计84.1 总体的算法设计84.2较难部分的算法设计94.2.1 密码验证模块94.2.2 降序排序部分94.2.3 打开已有文件部分115.程序代码126. 运行环境247.运行结果248.课程设计总结28学生成绩管理系统课程设计报告1功能需求分析学生成绩管理是一个学校必不可少的部分,随着计算机和计算机知识的普及,学生成绩管理系统得到了更大的发展空间,通过对学生成绩管理系统的开发,可以提高校务人员的工作效率。本系统具有以下基本功能:1、功能菜单实现功能选择; 2、输入功能:输入学生信息,并保存到文件中;3、计算每个学生的总分与平均分并排序4、能根据学号修改学生信息5、能根据学号删除学生信息6、查询功能:1)能够根据学号查询学生信息;2)能够根据姓名、班级查询学生信息3)统计学生成绩,按照班级和科目计算平均分。2总体设计根据以上功能需求,本系统定义了一下函数,来逐步实现。(1)void input_student( );该函数实现从键盘中录入学生成绩,并且保存给学生类数组。(2)void rank_down( );该函数以总分对学生降序排序,该函数会从每个学生的成员函数中调用int get_sum( )函数,在调用函数时,被调函数根据输入数据计算出总分并且返回给主调函数。排序以冒泡法实现,排序完成后,再依次给每个学生的数据成员rank(名次)赋值。(3)void save_student( );在有数据后,该函数可以实现数据以十进制的方式保存,保存时,可以自己输入文件名以及保存地址。(4)void rwrite_student();该函数实现对学生成绩等信息进行修改,修改前,以学号先查找到该学生,并且输出其详细信息,方便操作者进行修改。(5)void delete_student();该函数能够以学号为依据,实现对象的删除,并且删除后该位置会被写一个数据填充。(6)void serch_menu();该函数被调用后系统会进入查看菜单,可选择以不同的方式查看学生的成绩信息。按照不同的选择,该函数会调用一下函数。 void surch_number();该函数以学号为依据实现精确查找。 void surch_CLASS();能够根据姓名、班级查询学生信息void detial_class();该函数能够汇总您要查询的班级详细情况,功能包括人数,每个人都详细情况,班级平均分,和该班级的各个科目的平均分。void subject_ave();该函数能够计算出所有科目的平均分。(7)void open_file();该函数可以打开已经保存的学生信息,并且显示到屏幕上,打开后可以进行上述的各种操作。除此之外,还写了void main_menu();主菜单,实现对上述各个功能的选择。3数据结构的设计UML类图数据结构的代码设计如下:const int N = 5000;/student sNstatic int count=N;/控制学生的操作数,默认值为N,在main中会提示改变class student/定义学生类private:string name, sex, number, CLASS;int chinese, math, english, comprehensive, sum, ave, rank;public:string get_name()/外部接口,查询信息时用到。return name;string get_number()/外部接口,查询信息时用到。return number;int get_chinese()/外部接口,分班级处理时用到。return chinese;int get_math()/外部接口,分班级处理时用到。return math;int get_english()/外部接口,分班级处理时用到。return english;int get_comprehensive()/外部接口,分班级处理时用到。return comprehensive;int get_sum()/总分是排序的依据,在输出信息和排序时会产生sum = chinese + math + english + comprehensive; return sum;int get_ave()ave = (chinese + math + english + comprehensive) / 4;return ave;string get_CLASS()return CLASS;void set_rank(int rank)/对多个学生进行排序时产生产生名次this-rank = rank;void set_Rn(int nsum, int nave, int nrank)/我把总分、平均数和名次称为余项。/这些数据在基本数据录入后会产生。sum = nsum;/提供这个外部接口用于从文件中读取这些数据ave = nave;rank = nrank;friend istream & operator (istream & in, student &cs) /重载插入符,实现输入基本数据in cs.CLASS cs.number cs.name cs.sex cs.chinese cs.math cs.english prehensive;return in;friend ostream & operator (ostream & out, student &cs) /重载提取符,实现格式输出详细信息out cs.CLASS t cs.number t cs.name t cs.sex t cs.chinese t cs.matht cs.english t prehensivet cs.get_sum() t cs.get_ave() t cs.rank t)和提取符()。但是11个数据成员中只有8个是是从键盘输入,所以重载插入符时仅仅实现了8个基本数据的输入。另外3个数据有两个是通过调用get_ave()和get_sum()时由基本数据自动算出并返回给调取位置,另外一个排名rank是在降序排序时产生。所以,在重载提取符时实现了11个数据的格式输出。所以文件中,每个成员有11个数据,通过重载的提取符只能提取8个,另外三个暂时保存在临时定义的sum,ave,rank中,通过对象的成员函数void set_Rn(int nsum, int nave, int nrank)把剩余的三个值对象的数据成员。从而避免从文件中读取数据时出现读取错位的现象。5.程序代码 请注意参考注释#include#include#includeusing namespace std;const int N = 5000;/student sNstatic int count=N;/控制学生的操作数,默认值为N,在main中会提示改变void mima( );/函数的声明void input_student();void rank_down();void save_student();void rwrite_student();void delete_student();void serch_menu();void open_file();void surch_number();void surch_CLASS();void detial_class();void subject_ave();class student/定义学生类private:string name, sex, number, CLASS;int chinese, math, english, comprehensive, sum, ave, rank;public:string get_name()/外部接口,查询信息时用到。return name;string get_number()/外部接口,查询信息时用到。return number;int get_chinese()/外部接口,分班级处理时用到。return chinese;int get_math()/外部接口,分班级处理时用到。return math;int get_english()/外部接口,分班级处理时用到。return english;int get_comprehensive()/外部接口,分班级处理时用到。return comprehensive;int get_sum()/总分是排序的依据,在输出信息和排序时会产生sum = chinese + math + english + comprehensive; return sum;int get_ave()ave = (chinese + math + english + comprehensive) / 4;return ave;string get_CLASS()return CLASS;void set_rank(int rank)/对多个学生进行排序时产生产生名次this-rank = rank;void set_Rn(int nsum, int nave, int nrank)/我把总分、平均数和名次称为余项。/这些数据在基本数据录入后会产生。sum = nsum;/提供这个外部接口用于从文件中读取这些数据ave = nave;rank = nrank;friend istream & operator (istream & in, student &cs) /重载插入符,实现输入基本数据in cs.CLASS cs.number cs.name cs.sex cs.chinese cs.math cs.english prehensive;return in;friend ostream & operator (ostream & out, student &cs) /重载提取符,实现格式输出详细信息out cs.CLASS t cs.number t cs.name t cs.sex t cs.chinese t cs.matht cs.english t prehensivet cs.get_sum() t cs.get_ave() t cs.rank t endl;return out;student();student sN;/N=5000,但是学生的操作数是由count控制void mima() /密码设置与验证模块string mima, mima1;ifstream mimafile(mima.txt);if (mimafile.fail()/检验是否设置过密码cout 您是第一次使用本系统,请设置密码: mima;cout 请再输入一次: mima1;if (mima = mima1)ofstream mimafile;mimafile.open(mima.txt);mimafile mima;cout 密码设置成功! endl;/设置密码成功,会生成密码内容的文件else/当设置密码两次输入不一致,重新设置docout 两次输入不一致,请重新输入: mima;cout 请再输入一次: mima1; while (mima != mima1);ofstream mimafile;mimafile.open(mima.txt);mimafile mima;cout 密码设置成功! endl;else/若之前设置过密码,可以直接进入密码验证模块string mima, mima1;cout 检验您之前设置过密码,请输入密码: mima1;mimafile mima;if (mima != mima1)int i = 2;for (; i 0; i-)cout 密码错误,请重新输入(您还有 i 次机会): mima1;if (mima1 = mima) mimafile.close();break; if (i = 0)exit(0);mimafile.close();elsemimafile.close();return ;void input_student( )/输入学生信息system(cls);cout 请按照下面格式输入 endl 班级t学号t姓名t性别t语文t数学t英语t综合 endl;for (int i = 0; i si;void save_student( )/保存学生信息system(cls);string filename;cout 请输入文件名字: filename;/getline(cin, filename, n);fstream studentfile(filename, ios:out);studentfilecount;/学生的个数也会被保存到文件中,目的是方便文件读取studentfileendl;for (int i = 0; i count; i+)studentfile si;studentfile.close();cout 数据已经成功保存为文件filenameendl;void rwrite_student( )/修改学生成绩信息system(cls);char F;string number;do/用do循环实现持续的修改int i = 0;cout number;for (i = 0; i count; i+)if (number = si.get_number()cout 修改前,学生信息为: endl;cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;cout si;cout 请按照下面格式输入 endl 班级t学号t姓名t性别t语文t数学t英语t综合 si;cout 数据修改成功! = count)cout 查无此人! endl;cout F; while (F != n);void delete_student( )/删除学生信息system(cls);char F,P;string number;doint i = 0;cout number;for (i = 0; i count; i+)if (number = si.get_number()cout 要删除的学生信息为: endl;cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;cout si;cout 是否删除?(输入任意键继续,输入n取消本次操作。) P;if (P != n)for (; i N - 1; i+)si = si + 1;/数据删除过程cout 数据删除成功! endl;count-;/数据删除后,就少了一个,计数变量自减break;cout F; while (F != n);void surch_number( ) /按照学号查找学生成绩信息system(cls);char F;string number;do /用do实现持续删除int i = 0;cout number;for (i = 0; i count; i+)if (number = si.get_number()cout 该学生详细信息为: endl;cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;cout si;cout 查询结束! = count)cout 查无此人! endl;cout F; while (F != n);void surch_CLASS( )/按照班级和姓名实现学生信息的查找system(cls);char F;string name,CLASS;do/用do循环实现持续的查找int i = 0;cout 请输入要查询的学生班级和姓名:;cout namet class endl;cout nameCLASS;for (i = 0; i count; i+)if (name = si.get_name() & CLASS=si.get_CLASS()cout 该学生详细信息为: endl;cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;cout si;cout 查询结束! = count)cout 查无此人! endl;cout F; while (F != n);void detial_class( )/查看班级的详细信息system(cls);char F;string CLASS;do/用do循环实现持续的查看int i = 0, count = 0, chinese = 0, math = 0, english = 0, comprehensive=0,ave=0;cout CLASS;cout 该班级学生的详细情况为: endl;cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;for (i = 0; i count; i+)if (CLASS = si.get_CLASS()cout si;count = count + 1;chinese = chinese + si.get_chinese();math = math + si.get_math();english = english + si.get_english();comprehensive = comprehensive + si.get_comprehensive();ave = ave + si.get_ave();cout 该班一共: count 人。 endl;cout 其中班级平均分为: ave / count endl;cout 语文平均分为: chinese/ count endl;cout 数学平均分为: math/ count endl;cout 英语平均分为: english/ count endl;cout 综合能力平均分为: comprehensive / count endl;cout F; while (F != n);void subject_ave( ) /科目平均数system(cls);int i = 0, chinese = 0, math = 0, english = 0, comprehensive = 0, ave = 0;for (i = 0; i count; i+)chinese = chinese + si.get_chinese();math = math + si.get_math();english = english + si.get_english();comprehensive = comprehensive + si.get_comprehensive();ave = ave + si.get_ave();cout 语文平均分为: chinese / N endl;cout 数学平均分为: math / N endl;cout 英语平均分为: english / N endl;cout 综合能力平均分为: comprehensive / N endl;cout 综合平均分为: ave / N endl;void rank_down( ) /降序排序,用冒泡法实现。system(cls);student s1;char F;int i = 0, j = 0;for (i=0; i count; i+)/排序for (j=0; i + j count - 1; j+)if (sj.get_sum() sj + 1.get_sum()s1 = sj;sj = sj + 1;sj + 1 = s1;for (i = 0; i count; i+) /给名次变量rank赋值si.set_rank(i + 1);cout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 endl;for(i=0; icount; i+)/排列后输出coutsi;cout 输入任意键返回主菜单,输入n结束程序运行。 F;if (F = n)exit(0);void open_file()/打开已有的学生信息文件string filename;char F;coutfilename;ifstream myfile(filename);if (myfile.fail()cout 文件打开失败,请检查输入是否有误或者确认文件是否存在! endl;elsecout 班级t学号t姓名t性别t语文t数学t英语t综合t总分t平均t名次 count;/先读取学生个数,由count控制文件读取for(int i=0; i时,只要输入基本数据myfilesi;myfile sum ave rank;/把这些数据返还给相应的对象si.set_Rn(sum, ave, rank); /通过着过类接口,实现赋值coutsi;myfile.close();cout 输入任意键返回主菜单,输入n结束程序运行。 F;if (F = n)exit(0);void serch_menu()char F;dosystem(cls);int a;cout * endl;cout * * endl;cout * 1.按照学号查询个人 * endl;cout * 2.按照姓名和班级查询个人 * endl;cout * 3.查询班级详细情况 * endl;cout * 4.查询科目平均分 * endl;cout * 5.取消本次操作 * endl;cout * * endl;cout * endl;cout a;switch (a)case 1:surch_number(); break;case 2:surch_CLASS(); break;case 3:detial_class(); break;case 4:subject_ave(); break;case 5:break;default:cout 输入错误,请核对后重新输入 endl; break;cout 是否继续查看数据?(输入任意键继续,输入n取消本次操作。endl如果继续,您将返回到查询菜单。): F; while (F != n);void main_menu()system(cls);int a;cout * endl;cout * * endl;cout * 1.录入学生信息 * endl;cout * 2.降序排序 * endl;cout * 3.保存学生信息 * endl;cout * 4.根据学号修改学生信息 * endl;cout * 5.根据学号删除学生信息 * endl;cout * 6.查寻学生信息 * endl;cout * 7.打开已有学生文件 * endl;cout * 8.退出程序 * endl;cout * * endl;cout * endl;cout a;switch(a)case 1: input_student(); break;case 2: rank_down(); break;case 3: save_student();break;case 4: rwrite_student(); break;case 5: delete_student(); break;case 6: serch_menu(); break;case 7: open_file(); break;case 8: exit(0); break;default:cout 输入有误,请核对后输入! endl; break;int main()mima();coutcount;/输入学生的操作数char F;do /用do循环实现持续输入main_menu();system(cls);cout 是否继续对数据操作?(输入任意键继续,输入n退出。 endl F; while (F != n);return 0;6. 运行环境该程序代码在Windows下的 Visual Studio 2010能够成功编译并正常运行。在Visual C+环境下编译会出现错误,错误是由fstream studentfile(filename, ios:out);造成,原因是Visual C+不支持自定义文件名的文件保存。对计算机硬件要求较低。7.运行结果(1).密码验证模块,第一次运行,设置密码,设置密码后,设置学生个数。密码文件成功创建(2).密码设置成功后进入主页面(3).选择1,录入学生信息(4).以总分为依据降序排序(5).把数据保存到文件,在文件保存时,学生的个数也会被保存到文件中,目的是方便文件读取,先读取学生个数,使文件读取更加精准。检验文件成功保存,第一行的10是学生的个数。(6).修改学生信息修改后继续修改回来,检测修改成功(7).查看学生信息全部科目的平均分(8).删除学生信息(9).第二次进入系统,密码验证(10).打开刚刚保存的文件8.课程设计总结课程设计,对于我们现在只学了些基础的知识的人来说确实是一个不小的挑战,我想对每个人都一样。别人能做到的,我也能做到。其中也经历了不少困惑与不知,但至少我现在做到了,终于战胜了自己对课程设计的恐惧,也收获了程序运行成功的喜悦,有付出,就有收获。通过这学期对C+的学习总结,要把知识运用于这次的课程设计,发现还是有点不足,有点困难,学到用时方恨少,自己学的还不够精,不够深。对于一门技术来说,浅尝辄止是远远不够的。还好通过请教老师同学等各种方式克服了一个又一个的困难。多样化的处理问题,才是成功之道。学习的态度很重要,不懂了就要学着去用不同的方式去获取,补足自己,通过各种各样的方式,学着去请教别人和别人交流,做到不懂就问。相对来说,我的程序更简易,代码相对来说比较少,但却实现了大多数功能。简单易懂可行才是程序设计的本质。通过这次实践,我对编程有了新的理解,编程并不是像大多数人说的那样充满单调,乏味。一件东西的乐趣在于你能去接触去理解。我接触了,我理解了。让所学的运用于生活中,做到灵活运用,学有所成的兴奋是难得的宝贵。我在其中感悟到乐趣了,相信这是我编程高手之路的一个重要转折点。东华理工大学课程设计评分表学生姓名:吴深深 班级:1421810 学号:201420181013课程设计题目:学生成绩管理系统项目内容满分实 评选题能结合所学课程知识、有一定的能力训练。符合选题要求(5人一题)10工作量适中,难易度合理10能力水平能熟练应用所学知识,有一定查阅文献及运用文献资料能力10理论依据充分,数据准确,公式推导正确10能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等10能体现创造性思维,或有独特见解10成果质量总体设计正确、合理,各项技术指标符合要求。10说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰10设计说明书栏目齐全、合理,符号统一、编号齐全。格式、绘图、表格、插图等规范准确,符合国家标准10有一定篇幅,字符数不少于500010总 分100指导教师评语: 指导教师签名: 2015年 6 月 27 日
展开阅读全文