您好,欢迎访问三七文档
0目录1、需求分析……………………………………………………………………………(2)1.1问题描述…………………………………………………………………(2)1.2基本要求…………………………………………………………………(2)2、概要设计………………………………………………………………………………(2)2.1数据结构…………………………………………………………………(2)2.2程序模块…………………………………………………………………(2)2.3各模块之间的调用关系及算法设计……………………………………(3)3、详细设计………………………………………………………………………………(4)4、调试与分析…………………………………………………………………………(11)4.1程序调试…………………………………………………………………(11)4.2数据分析…………………………………………………………………(14)5、用户手册……………………………………………………………………………(14)5.1运行环境…………………………………………………………………(14)5.2执行文件…………………………………………………………………(14)6、参考文献……………………………………………………………………………(15)7、心得体会……………………………………………………………………………(15)8、小组成员任务分配及工作进度安排…………………………………………(16)11、需求分析在生活中,特别是在学校,我们经常要对学生的考试成绩进行处理,因此,设计一个统计学生成绩的程序是非常有用的。在此程序中,用线性表和快速排序函数实现。算法思想如下:建立一个存放学生信息的线性表,手动输入学生信息,将其存放在线性表中相应位置,用一个QSort()函数对学生成绩进行快速排序,控制排序方式(按总分排序)排序后用output()函数输出。其中需注意的是:(1)考生成绩手动输入。(2)分数相同名次相同。(3)对输出格式进行控制,使输出整齐。(4)可以打印成绩。保存到文本文档。1.1问题描述给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。对学生的考试成绩进行有关统计,并打印统计表。1.2基本要求(1)按总数高低次序,打印出名次表,分数相同的为同一名次;(2)按名次打印出每个学生的学号、姓名、总分以及各科成绩。2概要设计.2.1程序设计组成框图Number学号域Name姓名域Fen成绩域N名次域22.2各模块之间的调用关系及算法设计如图,main()函数调用了六个子函数,screen()、input()、QSort()、ranking()、output()、savefile()。其中screen();显示input()把手动输入的学生成绩建立一个线性表。Sort()对数据进行排序,它调用了一个子函数QSort()实现学生成绩的排序,,而QSort()又调用了Partition(),枢轴函数。ranking()排名次函数output()用来输出排序后的学生成绩表。savefile()保存数据2.3函数及变量说明:input()为输入学生信息函数,用来输入各个学生的学号,姓名,各科成绩,学生人数由自己定,利用for语句来输入相关信息,最后在输出所输入的学生信息。Partition()为枢轴函数,交换顺序表L中子表stu[low..high]的记录,枢main()input()Sort()QSort()Partition()screen()ranking()output()savefile()3轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它。voidQSort()快速排序函数,此函数中调用了枢轴函数intPartition(),对顺序表L中的子序列L.r[low..high]作快速排序。voidSort()为对数据进行排序的函数,此函数中调用了快速排序函数,对数据进行总体的排序,用在主函数中,输入信息后,对总成绩进行排序。voidranking()为排名次函数,利用for()对每个学生名次进行定义,同时总分相同的学生名次相同。dayin()为实现打印学生成绩单的函数。voidsavefile()保存数据voidoutput()为输出函数,用cout对每个学生的信息进行输出,并进行格式控制,使输出对齐。main()为主函数,其中定义了一个新的线性表,调用函数进行学生信息的创建及分数排序,利用switch语句调用以上函数实现各个菜单的功能。3、详细设计(1)主函数:intmain(){screen();sqListx;//新x=input();x=input();floati,j,k,m,n;for(intt=0;tx.num;t++)//定义总分,并设置权值{i=x.stu[t+1].fen[0]*0.7;4j=x.stu[t+1].fen[1]*0.7;k=x.stu[t+1].fen[2]*0.7;m=x.stu[t+1].fen[3]*0.3;n=x.stu[t+1].fen[4]*0.3;x.stu[t+1].fen[5]=i+j+k+m+n;}sort(x,5);ranking(x,0,5);output(x);savefile(x);return0;}(2)存储结构structstudent{charnumber[15];//学号域charname[100];//姓名域floatfen[6];//成绩域(fen[0]为语文成绩fen[1]为数学成绩fen[2]为英语成绩fen[3]为英语成绩fen[4]为毛概成绩fen[5]为体育成绩fen[6]为总分)intn;//名次域};structsqList5{studentstu[maxsize+1];//存放学生信息intnum;//存放学生人数};(3)创建学生信息函数sqListinput()//创建学生信息{sqLista;inti;cout请输入学生人数:endl;cina.num;for(i=1;i=a.num;i++)//输入每个学生的三门成绩{cout请输入第i个学生的学号和姓名:endl;cina.stu[i].number;cina.stu[i].name;coutendl;cout请输入第i学生的语文、数学、英语、毛概、体育成绩endl;cina.stu[i].fen[0]a.stu[i].fen[1]a.stu[i].fen[2]a.stu[i].fen[3]a.stu[i].fen[4];6coutendl;}returna;}(4)排序函数(快速排序)intPartition(sqList&L,intlow,inthigh,inti)//枢轴函数{//交换顺序表L中子表stu[low..high]的记录,枢轴记录到位,并返回其//所在位置,此时在它之前(后)的记录均不大(小)于它。doublepivotkey=L.stu[low].fen[i];//用子表的第1个记录作初始枢轴记录L.stu[0]=L.stu[low];//将枢轴记录保存到[0]while(lowhigh)//未分类的区间大于0{//从表的两端交替地向中间扫描while(lowhigh&&L.stu[high].fen[i]=pivotkey)//高端记录的关键字大于枢轴关键字--high;//高端向低移,继续比较L.stu[low]=L.stu[high];//将比枢轴关键字小的记录移到低端,枢轴在[0]不动while(lowhigh&&L.stu[low].fen[i]=pivotkey)//低端记录的关键字小于枢轴关键字++low;//低端向高移,继续比较7L.stu[high]=L.stu[low];//将比枢轴关键字大的记录移到高端,枢轴在[0]不动}L.stu[low]=L.stu[0];//枢轴记录到位returnlow;//返回枢轴位置}voidQSort(sqList&L,intlow,inthigh,inti)//快速排序函数{//对顺序表L中的子序列L.r[low..high]作快速排序。intpivotloc;if(lowhigh)//子序列长度大于1{pivotloc=Partition(L,low,high,i);//将L.r[low..high]按关键字一分为二,pivotloc是枢轴位置QSort(L,low,pivotloc-1,i);//对关键字小于枢轴关键字的低子表递归快速排序QSort(L,pivotloc+1,high,i);//对关键字大于枢轴关键字的高子表递归快速排序}}8voidsort(sqList&L,inti)//对数据进行排序{QSort(L,1,L.num,i);}voidranking(sqList&L,inti,intj)//排名次函数{for(intk=L.num;k0;k--){L.stu[k].n=L.num-k+1;//排名次if(L.stu[k].fen[j]==L.stu[k+1].fen[j]){L.stu[k].n=L.stu[k+1].n;//分数相同的同学名次相同}}}(5)输出函数voidoutput(sqListlist)//输出函数{cout****************************************************\n;cout学号姓名语文数学英语毛概体育总分名次\n;9for(intk=list.num;k0;k--){coutsetw(7)list.stu[k].numbersetw(7)list.stu[k].namesetw(7)list.stu[k].fen[0]setw(7)list.stu[k].fen[1]setw(7)list.stu[k].fen[2]setw(7)list.stu[k].fen[3]setw(7)list.stu[k].fen[4]setw(7)setw(7)list.stu[k].fen[5]setw(7)list.stu[k].nendl;}}(6)保存函数voidsavefile(sqListlist)//保存数据{fstreamoutfile;outfile.open(student.txt,ios::out);outfile*******************************************************************\n;outfile学号姓名语文数学英语毛概体育总分名次\n;for(intk=list.num;k0;k--){outfilesetw(7)list.stu[k].numbersetw(7)list.stu[k].namesetw(7)list.stu[k].fen[0]setw(7)list.stu[k].fen[1]10setw(7)list.stu[k].fen[2]setw(7)list.stu[k].fen[3]setw(7)list.stu[k].fen[4]setw(7)list.stu[k].fen[5]setw(7)list.stu[k].nendl;}outfile.close();coutendl;}4、调试与分析4.1程序调试打开visualc++6.0后,运行程序后弹出窗口如下:11以学生人数4为例,分别输入四位学生的学号、姓名、成绩后排序排序结果如下:12输入完毕后,回车得到如下表:13打印文档如下:4.2数据分析由以上可知,本程序实现了题目的要求,并且把数据存到一个txt文档里。该程序设置了两个结构,一个是存储学生的人数,一个存储学生的信息成绩。对
本文标题:统计成绩
链接地址:https://www.777doc.com/doc-4472212 .html