数据结构课程设计报告-学生成绩管理系统.docx
学院:职业技术学院专业:计算机科学与技术姓名:学号:()62002110311班级:计科()61班实习性质:课程设计实习地点:蔡家关校区国合楼二楼计算机房指导教师:兽茴成绩:学生成绩管理系统设计一、需求分析随着社会的开展,学校的规模不断的扩大,日常教学活动中提取相关信息,以反映教学情况。传统的手工操作方式,易发生数据丧失,统计错误,劳动强度高,且速度慢。使用计算机可以高速,快捷地完成以上工作。在计算机联网后,数据在网上传递,可以实现数据共享,防止重复劳动,标准教学管理行为,从而提高了管理效率和水平。学生成绩管理系统以计算机为工具,通过对学生成绩管理所需的信息管理,把管理人员和老师从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学方案的制定执行和教学质量的监督检查,从而全面提高教学质量。信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。计算机虽然与人类的关系愈来愈密切,还有人由于计算机操作不方便继续用手工劳动。为了适应现代社会人们高度强烈的时间观念,学生成绩管理系统软件为教学办公室带来了极大的方便。该软件是以C语言为实现语言,其功能在系统内部有源代码直接完成。通过操作目录,管理者和老师可以了解本软件的根本工作原理。管理者和老师只需输入一些简单的汉字、数字,即可到达自己管理学生成绩的目标。在学生成绩管理系统中,需要从大量的日常教学活动中提取相关信息,以反映教学情况。传统的手工操作方式,易发生数据丧失,统计错误,劳动强度高,且速度慢。使用计算机可以高速,快捷地完成以上工作。在计算机联网后,数据在网上传递,可以实现数据共享,防止重复劳动,标准教学管理行为,从而提高了管理效率和水平。通过本学生成绩管理系统,可以从一下几个方面减少老师的工作负担和提高学校的管理效率,实现学校的信息化和自动化。1.应用学生成绩管理系统,把老师从繁杂的学生成绩了登记分数、统计分数、学生排名等等的工作职工解脱出来,把更多的时间和精力用来提高教学质量和学生的辅导工作上,提高学生的学生效率和成绩。2.应用学生成绩管理系统,可以学校教务处的工作效率,有效的管理学校学生的成绩,更加科学的统计管理学生成绩。学生成绩管理适用各学校的教学老师用于班上的学生成绩了登录、统计和对班上学生成绩的排名。学生管理系统以计算机为工具,通过对学生成绩管理所需的信息管理,把老师从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学方案的制定执行和教学质量的监督检查,从而全面提高教学质量。二、概要设计数据结构形式:链表+二叉排序树。以成绩为节点建立二叉排序树,以学生为节点,以链表形式接在成绩节点之后。功能:查找(按学号、成绩、姓名)、插入、删除、统计(统计平均成绩、,统计分数段的人数。)学生成绩管理系统是以计算机为工具,通过对教务管理所需的信息管理,把管理人员从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学方案的制定执行和教学质量的监督检查,从而全面提高教学质量。软件开发的意图为便于学校和老师的管理,方便查看有关学校及学生的情况。如教学老师对学生成绩的修改、删除、查找、添加、总分数的统计、总分排名,单科排名等。成绩管理系统是面向中学的管理系统,其目的是提高老师对学生的科学化管理。本软件针对学校的管理现状和要求,从理论和应用的角度论述了学生成绩管理信息系统的特点、功能、设计思路。本系统主要包括五个模块:学生成绩录入、学生成绩查询、学生成绩的添加、修改、统计学生的总成绩、并对其进行排名、求每个学生的平均分等这八个模块根本实现设计。1.定义头文件,包括标准输入输出函数库、标准函数库、字符串函数库、屏幕操作函数库#include"stdio.h"#include"stdlib.h"#include“string.hSinclude"conio.h"defineHEADERl学生成绩ndefineHEADER21学号姓名C|数学|英语|总分|平均|名次n#defineHIADIR3ttdefine FORMAT%-10s%-15s%4d%4d%4d%4d%.2f%4dnEND#defIne2.建立查询菜单,方便软件使用者根据根据自己的需要进行操作:voidmenu()system(zzclszz);cprintf(学生成绩管理系统n);cprintf(cprintfC*1输入成绩2删除成绩*n)CPrintf("*3查询成绩4修改成绩*n")cprintfC*5插入成绩6统计成绩*nzz)cprintfC*7名次排名8保存成绩*n)cprintfC*9显示成绩0退出系统*n)CPrintf("*n");CPrintf(本软件由张进,杨秀玲共同设计,欢送使用!n);typedefstructstudent/*标记为student*/charnum10;*学号*/charname15;*姓名*/intCgrade;*C语言成绩*/Intmgrade;*数学成绩*/Integrade;/*英语成绩*/Inttotal;/*总分*/floatave;intmingci;*平均分*/*名次*/);4.由于是动态内存分配空间的数据操作,而非文件I/O,那么在程序一开始的时候首先得建立数据,返回头成绩节点。于是首先要有一个创立数据的函数:CreatOo分析要求,可以得到一些初步的功能函数:插入函数InSert()、查找函数SearCh()(2种:按学号、按姓名)、删除函数DeIete()、输出学生信息函数PrintC。1. Creat0:以二叉排序树的定义建立树并返回根节点,在输入学生信息的同时判断是否已有该成绩节点,假设有那么直接链在该成绩的学生节点之后;假设无,开辟新空间给此成绩节点,并把学生节点链在其后。2. Insert():方法和CreatU一样,只要指明根节点就可以了。3. Search():按成绩:只要按二叉排序树的定义就可以找到成绩,然后遍历其成绩节点后的学生链按学号:遍历二叉排序树的方法。按姓名:遍历二叉排序树的方法。4. Delet0:在查找成绩的时候就可以返回该成绩的节点指针和其父节点指针,那么可以根据二叉排序树的删除定义进行操作。5. Print():遍历二叉排序树的方法。6. TongjiO:统计该班的总分第一名和单科第一,和各科不及格人数。三、详细设计一、对整体的设计思想进行构思,并写出软件大概的设计步骤和软件要实现的功能,并对需要的硬件设备和软件进行准备,电脑等相关的设备和资料。1 .翻开TC编译器,新建一个文件。图12 .输入源程序,实现学生成绩管理系统的相关功能。二、软件具体功能的设计方法和步骤。1、定义整个程序需要的头文件,#includestdio.h,'/*标准输入输出函数库*/#includestdlib.h"/*标准函数库*/includestring.h"/*字符串函数库*/#includeconio.h"/*屏幕操作函数库*/3 .定义所有和学生有关的数据结构。typedefstructstudent(charnum10;/*学号*/charname15;/*姓名*/intcgrade;*C语言成绩*/intmgrade;/*数学成绩*/integrade;/*英语成绩*/inttotal;/*总分*/floatave;/*平均分*/intmingci;/*名次*/);4 .编写学生成绩管理系统的菜单,方便软件使用者的操作。cprintf("学生成绩管理系统n)CPrintf("*菜单*n*)cprintf("*1输入成绩2删除成绩*n);cprintf("*3查询成绩4修改成绩*n);cprintf("*5插入成绩6统计成绩*n);cprintf("*7名次排名8保存成绩*n);cprintf("*9显示成绩0退出系统*n);CPrintf("*n");cprintf("本软件由王兴宇和崔凯共同设计,欢送使用!n");5.定义错误信息时函数调用,软件的提示信息。voidWrong()Printf(nnnnn*输入错误,任意键返回!*nu);getchar();6 .定义查询时的错误提示函数。voidNofind()(PriiHf(n=没有发现该学生!n)7 .显示单链表1中存储的学生记录,内容为StUdem结构中定义的内容,存储单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息。查询时指针时,逐条输出链表中存储的学生信息。voidDisp(Link1)Node*p;p=l-next;if(!p)*p=NULL,NU11在Stdlib中定义为0*/printf(,n= getchar();没有学生记录n");return;printdata(p);p=p->next;printf(HEADER3);8 .定位链表中符合要求的节点,并返回指向该节点的指针,其中findmess口保存要查找的具体内容;nameornum保存按什么查找;在单链表1中查找;Node*Locate(Linkl,charfindmess,charnameornum)(Node*r;if(strcmp(nameornum,"num")=0)(r=l->next;while(r)(if(strcmp(r->data.num,findmess)=O)returnr;r=r->next;)elseif(strcmp(nameornum,"name")=0)(r=l->next;while(r)(if(strcmp(r->data.name,findmess)=O)returnr;r=r->next;9 .进行分数的验证,输入的分数必须在。到100之间,大于100或小于。时提示输入错误,并要求重新输入。intnumberinput(char*notice)intt=0;doprintf(notice);scanf(%d"t);if(t>100Ht<0)PriIuf("成绩必须在。100!n");while(t>100t<0);returnt;)10 .构造增加学生记录的函数,实现添加操作的临时的结构体指针变量,并且保证输入的学号没有被使用,假设输入学号为0,那么退出添加记录操作。假设增加的学生型号已经存在,那么要求重新输入一个未被占用的学号。voidAdd(Link1)(Node*p,*r,*s;charch,flag=0,num10;r=l;s=l->next;system(clsn);Disp(I);while(r->next!=NULL)r=r->next;while(l)while(l)stringinput(num,10,输入0返回主菜单,输入学号H');flag=O;if(strcmp(num,0,)=0)return;s=l->next;while(s)if(strcmp(s->data.num,num)=O)flag=l;break;)s=s->next;)if(flag=l)getchar();Primfr=>学号s已经存在,是否重新输入?(y/n):",num);scanf(,%c,',(fech);if(ch=,y,ch=,Y,)continue;elsereturn;)elsebreak;)U.构造查询成绩的函数,查询的方法有两种:一、按学号查询,二、按学生姓名查询。intselect;charsearchinput20;Node*p;if(!l->next)system(clsu);Printf(n=>没有学生记录!n)getchar();return;)system(,'cls");rintf(,'n=>1按学号查询=>2按姓名查询n");printf(,'选择1,2:");scanf("%d",(fcselect);if(select=l)12 .构造删除学生记录的函数,首先查询要删除的学生是否存在,假设不存在,提示重新输入,假设存在,找到该节点,然后删除该节点。if(!l->next)system(cls);Printf(n=>没有学生记录!n");getchar();return;)r=l;while(r->next!=p)r=r->next;r->next=p->next;/*p所指节点从链表中去除*/free(p)"*释放内存空间*/PrintfC,n=>删除成功!n");getchar();Saveflag=I;13 .修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改。if(!l->next)system(',cls,');Printf(n=>没有学生记录!n");getchar();return;)system(,'clsu);PriIHf("修改学生成绩”);Disp(I);14 .插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。假设学号存在,那么进行插入之前的新记录的输入操作。15 .统计该班的总分第一名和单科第一,和各科不及格人数,并显示出来。voidTongji(Link1)(Node*pm,*pe,*pc,*pt;Node*r=l->next;intcountc=0,countm=0,counte=0;if(!r)system(cls");Primfrn=>没有学生记录n”);getchar();return;)system("cls");Disp(I);pm=pe=pc=pt=r;while(r)(if(r->data.cgrade<60)countc+;if(r->data.mgrade<60)countm+;if(r->data.egrade<60)counte+;if(r->data.cgrade>=pc->data.cgrade)pc=r;if(r->data.mgrade>=pm->data.mgrade)pm=r;if(r->data.egrade>=pe->data.egrade)pe=r;if(r->data.total>=pt->data.total)pt=r;r=r->next;)printf("n统计结果n);printf(,'C成绩不及格有:%d()n,countc);Printf("数学不及格有:%d(人)ncoumm);Printfr英语不及格有:%d(人)n”,counte);printf("n");Printf("总分最高的学生姓名:s总分:dn",pt->data.name,pt->data.total);Printf(”语最高成绩学生姓名:s5M%dn",e->data.name,e->data.egrade);Primf("数学最高学生姓名:S分数:dn",pm->data.name,pm->data.mgrade);printf(,'C语言最高学生姓名:s成绩:dn",pc->data.name,po>data.cgrade);printf(,'nn任意键返回”);getchar();)16 .利用插入排序法实现单链表的按总分字段的降序排序,从高到低为学生成绩排名。17 .数据存盘,假设用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘.getchar();PrimfCn=>是否保存?(y/n):");scanf(',%cuch);if(ch=,y,ch='Y,)Save(I);FILE*fp;Node*p;intcount=0;fp=fopen("cstudent',wb);*增加学生记录*/*删除学生记录*/*查询学生记录*/*修改学生记录*/*插入学生记录*/*统计学生记录*/*排序学生记录*/*保存学生记录*/18 .建立菜单。case1:Add(l);break;case2:Del(l);break;case3:Qur(l);break;case4:Modify;break;case5:Insert(l);break;case6:Tongji;break;case7:Sort(I);break;case8:Save(l);break;四、软件测试1 .利用VC+进行软件的测试,并记录相关的数据。编译、连接、运行程序,出现如图的菜单。2.选择1,添加学生成绩,出现如图的视图。图3图4如下图,系统中已经参加了三条数据。3.选择2,出现如下图的画面。图53.选择1和选择2分别按学号删除学生成绩记录和按姓名删除学生成绩记录,出现如下图。图6图74.选择3,查询学生的各科成绩,分别按学号和姓名查询。5.选择4,修改学生成绩。图8×-三11!×6“D:学习软件c+学生成绩管理Debug学生成绩管理.exe“学号姓名CII数学II英语总分!平均I名次3王五I85iIl36II42163I!54.00I01张三l541II32;I65151I!50.0002李四I361II871I65188IJ62.00I04O二l75I1165I136176I!58.00IF_L0金1臧IP名CJ数英3.五-a342绩绩为为5改改三:6修修>为绩绩力改成成名修学语姓绩数英入成6,5,俞C38=修改成功?=按任意键返回,学号姓名学生成绩:C数学英语;总分:平均名次;3iI小三II45IIIi36IIII65146ii:48.00I01张三I541_II321一一一一65151I!50.00!02_I李四II361I!I8711I65!188IiJ62.0010I小756536176;58.004一二14腐狗拼音半:0:图96.选择5,增加学生学号为7的姓名以及各科成绩。N“D:学习软件(一号一学-W7U.F一颦更一lc数英一,不性第耨学绩最匕的成成洞半高高A璧日八畲学能狗总英期Icl搜图6全生的单绩各及数总各绩名细107择计学绩分成一、不人及第和成一详私选统部成总科第科格以分名科第的将图118.选择7,为全部学生排名。-RtV痔一;学号II姓名C数学英语:总分II整名次;I!3I_I小三453665:I146一一一一一一I48.00I0!I:7Ii.EF;小四一_L654765:f177I59.00i0!II!1;张三543265:,I151II50.00I0!_I!2II李四368765:I188_I62.00I0I一一一一一II:4小二I756536:176II58.00I0!I;学号I姓名-学生减绩-C数学英语II总分I平均I名次II!2:李四368765:I188I62.00I1!I!7II小四654765:r177I59.00I2JIi!4吵三756536:176I58.00i3!I!1I_;张三543265:I151I50.00I4!_III3II小三I4536:II65114648.00I5I一一>IIIIII图129 .选择8,保存全部学生数据。图1310 .选择0,退出学生成绩管理系统。图14IL通过各项功能的测试,学生成绩管理系统可以实现预期的相关操作,因此,学生成绩管理系统设计成功。五、实验总结在一个星期的数据结构课程设计中,我们组的四个小组成员,细致分工,通力合作,每个人都认真的完成自己所承当的任务,为完成数据结构课程设计一起努力,其中王兴宇负责需求分析局部,他细致的分析了软件适用的行业和软件的具体功能,崔凯负责概要设计局部,我和杨秀玲主要负责学生成绩管理系统的详细设计和对软件的测试,对软件的功能进行完善和对各个功能模块的调试,并写出详细的设计过程和软件调试情况。通过这一个星期的程序设计,我们根本熟悉了数据结构中对于二叉排序树和单链表的运用,特别是二叉排序树的结果特点,在对其查找的时候特别方便。结合了二叉树和链表的特点,就比拟出二叉树在查找上的结构特点优于单链表。但在结合二叉树和链表的时候,对于查找链表中的内容时就比拟麻烦,我们目前所能使用的方法就是遍历二叉树再从链表中查找。这样就不如直接查找二叉树节点那么容易、方便。而如果是从二叉树的节点定位某串链(例如:查找取得70分的人)还是比拟方便的,这就表达了二叉树的特点。在程序设计方面,逐渐感觉到模块化设计的重要性。在程序设计时,应该分析出功能块,然后对其细节中的共性和特性作分析。在算法上使得其结果精简、完整,到达模块化,在编程时,思考方式就会集中在结构的逻辑上而非细节的问题上。这样可以使得程序更加严密可靠。而这样的技能是要在每次的程序设计及编程中慢慢积累的。这次的设计,让我大大地感觉到,对于程序设计中,对语言再熟悉也比不过在设计中算法和结构分析的真知灼见。当然,成功的程序设计是要建立在熟悉语言的根底之上的。平时语言的根本功要扎实。而每一次程序设计的经营能大大地增加对语言的熟悉和感知。程序设计的技能来自多方面,每一次的亲自实践、思考揣摩、刨根问底就会让自己更加清楚所欠缺的是什么。所以,现在觉得在设计实践中作为参考的书册阅读和研究远远比过单纯的阅读,因为它是在最紧迫的时间上填补自己最紧迫的缺乏。数据结构是计算机科学与技术专业的专业根底课,是一门十分重要的核心课程。数据结构的知识为后续专业课程的学习提供必要的知识和技能准备,学好“数据结构”这门课程,对于学习计算机专业的其他课程,如操作系统、编译原理、数据库管理系统、软件工程、人工智能等都是十分有益的,而且所有的计算机系统软件和应用软件都要用到各种类型的数据结构。通过实际的进行数据结构的程序设计,了解数据结构在程序设计中的重要应用,在软件的设计过程中,尽量要求程序的精简化、完整化、模块化,在编程时,思考方式要集中在结构的逻辑上而非细节的问题上。使得程序更加严密可靠。这次课程设计最重要的就是同学们之间互相帮助与合作。这对于我们来说,不仅培养了彼此之间的互帮互助,而且还培养了同学之间的合作精神,还增进了同学之间的关系。这次课程设计是靠每一个组员的分工和合作,共同努力来完成的。这次课程设计我们做了很详细的分工,每个成员有不同的责任,但每一局部的设计,都要每一个组员的相互合作。从这个课程设计中,我不仅学会了自己学习,还知道了共同学习和努力比一个人努力强很多。同时,在老师的指导下,我们的能力得到了提高,同时养成了科学、严谨的作风和习惯,为我们以后的学习和生活提供了很有益的帮助。