1、0沈阳师范大学科信软件学院小学期课程设计报告(封面模板)课题名称: 学生成绩管理系统 姓 名: 陈俊 学 号: 13008143 专业年级: 2013 级软件工程六班 指导教师: 李晖 2014 年 6 月 27 日1一、学生成绩管理系统需求分析(简要分析与概要设计) (1)完成学生信息某一学期成绩输入 (2)能按照学生的某一科成绩进行升序排序 (3)能够完成学生单科成绩的更改 (4)能够按照学号进行查找 (5)保存和调出文件资料 (6)平均成绩及各科成绩的显示、二、 算法设计(系统功能模块图) 本程序有三大块 main 函数 、sqsq 类(学生顺序表类,顺序表的一个节点存储了一个信息) 、
2、student 类(存储了学生所有的信息,比如学号、姓名、成绩等。 )其中 主函数只对 sqsq 类进行操作,而sqsq 类只对 student 类进行作。即 student 类是 sqsq 类的子对象。主函数sqsq 类Student 类2三、源代码及其分析说明:本程序所有源代码纯属原创,未经允许不得擅自 copy 盗用,违者必究。本程序的源代码能在 VC+6.0 上正确运行。头文件:本程序运用的函数比较多例如:setw()函数,toupper()函数,getch()函数,以及对文件操作的输入(ifstream() )输出(ofstream() )函数,而这一类函数使我们平时没有见过的。而其
3、所在的函数库也有不同。这里我将头部全部给出。#include#include /屏幕操作函数库#include /这是标准函数库#include /这是为了 setw()所定义的#include /这是为了输出保存到外部文件和从外部文件调入学生信息而定义的#include /这是为了对字符串的操作#include#include /为了动态数组而定义的 动态数组可以保证学生的人数不受限制 #define INITSIZE 100 /这是动态数组的初始长度#define INCREMENT 20 /这表示动态数组的增量student 类:Student 类的数据项成员主要是学生的信息,成员函数主
4、要是对学生信息的操作。下面给出全部代码。int temp11=0; /temp 是一个长度为 11 的一维数组 一个数字表示一个学科 其初值都设为 0int lennn=1; /lennn 表示 temp 数组的下标 记住 这里将其设置为起从 1 开始计数int tt=1;class student /学生类private:int num;char name20;struct score /这十门 学科排列顺序即对应的数字是 1 语文、2 数学、3 英语、 4 c语言、 5 数据结构、 6 c+、 7 马克思、8 近代史、9 Java、10 操作系统、int chinese;int math;
5、int english;int cyuyan;int shuju;int cjiajia;int makesi;int history;3int java;int operating;c;float total;float average;static int innum; /innum 表示录入编号 因为它是不断自增 1 的,所以它要设置为静态数据成员(static)int iinnum; /它是录入编号( innum)的备份 是 student 的一个数据项 它的作用是为了能在输出学生信息时能够显示录入编号public:void changeinnum(int x)innum=x;void
6、 changeiinnum(int x)iinnum=x; /接下来的六行分别是对录入编号(iinnum) 、学号(num)名字(name) 。这三个数据成员的值得的获取(get)和改变(change)记住change 也可以当成赋值(set)来用int getiinnum()return iinnum;void changenum(int x)num=x;int getnum ()return num;void changename(char x)strcpy(name,x);char* getname ()return name;void setnum(int x)num=x;void s
7、ettotal(int x)total=x;int getchinese ()return c.chinese; /接下来的二十行是 get(取得)各科的成绩和改变(change )各科的成绩 void changechinese(int x)c.chinese=x;/这十门 学科排列顺序即对应的数字是 1 语文、2 数学、3 英语、 4 c 语言、 5 数据结构、 6 c+、 7 马克思、8 近代史、9 Java、10 操作系统、int getmath ()return c.math;void changemath(int x)c.math=x;int getenglish ()return
8、 c.english;void changeenglish(int x)c.english=x;int getcyuyan ()return c.cyuyan ;void changecyuyan (int x)c.cyuyan =x;int getshuju ()return c.shuju ;void changeshuju (int x)c.shuju =x;int getcjiajia ()return c.cjiajia ;void changecjiajia (int x)c.cjiajia =x;int getmakesi ()return c.makesi ;4void cha
9、ngemakesi (int x)c.makesi =x;int gethistory ()return c.history ;void changehistory (int x)c.history =x;int getjava ()return c.java ;void changejava (int x)c.java =x;int getoperating ()return c.operating ;void changeoperating (int x)c.operating =x;float gettotal ()return total; /下面四行(四个函数)分别是对总分(tota
10、l)和平均分(average)的获取(get)和改变(change)void changetotal(float x)total=x;float getaverage ()return average;void changeaverage(float x)average=x;void input(int a); /单个学生信息的输入函数void output(); /单个学生信息的输出函数char * xuekec(int i); /代表返回学科中文意思函数 void xuekein(int i); /代表学科输入函数int xuekecj(int i); /表示返回学科成绩值函数void x
11、uekechange(int i,int x); /代表改变学科成绩 函数;int student:innum=0; char* student:xuekec(int i) /代表返回学科中文意思函数 switch(i)case 1:return “语文“;case 2:return “数学“;case 3:return “英语“;case 4:return “ C 语言“;case 5:return “数据结构“;case 6:return “ C+“;case 7:return “马克思“;case 8:return “近代史“;case 9:return “Java“;case 10:r
12、eturn “操作系统“;default:return “不知什么“;void student :xuekein(int i) /学科输入函数switch(i)5case 1:cinc.chinese ;break;case 2:cinc.math ;break;case 3:cinc.english ;break;case 4:cinc.cyuyan ;break;case 5:cinc.shuju ;break;case 6:cinc.cjiajia ;break;case 7:cinc.makesi;break;case 8:cinc.history ;break;case 9:cinc
13、.java ;break;case 10:cinc.operating ;break;default:break;int student:xuekecj(int i) /返回学科成绩值函数switch(i)case 1:return getchinese();break;case 2:return getmath ();break;case 3:return getenglish ();break;case 4:return getcyuyan ();break;case 5:return getshuju ();break;case 6:return getcjiajia ();break;
14、case 7:return getmakesi ();break;case 8:return gethistory ();break;case 9:return getjava ();break;case 10:return getoperating ();break;default: return 0;void student:xuekechange(int i,int x) /改变学科成绩 函数switch(i)case 1: changechinese(x);break;case 2: changemath (x);break;case 3: changeenglish (x);brea
15、k;case 4: changecyuyan (x);break;case 5: changeshuju (x);break;case 6: changecjiajia (x);break;case 7: changemakesi (x);break;case 8: changehistory (x);break;case 9: changejava (x);break;6case 10: changeoperating (x);break;default: ;void student:input (int a) /单个学生信息的输入函数int i;innum+;iinnum=innum;co
16、utnumname;for( i=1;ichoose;8switch(choose)case 1: cout=l.sqsize)l.stu=(student*)realloc(l.stu,(l.sqsize+INCREMENT)*sizeof(student);if(!l.stu) couttemplennn;9lennn+;coutflag;while(toupper(flag)!=N lennn-;cout=l.sqsize)l.stu=(student*)realloc(l.stu,(l.sqsize+INCREMENT)*sizeof(student);if( !l.stu) cout
17、tp;i=0;while(l.stui.getnum()!=tpwhile(toupper(choose)=Y);couti;while(jchoose;switch(choose)case 1:coutnu;l.stuj.changenum(nu);coutna; strcpy(l.stuj.getname(),na);coutnu;l.stuj.xuekechange(temp1,nu); /引用对象中的结构体成员是这样引用吗?coutnu;l.stuj.xuekechange(temp2,nu);coutnu;l.stuj.xuekechange(temp3,nu);coutnu;l.s
18、tuj.xuekechange(temp4,nu);coutnu;l.stuj.xuekechange(temp5,nu);coutnu;l.stuj.xuekechange(temp6,nu);coutnu;l.stuj.xuekechange(temp7,nu);coutnu;l.stuj.xuekechange(temp8,nu);coutnu;l.stuj.xuekechange(temp9,nu);coutnu;l.stuj.xuekechange(temp10,nu);coutcflag;while(toupper(cflag)!=Nwhile(toupper(cflag)!=N)
19、;couti;while(jccflag;while(toupper(ccflag)!=Nif(toupper(ccflag)=Y)for(int k=tempp;kflag2;while(toupper(flag2)!=Nwhile(toupper(flag2)!=N);coutchoose;switch(choose)case 1:r=l.len;while(r=1)for(i=r;i=0i=0j-=r;l.stuj+r=tempp;r/=2;17coutchoose;switch(choose)case1:int a;int flag=1;couta;lennn=a;infile.get
20、line (muru,20, );infilee;18muru0=e;infile.getline (muru+1,20, );infilee;muru0=e;infile.getline (muru+1,20, );for(int h=0;he;muru0=e;infile.getline (muru+1,20, );strcpy(muruuh,muru);if(strcmp(muruuh,“语文 “)=0) temph+1=1;else if(strcmp(muruuh,“数学“)=0) temph+1=2;else if(strcmp(muruuh,“英语“)=0) temph+1=3;
21、else if(strcmp(muruuh,“C 语言“)=0) temph+1=4;else if(strcmp(muruuh,“数据结构“)=0) temph+1=5;else if(strcmp(muruuh,“C+“)=0) temph+1=6;else if(strcmp(muruuh,“马克思“)=0) temph+1=7;else if(strcmp(muruuh,“近代史“)=0) temph+1=8;else if(strcmp(muruuh,“Java“)=0) temph+1=9;else if(strcmp(muruuh,“操作系统“)=0) temph+1=10;el
22、se temph+1=100;/学科排列顺序即对应的数字是 1 语文、2 数学、3 英语、4 c 语言、 5 数据结构、 6 c+、 7 马克思、8 近代史、9 Java、10 操作系统if(temph+1=100) coute;muru0=e;infile.getline (muru+1,20, );infilee;muru0=e;19infile.getline (muru+1,20, );while(infilek)stui.changeiinnum(k);coutk;stui.setnum(k);coute;namee0=e; /这里的 e 是用来包含空格的infile.getline
23、(namee+1,10, );stui.changename(namee);coutk;stui.xuekechange(temph,k); /这个函数同时也可以给其数据成员赋值 相当于 setcoutkk;stui.changeaverage(kk);infilek;stui.changetotal(k);i+;cout=l.sqsize)l.stu=(student*)realloc(l.stu,(l.sqsize+INCREMENT)*sizeof(student);if(!l.stu) coute;muru0=e;infile.getline (muru+1,20, );infilee
24、;muru0=e;infile.getline (muru+1,20, );for(int h=0;he;muru0=e;infile.getline (muru+1,20, );infilee;muru0=e;infile.getline (muru+1,20, );infilee;muru0=e;infile.getline (muru+1,20, );while(infilek)stui.changeiinnum(k);coutk;stui.setnum(k);coute;namee0=e; /这里的 e 是用来包含空格的infile.getline(namee+1,10, );stui
25、.changename(namee);coutk;stui.xuekechange(temph,k); /这个 change 函数同时也可以给其数据成员赋值 相当于 set 函数coutkk;stui.changeaverage(kk);infilekk;stui.changetotal(kk);i+;cout=l.sqsize)l.stu=(student*)realloc(l.stu,(l.sqsize+INCREMENT)*sizeof(student);if(!l.stu) coutchoose;switch(choose)case 1:for(i=0;il.stuj+1.getnum
26、()tempp=l.stuj;l.stuj=l.stuj+1;l.stuj+1=tempp;coutchoose;switch(choose)26case 1:s.cls(); s.creat(); break;case 2:s.cls();s.display(); break;case 3:s.cls();s.find(); break;case 4:s.cls();s.change(); break;case 5:s.cls();s.del(); break;case 6:s.cls();s.shellsort();s.display (); break;/采用希尔排序后输出排序后的结果c
27、ase 7:s.cls();s.transferred(); break;case 8:s.cls();s.save(); break;case 0:break; default:coutflag;if(flag=y)f=0;while(f);s.exits();4、程序设计过程及程序测试设计过程从打算做这个题目以来,我就开始着手准备,先在网上找了七八个例题,然后理解 消化 模仿,把它们在我的机器上全部都敲出来一遍。将他们领会贯通之后。整整花了两天半的时间从头到尾将初期版程序完成。将程序完成后,我并没有就此罢手,我知道我的程序仅仅是完成了基本的功能。还有很大的不完善。所以我决定对程序进行改进和
28、升级。主要思考了有以下四个问题。 科目可不可以不写死? 能不能做到不限制存储学生人数? 排序算法还能更高效一些吗? 程序里的数据能够读入读出吗?针对以上的四点问题,我分别做了改进。1、科目可不可以不写死?对于科目不写死,我理解为写成可以选择科目的数量和名称。对此我在程序中定义了十个科目可供选择。这十门 学科排列顺序即对应的数字是 1 语文、2 数学、3 英语、 4 c 语言、 5 数据结构、6 c+、 7 马克思、8 近代史、9 Java、10 操作系统。假设这十门课程是学生大学期间要全部要修完的课程,学生每学期选择几门课程进行学习,学生也可以一学期只修一门课程或者将上面的十门课程一学期修完,
29、这个系统都是支持的。27所以在建立学生信息时有一个选着学生这一学期所修的科目数量和名字的过程。2、能不能做到不限制存储人数?针对该问题,我将原来的静态顺序表(顺序表的一个节点存储了一个学生的信息)改成了动态顺序表。优点有二,第一、顺序表能够“无限”的长,在学生的人数上没有限制。第二、采用动态存储使程序能在需新增存储空间的时候 随时向系统申请内存空间,这样浪费的存储空间就较小。3、排序算法还能更高效么?一开始我用的是起泡排序算法,也是最简单的,但也是效率较低的排序算法。效率较高的排序算法有快速排序和希尔排序(快速排序课堂上讲过) 。我这里采用的希尔排序算法。这个困难不大,只要理解了算法思想,就能
30、把它搬到程序中来。4、程序里的数据能够读入读出吗?这个问题也是我花的时间最多的一个问题。首先我们课堂上没有涉及过这种知识点。其次对于对文件的输入和输出方法。我最初选择在是书上看到的 c 语言输入输出方法。但是觉得不够好(或者说觉得不能达到我想要的效果)所以 我还是选择使用 c+的输入输出方式。我完全是从网上找出来的方法。然后结合者我的现状不断的调试,不断的调试,不断的调试然后才符合了我的预期。只要是针对本程序所保存的文件或者是排列符合格式的文件,本程序绝对能无缝的调入进来。对其进行查找 删除 修改 排序等等操作。虽然只有上述四点,可我感觉程序完全是脱胎换骨,几乎每个角落都进行了修改。我还在一些
31、细节的地方进行了修改,例如学号是唯一的 id,它不能出现重复,它不能出现为零等情况。因为我之前参考他人的程序时,发现了一个问题。对于不太熟练的人,打开他人的 exe 程序后,不知道怎么操作才能使程序运行起来。所以我在程序中加了很多人性化的操作,和很多的引导语句。方便陌生的人也能使用我的程序。后来虽然完成的较慢和较艰难,但是很庆幸,我完成了!程序测试:1.首先你看到的是非常美丽的菜单界面,界面简洁明了282.输入数字键 1,接下里你会进入同样有趣的界面,这里你会有两个选项,你根据它的提示来进行选择。当你第一次进入时你要选第二项,第一个选项是留着以后你想再次在本程序中添加学生信息时用。3.接下来是更有意思的界面,请仔细的看清楚程序的引导说明,首先输入学生所修的课程对应的数字,然后按 y 继续,按 n 结束再选择科目。学科选定后接下来就是输入学生的信息啦!294.输入学生成绩是一定要仔细的看上面的录入规则 ,如图将学号值为零后将会退出录入,回到菜单界面