C++课程设计报告一、课程设计题目:学生成绩管理系统二、课程设计目的:1.了解并掌握c++与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所具备的科学工作方法和作风。
三、课程设计要求:1.设计的题目要求达到一定的工作量(300行以上代码),并具有一定的深度和难度。
2. 编写出课程设计报告书,内容不少于10页(代码不算)。
四、需求分析:用数组或链表数据结构完成一个学生成绩管理系统,此系统的具体功能要求如下:(1)学生信息录入功能1)用户从键盘输入每个学生的信息:学号、姓名、性别、英语、数电、体育、毛概四门课成绩。
2)可插入一个或多个学生信息到当前编辑的班级数据中。
3)可删除一个或多个学生信息。
(2)文件保存功能1)学生信息每一班存为一个数据文件,数据文件可在程序中打开、编辑和重新保存。
2)用户输入学生信息可随时保存数据文件。
(3)文件打开功能1)程序只能对当前打开的数据文件进行编辑。
(4)查询功能1)浏览所有学生信息;2)按学号查询学生信息;3)按姓名查询学生信息;4) 查询任何一个学生总成绩和平均成绩;(5)报表输出功能1) 按学号输出一个班学生信息:学号、姓名、性别、英语、数电、体育、毛概和总成绩,到屏幕和文件。
2) 按总成绩输出从高到低输出学号、姓名信息。
注:以上功能以菜单形式供用户使用,并有一定的容错功能。
五.程序的功能设计学生信息管理功能框图学生信息输入学生信息显示学生信息查询学生信息删除按排序顺序显示按姓名查询按序号查询按姓名删除信息按序号删除信息插入学生信息插入新的学生信息保存学生信息将学生信息保存在一个自定义文件夹中读取学生信息从自定义文件夹中读取学生信息5.1.程序的概要设计:整体框架:整个学生成绩管理系统采用链表作为基本数据结构,创建一个类student用于保存学生的数据且是链表中的一个节点。
主函数通过switch语句来根据用户的需要连接各个模块,以实现用户的需要。
模块基本介绍:1.用户输入模块在此模块中,用户将根据菜单提示结合自己的需求输入一个0~9的值,来实现一定的功能。
2.学生信息录入模块此模块可以让用户从键盘输入每个学生的信息:学号、姓名、性别、英语、数电、体育、毛概四门课成绩。
用户可插入一个或多个学生信息到当前编辑的班级数据中。
用户可删除一个或多个学生信息。
3.文件保存功能模块用户在确定以录入的成绩无误之后,可以将学生信息以每一班为单位存为一个数据文件。
用户输入的学生信息可随时保存数据文件。
4.文件打开功能模块用户可以用此模块将数据文件在程序中打开、编辑,程序只能对当前打开的数据文件进行编辑。
5.查询功能模块在此模块里,用户可实现以下操作:1.浏览所有学生信息;2.按学号查询学生信息;3.按姓名查询学生信息;4.查询一个班每个人的总成绩和平均成绩; 5)进行成绩的统计分析:包括总人数,每门课的最高成绩、最低成绩、平均成绩。
报表输出功能模块在此模块中,用户可以浏览所有学生的信息,或者可以按学号输出一个班学生信息:学号、姓名、性别、英语、数电、体育、毛概、平均成绩和总成绩,到屏幕和文件。
也可以按总成绩输出从高到低输出学号、姓名信息。
5.2.程序的总体设计主要功能模块的算法设计思路:1. 用户输入模块设计提示用户输入一个0~9的值,并存储在一个整型变量p中。
2. 学生信息录入模块设计在主函数中定义student类的50个学生指针对象s[50],然后直接输入学生信息,来进行成绩的录入功能。
成绩修改功能,可以根据姓名或学号进行查询并修改相应的课程的成绩。
search函数根据姓名查找,search1函数根据学号进行查找。
因为学号和姓名,都是存储在字符数组中的,所以都是通过字符串的比较进行查找的。
然后根据整形参数进行对应的课程成绩的修改。
成绩删除功能,也是可以根据姓名或学号进行删除,查询的算法和成绩修改功能的查询方法是一样的,当找到要删除的节点时,因为节点都是在堆内存中保存的,所以可以直接delete掉,并将前一个节点的next指针指向被删掉的节点的next指针所指向的节点。
3. 文件保存功能模块先提示用户输入保存文件的文件名及班级名称。
文件的前两行分别是班级名称和成绩单的开头,然后通过ofstream变量output来进行学生信息的输出,一项一项的输出,并设定格式,直到输出节点为NULL为止,之后关闭output。
4. 文件打开功能模块先提示用户输入要打开的数据文件的名称,然后通过一个ifstream变量input来进行文件操作。
首先判断文件是否存在,如果不存在则输出"File does not exist",并跳出switch语句。
文件存在的话,则可以进行数据的存入了。
因为数据文件具有固定的格式,即开头两行是班级名称和表头,则可以先用两次input.getline(temp,80);语句来将input设置到第三行,此时可以将数据通过input 读入链表中。
先用input.eof()判断文件中是否有数据,若有数据,则进行数据的读入,直到文件结束。
5. 查询功能模块可以根据姓名或学号进行查找,搜索方法和前几个模块相同。
通过outstu1(char *n)和outstu(char *n)来进行输出。
总成绩和平均成绩也通过学生成绩的输出一并输出了。
通过函数scanall()来浏览所有学生的信息。
5.3.程序的调试分析调试是整个程序编写过程中十分重要也是很困难的一部分,在这个过程中用了不少的时间进行程序的调试,在调试过程中遇到的相关问题如下:一、语法错误1、语句的最后忘记了加上“;”,使程序发生错误。
2、把“<<”与“>>”写反,以及字符与字符串的操作问题,这些是比较简单的错误,很容易分辨出来,并改正之。
3、函数的返回值问题,也是比较容易找出并解决的问题。
二、逻辑错误1、文件的写入与读出,刚开始对文件的操作不太明白,一致不能很好的操作文件,其中最大的问题是对已存在的文件读取问题,通过“显示全部学生成绩”将数据从文件中读取,可是在使用过程中总是出现读出错误,出现乱码。
2、内存的分配问题,这也是困惑了我好久的问题。
对于我们初学者来说对内存的分配和释放问题是比较抽象和模糊的难题,本来使用链表的方式存储数据,然而待到排序时出现了交换数据困难的问题,以及分配空间繁琐释放空间不及时的问题,造成空间浪费使得程序运行效率低的问题。
因此最后采用了顺序存储记录的方式,这样就能改变前述问题。
整个调试过程中主要是这么几个问题,其余的是一些小问题,很容易的就调试出来了。
5.4.程序的测试结果1.主界面:运行程序时有一个欢迎界面,让用户能够进行操作,如图1—1图1—12.输入数据:用户选择输入数据操作后,能够输入学生信息,并且能按需求输入多个,如图1—23.输出所有学生成绩:4.增加数据:5.删除学生信息:6.查询学生成绩:(1).按姓名查询:(2).按学号查询:7.按总分高低排序:8.保存文件:六.用户使用说明:用户运行程序后进入系统主界面,在主界面用户可以打开或者新建数据文件。
用户新建或者打开文件要符合操作系统的要求,如果用户打开不存在的文件,那么系统将按照用户打开的文件名作为新的数据文件名,并对其进行相关操作。
本系统同时只能对一个数据文件进行相关操作,不能同时打开多个数据文件,其类似于单用户操作系统。
当用户指定当前文件后可对其进行显示,插入,删除,修改,计算平均分等相关功能。
用户在操作过程中可随时对当前文件进行保存到文件操作,以防止修改的数据丢失。
操作完当前文件后,用户可以关闭该文件,在不退出本系统的前提下另行打开或者新建数据文件对其进行相关操作。
七.课程设计总结:一个星期的课程设计,虽然有些疲劳和困倦,但带给我很多的收获。
C++已经学了一个学期了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。
对这些知识也有了更深的理解和很好的掌握。
也有很多理论上说得过去的代码,但到了实际操作,却是行不通的。
这种困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。
只能避过这些方法,换方法实现。
在课程设计之前,因为有了综合实验的经验与教训,明白了写代码这一步是非常重要的,因为当你把代码输入电脑,并用编译器将其运行,发现通过不了,再来检查找出问题,这是一件非常辛苦的事情,也很浪费时间。
于是在课程设计的时候,我花了两天的时间来规划与写代码,将要实现的内容分析清楚,才把代码输入电脑。
我觉得写程序,应该先找到该程序中的核心地方,用多种方法来实现该核心,这才可能避免等到发现逻辑上或者编译器不支持上的错误,才来想补救的措施,这样花费时间在想补救措施是很不值得的。
此次任务的完成,也体现出同学之间的团结精神。
实践是检验真理的唯一标准。
没有实践,就不会发现和深刻体会它的真实所在。
只有通过检验的真理,在自己的心里,才会认可它的真实性。
面向对象程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。
八.附录(源代码):#include<iostream.h>#include<string.h>#include<fstream.h>#include<stdlib.h>#include<iomanip.h>class student{private:char name[4]; //姓名char xibie[8];char banji[4];double cpro,english,math,sport,maogai,allscore,average;//课程int order, number; //名次,学号public:student(){}student(char n[4],int nu,double cc,double eng,double ma,double sp,double mao,double as,double av){strcpy(name,n);number=nu;cpro=cc;english=eng;math=ma;sport=sp;maogai=mao;allscore=as;average=av;}friend void main();};void main(){double allscore;double average;cout<<" 欢迎使用学生管理系统"<<endl;cout<<" ******************************************"<<endl;cout<<" **** 学生成绩管理系统****"<<endl;cout<<" ******************************************"<<endl;cout<<" 0、输入数据"<<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<<" 9、退出系统"<<endl;cout<<"=========================================="<<endl;cout<<" 选择0-9数字进行操作"<<endl;cout<<" =============制作人:李伟计本093================"<<endl;cout<<"=============================09408100329=========="<<endl;char p;char w;student s[50]; //指针对象,最多存50个学生数据ofstream *file[50]; //负责对文件插入操作int i=0;int j=0;int flag=0;do //flag判断输入是否有效{cin>>p;if((p>='0'&&p<='9'))flag=1;elsecout<<" 指令错误!请重新输入:"<<endl;}while(flag==0);do{switch(p) //接收功能选项{case '0': //输入数据{char c;char name[4];int number;char xibie[8];char banji[4];double cpro,english,math,sport,core,maogai;do{cout<<endl<<" 姓名:";cin>>name;cout<<endl<<" 学号:";cin>>number;cout<<endl<<" 系别:";cin>>xibie;cout<<endl<<" 班级:";cin>>banji;cout<<endl<<" C++成绩:";cin>>cpro;cout<<endl<<" 英语成绩:";cin>>english;cout<<endl<<" 数电成绩:";cin>>math;cout<<endl<<" 体育成绩:";cin>>sport;cout<<endl<<" 毛概成绩:";cin>>maogai;cout<<endl;{allscore=cpro+english+math+sport+maogai;}cout<<" 总成绩:"<<allscore<<endl;{average=(cpro+english+math+sport+maogai)/5;}cout<<" 平均成绩:"<<average<<endl;file[j]=new ofstream("D:\student.txt",ios::ate);*file[j]<<" 姓名"<<name<<" 学号"<<number<<" C++成绩"<<cpro <<" 英语成绩"<<english<<" 数电成绩"<<math<<" 体育成绩"<<sport<<" 毛概成绩"<<maogai<<"总成绩"<<allscore<<"平均成绩"<<average<<endl;j++;s[i]= student(name, number,cpro,english,math,sport,maogai,allscore,average);i++;cout<<" 数据输入成功,想继续输入吗(y/n):";cin>>c;cout<<endl;do{if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}elseflag=1;}while(flag==0);}while(c=='y');break;}case '1': //增加数据{char name[20];int number;double cpro,english,math,sport,maogai;char c;do{cout<<" 请输入您要增加的学生的姓名:";cin>>name;cout<<endl<<" 学号:";cin>>number;cout<<endl<<" C++成绩:";cin>>cpro;cout<<endl<<" 英语成绩:";cin>>english;cout<<endl<<" 数电成绩:";cin>>math;cout<<endl<<" 体育成绩:";cin>>sport;cout<<endl<<" 毛概成绩:";cin>>maogai;cout<<endl;{allscore=cpro+english+math+sport+maogai;}cout<<" 总成绩:"<<allscore<<endl;{average=(cpro+english+math+sport+maogai)/5;}cout<<" 平均成绩:"<<average<<endl;file[j]=new ofstream("d:\student.txt",ios::ate);*file[j]<<" 姓名"<<name<<" 学号"<<number<< " C++成绩"<<cpro<<" 英语成绩"<<english<<" 数电成绩"<<math<<" 体育成绩"<<sport<<" 毛概成绩"<<maogai<<" 总成绩"<<allscore<<" 平均成绩"<<average<<endl;j++;s[i]= student(name, number,cpro,english,math,sport,maogai,allscore,average);i++;cout<<" 数据输入成功,想继续数入吗(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}}while(c=='y');break;}case '2': //修改数据{char name[20];int nu;double cc,eng,ma,sp,l,hb,mao,as,av;flag=0;char c;if(i==0){cout<<"系统中找不到这个学生";}do{cout<<" 请输入您要修改的学生的姓名:";cin>>name;cout<<endl;for(int h=0;h<i;h++) //h纪录要修改学生的位置{if(strcmp(name,s[h].name)==0){flag=1;cout<<" 新的学号:";cin>>nu;cout<<endl<<" C++成绩:";cin>>cc;cout<<endl<<" 英语成绩:";cin>>eng;cout<<endl<<" 数电成绩:";cin>>ma;cout<<endl<<" 体育成绩:";cin>>sp;cout<<endl<<" 毛概成绩:";cin>>mao;{as=cc+eng+ma+sp+mao;}cout<<endl<<" 总成绩:"<<as;{av=as/5;}cout<<endl<<" 平均成绩:"<<av;cout<<endl;s[h].cpro=cc;s[h].english=eng;s[h].math=ma;s[h].sport=sp;s[h].number=nu;s[h].maogai=mao;cout<<" 数据修改成功!"<<endl;}}if(flag==0){cout<<" 您要修改的学生本来就不存在!请检查重新输入!"<<endl;}cout<<" 想继续修改吗(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}}while(c=='y');break;}case '3':cout<<" 请输入你要删除的姓名:";char m[20];cin>>m;for(int a=0;a<i;a++){if(strcmp(s[a].name,m)==0){int w;w=a;for(w;w<i;w++){s[w]=s[w+1];i=i-1;}cout<<" 删除成功!"<<endl;}}break;}case '4': //按姓名查询{char n[20];int j=0;char c;if(i==0){cout<<" 管理系统中没有输入数据!"<<endl;break;}do{int flag=0;cout<<" 请输入你要查询的学生姓名:";cin>>n;cout<<endl;for(int j=0;j<i;j++)if(strcmp(n,(s[j]).name)==0){flag=1;cout<<" 您要查询的学生是:"<<(s[j]).name<<endl;cout<<(s[j]).name<<"的成绩是: "<<" C++: "<<(s[j]).cpro<<" 英语: "<<(s[j]).english<<" 数电:"<<(s[j]).math<<" 体育:"<<(s[j]).sport<<" 毛概"<<(s[j]).maogai<<" 总成绩"<<(s[j]).allscore<<" 平均成绩"<<(s[j]).average<<endl;}}if(flag==0)cout<<" 对不起!您要查询的学生不存在!"<<endl;cout<<" 您想继续查询吗?(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl;cin>>c;}}while(c=='y');break;}case '5': //按学号查询{int n,j=0;char c;if(i==0){cout<<" 管理系统中没有输入数据!"<<endl;break;}do{int flag=0;cout<<" 请输入你要查询的学生的学号:";cin>>n;cout<<endl;for(int j=0;j<i;j++){if(s[j].number==n){flag=1;cout<<" 您要查询的学生是:"<<(s[j]).name<<endl;cout<<(s[j]).name<<"的成绩是: "<<" C++:"<<(s[j]).cpro<<" 英语:"<<(s[j]).english<<" 数电:"<<(s[j]).math<<" 体育:"<<(s[j]).sport<<" 毛概: "<<(s[j]).maogai<<"总成绩:"<<(s[j]).allscore<<"平均成绩:"<<(s[j]).average<<endl;}}if(flag==0)cout<<" 对不起!您要查询的学生不存在!"<<endl;cout<<" 您想继续查询吗?(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl;cin>>c;}}while(c=='y');break;}case '6': //输出{cout<<" 本系统所有学生数据如下:"<<endl;if(i==0)cout<<" 管理系统中没有输入数据!"<<endl;cout<<"姓名学号c++ 英语数电体育毛概总成绩平均成绩"<<endl;for(int k=0;k<i;k++){cout<<s[k].name<<setw(7)<<s[k].number<<setw(4)<<(s[k]).cpro<<setw(5)<<(s[k]).english<<setw(5)<<(s[k]).math<<setw(4)<<(s[k]).sport<<setw(5)<<(s[k]).maogai<<setw(6)<<s[k].allscore<<setw(10)<<(s[k]).average<<setw(7)<<endl;}break;}case'7':{student temp;for(int t=0;t<i;t++)for(int k=t+1;k<i;k++)while (s[t].allscore<s[k].allscore){temp=s[t];s[t]=s[k];s[k]=temp;}cout<<"已经排好序了,是否需要输出(y/n):";char yn;cin>>yn;while(yn!='y'&&yn!='n'){cout<<"操作错误!!!请重新输入:";cin>>yn;}if(yn=='y'){cout<<"所有学生的成绩按总分从高到低的排名是:"<<endl;cout<<" 本系统所有学生数据如下:"<<endl;if(i==0)cout<<" 管理系统中没有输入数据!"<<endl;cout<<"姓名学号c++ 英语数电体育毛概总成绩平均成绩"<<endl;for(int k=0;k<i;k++){cout<<s[k].name<<setw(7)<<s[k].number<<setw(4)<<(s[k]).cpro<<setw(5)<<(s[k]).english<<setw(5)<<(s[k]).math<<setw(4)<<(s[k]).sport<<setw(5)<<(s[k]).maogai<<setw(6)<<s[k].allscore<<setw(10)<<(s[k]).average<<setw(7)<<endl;}}break;}case'8':{cout<<" 保存成功!"<<endl;break;}case'9'://退出{exit(0); cout<<"Bye bye!"<<endl;}}cout<<" 您想继续进行其他操作吗?(y/n):";int flag=0;do{cin>>w;cout<<endl;if(w!='y'&&w!='n')cout<<" 指令错误!请重新输入!"<<endl;elseflag=1;}while(flag==0);if(w=='y')cout<<" 请输入操作代码:0 输入数据"<<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<<" 9 退出系统"<<endl;cin>>p;}while(w=='y');}。