数据结构课程设计报告-学生成绩管理系统.doc_第1页
数据结构课程设计报告-学生成绩管理系统.doc_第2页
数据结构课程设计报告-学生成绩管理系统.doc_第3页
数据结构课程设计报告-学生成绩管理系统.doc_第4页
数据结构课程设计报告-学生成绩管理系统.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录 一、问题描述.2 二、基本要求.3三、数据结构设计.4 四、软件模块结构图.5五、程序设计思想.7六、程序流程图.117、 源程序.16 八、调试分析.30 九、测试数据.31 十、用户使用手册.34 十一、心得体会.35一、问题描述在学生成绩管理中,经常会遇到求平均成绩,统计不及格学生成绩,统计优秀学生人数,以及按成绩对学生进行排名等。现假设有某个班级的若干名学生,每个学生都考试完成了4门课程,试对所有学生的成绩完成以下工作:(1)求每门课程的平均成绩。(2)输出所有有不及格课程的学生的学号、姓名、全部课程的成绩、平均成绩。(3)输出所有平均分在90分以上(含90分)的学生学号、姓名。(4)对4门课程中的任何一门,可随意抽取1门按学生成绩进行排序。二、基本要求对学生信息的输入完成后,实现如下功能:1、对学生信息的查找、插入、删除、修改。2、分别输出优秀学生和不及格学生的信息。3、显示每们课程的平均成绩。4、任意抽取一门课程后,可以按该课程学生成绩对学生信息进行排序。三、数据结构的设计为了对学生信息进行统一操作,使用了结构体这一数据结构,学生的各项数据信息都能用结构体来表示,具体如下:struct stuint num;/*学号,整型变量*/ char name50;/*姓名,长度为50的字符串数组*/ char classes50/*班级名称,长度为50的字符串数组*/; double gsps_score;/*高等数学平时成绩,双精度实型变量*/ double gsks_score;/*高等数学考试成绩,双精度实型变量*/ double gszh_score;/*高等数学综合成绩,双精度实型变量*/ double dlps_score;/*电路理论平时成绩,双精度实型变量*/ double dlks_score;/*电路理论考试成绩,双精度实型变量*/ double dlzh_score;/*电路理论综合成绩,双精度实型变量*/ double yyps_score;/*英语平时成绩,双精度实型变量*/ double yyks_score;/*英语考试成绩,双精度实型变量*/ double yyzh_score;/*英语综合成绩,双精度实型变量*/ double wlps_score;/*物理平时成绩,双精度实型变量*/ double wlks_score;/*物理考试成绩,双精度实型变量*/ double wlzh_score;/*物理综合成绩,双精度实型变量*/double pj_score;/*平均成绩,双精度实型变量*/student1000;/*最多存储1000个学生数据*/该结构体数据定义为全局变量。四、软件模块结构图每门课程的平均成绩主菜单控制模块学生信息录入模块学生信息查询模块学生信息修改模块学生信息删除模块学生信息插入模块学生信息输出模块按学号查询学生信息按姓名查询学生信息输出优秀学生相关信息输出不及格学生信息课程成绩统计模块按单科成绩排名次模块功能描述:a.主菜单控制模块:主菜单直接控制七个模块(学生信息输出模块的两个子模块直接归主菜单控制),在各模块间起到纽带的作用。在主菜单,可以通过选择进入其他模块,其他模块运行结束后也可回到主菜单继续选择。b.学生信息录入模块:循环输入学生信息,建立临时的学生信息数据库。c.学生信息查询模块:可选择按学号或者按姓名查询学生信息,如学生信息不存在则给出提示。d.学生信息修改模块:查找到要修改的学生信息后,可对该学生的信息进行逐项修改。e.学生信息删除模块:查找到要删除的学生信息后,可对其进行删除操作。f.学生信息插入模块:在数据库末尾插入学生信息,逐项输入要插入的学生信息即可。g.学生信息输出模块:输出优秀学生信息模块能够输出优秀学生(平均成绩大于等90分)的学号和姓名;输出不及格学生信息模块能够输出不及格学生的相关信息。h.课程成绩统计模块:可以得到每门课程的平均成绩,还可以任意抽取一门课按单科成绩排定学生名次。五、程序设计思想结构化的程序设计主要靠设计和调用各模块的函数来实现。本程序设计了多个函数,每个函数自身能完成一个任务,有的函数和别的函数结合能完成更大的任务。每一个模块功能的实现其实就是对函数的调用,本说明首先介绍本程序所涉及的子函数,再介绍主函数,最后介绍程序整体的实现过程。1.void Inputfun() 此函数较特别,它只进行输入操作,但由于此函数所包含的语句较长且需要被其他三个函数使用,为方便调用单写了一个函数。此函数在源程序中放在最前,所以在此先作说明。此函数可细分为11个小块,用来输入学生的基本数据。每小块的结构基本相同即for(;)基本语句 +一个continue语句+基本语句+一个break语句之所以用这个结构为了使输入的数据更加正规。比如在分数的输入中就限定了只能输入0至100之间的数值,这也符合分数录入规则。需要特别注意的是,这个函数完成了本程序中要做的两个计算。其一是在每门课的考试试成绩输入后完成了对这门课的综合成绩的加权计算(考试成绩*0.7+平时成绩*0.3);其二是在最后一门课程的综合成绩算出后,计算了该学生四门课的平均成绩。2.void Getinformation() 此函数用来录入学生信息。它调用了void Inputfun()函数,其实它的主体部分就是void Inputfun()函数。这函数还用了一个for循环以达到循环输入的目的。3.int Searchbynum (int no)int Searchbyname (char na50) 这是两个“兄弟函数”,是按学号查找和按姓名查询模块中的两个重要函数。主要功能是根据用户输入的学号姓名返回改学生所在的的数组下标。利用for循环嵌套一个if语句实现,若找到学生该学生信息就返回数组下标,若找不到就返回-1。4.void Seekinformation()void Printinformation(int x) 这两个函数关系紧密,所以一起介绍。void Seekinformation()函数利用for循环和if语句使查找中能够使用学号和姓名两种方式。如源程序所示,在用if语句确定了查找方式后先后调用了int Searchbynum (int no)int Searchbyname (char na50)和void Printinformation(int x)两个函数,根据int Searchbynum (int no)int Searchbyname (char na50)返回的数组下标,运用void Printinformation(int x)输出所查询的内容。所以int Searchbynum (int no)int Searchbyname (char na50)void Seekinformation()void Printinformation(int x)这四个函数是查询模块的四个联系紧密的重要函数,在它们的共同作用下查询模块的功能得以实现。5.void Modifyinformation() 此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据,达到修改的目的。本函数还调用了查找模块的函数,使修改前能按学号或姓名找到要修改的学生信息。修改过程中调用了Inputfun()函数6.void Deleteinformation() 此函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for (i=x;i999;i+) studenti=studenti+1;从要删除的那一个数据开始,用后一个数据覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。7.void Insertinformaton() 此函数用于插入学生数据。由于没有用链表,所以选择插入在最后一个有效数据之后。本函数运用if(studentj.num=0)这个语句找到了最后一个有效数据之后的数组下标j,然后将数据输入到studentj中,便完成的了插入。插入过程中,调用了Inputfun()函数。8.void Showthefail() 此函数用于显示不及格学生的信息。能够按要求输出不及格学生的学号、姓名、各科成绩以及平均成绩。首先用这条if语句搜索该学生是否有成绩不及格,当四门课中至少有一门不及格时会输出该学生的相关信息。9.void Stu_p() 此函数用于输出优秀学生(平均成绩大于90分)的信息,利用for循环和条件判断句输出找出相应的学生输出相关信息。10.void Chengjitongji()此函数用于按要求统计成绩。有分别统计每门课的平均成绩的功能;还能够按每门课程的成绩对学生进行排序,使学生在该门课的表现一目了然。排序中用到了冒泡排序的方法。9. void main() 下面对主函数作简要说明。Switch语句是函数的主体:switch(c)/*利用switch语句集成各个功能函数*/case 1 : Getinformation();break;/*获得学生信息*/case 2 : Seekinformation();break;/*查找学生信息*/case 3 : Modifyinformation();break;/*修改学生信息*/case 4 : Deleteinformation();break;/*删除学生信息*/case 5 : Insertinformaton();break;/*插入学生信息*/case 6 : Stu_p();break;/*显示优秀学生信息*/case 7 : Showthefail();break;/*显示不及格学生信息*/case 8 : Chengjitongji();break;/*课程成绩的统计*/case 0 : exit(0);/*退出*/default: break;default: break;通过一个数值输入函数,使用户在简单的数值输入后就可轻松调用各模块。还使用了for (;)使各模块能够循环调用。11.最后对程序的整体实现过程作个简要说明。源程序中多处运用continue和break语句,同时配合scanf函数和if条件判断语句,使用户能够根据提示通过简单的数值输入来选择下一步该做什么。中文界面,用户很容易根据提示上手,简单易用。六、程序流程图开始系统启动口令输入a=? a=1? N 口令错误,系统即将关闭! Y进入选择菜单 N c=1? Y 录入学生信息 c=2? N Y查找学生信息c=3? N Y修改学生信息 Nc=4? 删除学生信息c=5? Y N c=6? N Y插入学生信息 c=7? Y 优秀学生信息 N 不及格学生信息c=8? N Y Y N课程成绩统计 N结束以上为主函数流程图,主函数下八个供选择的模块只是简单的用一个执行框表示。现分别画出八个模块的流程图:1、 录入学生成绩:开始输入学生信息及成绩是否继续?继续按1,结束按0 1 0结束开始2、查找学生信息:按学号查找请按1,按姓名查找请按2 2 1输出相应姓名所对应的信息输出相应学号所对应的信息是否继续?继续按1,结束按0 1 0结束 03、修改学生信息:开始调用查找函数找到要修改的信息输入修改后的信息是否继续?继续按1,结束按0 1 0结束4、删除学生信息:开始调用查找函数找到要删除的信息是否删除?是按1,否按0 1 删除成功 是否继续?继续按1,结束按0 1 结束 0开始5、插入学生信息:输入要插入的信息是否继续?继续按1,结束按0 1 0 结束 6、优秀学生信息:开始学生平均成绩是否大于等于90? N Y输出该生学号和姓名 Y 检索完毕? N 结束 Y 7、 不及格学生信息:开始判断该生是否有不及格科目 N Y 输出该该生学信息 检索完毕? N Y结束8、 成绩统计模块:开始每门课程平均成绩请按1,单科成绩排名请按2 1 2 输出每门课程平均成绩选择要排名的科目输出该科成绩排名结束七、源程序#include#include#include#includestruct stu/*定义结构体*/int num; char name50; char classes50; double gsps_score; double gsks_score; double gszh_score; double dlps_score; double dlks_score; double dlzh_score; double yyps_score; double yyks_score; double yyzh_score; double wlps_score; double wlks_score; double wlzh_score; double pj_score;student1000;int a,b,c,d,x,i,j,k,s,y,flag;char s150,c1;double f,t,gp,dp,yp,wp;/*录入、修改、插入学生信息三个模块调用了输入模块*/void Inputfun()/*输入学生信息模块*/for(; ;)/*设计死循环以至于在输入格式错误时可以再次输入*/ printf(请输入班级名称:t); /*输入班级名称*/ scanf(%s,&s1); if(strlen(s1)20) printf(您输入的班级名称过长!n); continue; strcpy(studenti.classes,s1); break; /*格式正确后跳出死循环*/ for(; ;) printf(请输入学号:t);/*输入学号*/ scanf(%d,&b); if(studenti.num20) printf(您输入的姓名过长!n); continue; strcpy(,s1); break; for(; ;) printf(请输入该生高等数学平时成绩:t);/*输入各科平时成绩和考试成绩*/ scanf(%lf,&f); if(f100|f100|f100|f100|f100|f100|f100|f100|f0) printf(成绩不合理!请您输入合理的成绩.n); continue; studenti.wlks_score=f; studenti.wlzh_score=studenti.wlks_score*0.7+studenti.wlps_score*0.3; studenti.pj_score=(studenti.yyzh_score+studenti.dlzh_score+studenti.gszh_score+studenti.wlzh_score)/4;/*计算每个学生的平均成绩*/ break; /*录入学生信息模块*/void Getinformation() /*获得学生信息*/ for (i=0;i1000;i+)/*利用循环连续输入学生信息*/ if(i=0) system(cls); printf(请根据提示输入学生的信息nn); else printf(请输入下一个学生的信息nn); Inputfun();printf(继续请按1,返回主菜单请按0.n); scanf(%d,&a); if(a=0) break;/*查询模块:包含四个函数,函数间有联系*/ int Searchbynum (int no) /*按学号查找*/for (j=0;j1000;j+) if (studentj.num=no) return j; return -1;int Searchbyname (char na50)/*按姓名查找*/for (k=0;k1000;k+) if (strcmp(,na)=0) return k; return -1; void Printinformation(int x)/*输出学生信息*/ if (x=-1)printf(该学生信息不存在!n);elseprintf(班级:%sn,studentx.classes); printf(学号:%dn,studentx.num);printf(姓名:%snn,);printf(高数平时成绩:%5.2fn,studentx.gsps_score);printf(高数考试成绩:%5.2fn,studentx.gsks_score);printf(高数综合成绩:%5.2fnn,studentx.gszh_score);printf(电路平时成绩:%5.2fn,studentx.dlps_score);printf(电路考试成绩:%5.2fn,studentx.dlks_score);printf(电路综合成绩:%5.2fnn,studentx.dlzh_score);printf(英语平时成绩:%5.2fn,studentx.yyps_score);printf(英语考试成绩:%5.2fn,studentx.yyks_score);printf(英语综合成绩:%5.2fnn,studentx.yyzh_score);printf(物理平时成绩:%5.2fn,studentx.wlps_score);printf(物理考试成绩:%5.2fn,studentx.wlks_score);printf(物理综合成绩:%5.2fnn,studentx.wlzh_score);printf(平均成绩:%5.2fn,studentx.pj_score); void Seekinformation()/*查询学生信息*/for(; ;)system(cls);printf(按学号查找请按1,按姓名查找请按2n);/*提供两种查找方式*/scanf(%d,&a);if(a=1)system(cls);printf(请输入要查找的学生的学号n);scanf(%d,&d);x=Searchbynum (d);/*调用按学号查找函数*/Printinformation(x);else if (a=2)system(cls);printf(请输入要查找的学生的姓名n);scanf(%s,&s1);x=Searchbyname (s1);/*调用按姓名查找函数*/Printinformation(x);printf(继续请按1,返回主菜单请按0.n); scanf(%d,&a); if(a=0) break;/*学生信息删改:包含三个相互独立的函数*/void Modifyinformation() /*修改学生信息*/for(; ;) system(cls);printf(请先查找要修改的学生信息!nn);printf(按学号查找请按1,按姓名查找请按2n);/*先查找后修改*/scanf(%d,&a);if(a=1)system(cls);printf(请输入要查找的学生的学号n);scanf(%d,&d);x=Searchbynum (d);else if (a=2)system(cls);printf(请输入要查找的学生的姓名n);scanf(%s,&s1);x=Searchbyname (s1);if (x=-1) printf(学生信息不存在!n); else printf(您要修改的学生信息为:n); Printinformation(x);printf(请您输入新值n); i=x;Inputfun();printf(继续请按1,返回主菜单请按0.n); scanf(%d,&a); if(a=0) break;void Deleteinformation() /*删除学生信息*/for (;)system(cls);printf(请先查找要删除的学生信息!nn);printf(按学号查找请按1,按姓名查找请按2n);scanf(%d,&a);if(a=1)system(cls);printf(请输入要查找的学生的学号n);scanf(%d,&d);x=Searchbynum (d);else if (a=2)system(cls);printf(请输入要查找的学生的姓名n);scanf(%s,&s1);x=Searchbyname (s1);if (x=-1) printf(学生信息不存在!n); else printf(您要删除的学生信息为:n); Printinformation(x);printf(是否真的要删除该生信息?是请按1,否请按0.n);scanf(%d,&a);if (a=1) for (i=x;i999;i+) studenti=studenti+1;/*该数组后的数组向前移动以覆盖的方式删除该数组*/printf(删除成功!n); printf(继续请按1,返回主菜单请按0.n); scanf(%d,&a); if(a=0) break;void Insertinformaton() /*插入学生信息*/system(cls);for(j=0;j1000;j+)if(studentj.num=0)x=j;break;for(i=x;i1000;i+)system(cls);printf(请输入要插入的学生信息nn);Inputfun();/*利用信息录入函数把学生信息插在末尾*/printf(继续请按1,返回主菜单请按0.n); scanf(%d,&a); if(a=0) break;/*各科成绩排序的四个程序*/void paixugs() /*排序1*/struct stu temp;for (j=1;j1000;j+) for (k=0;k999;k+) if (studentk.gszh_scorestudentk+1.gszh_score)/*利用冒泡排序的方法完成排序*/ temp=studentk; studentk=studentk+1; studentk+1=temp; system(cls); printf(学生成绩排序表:nn); for (i=0;i1000;i+) if (studenti.num!=0) printf(学号:%dt,studenti.num); printf(姓名:%st,); printf(第%d名:%5.2fn,(i+1),studenti.gszh_score); printf(返回主菜单请按0n); scanf(%d,&a);void paixudl() /*排序2*/struct stu temp;for (j=1;j1000;j+) for (k=0;k999;k+) if (studentk.dlzh_scorestudentk+1.dlzh_score) temp=studentk; studentk=studentk+1; studentk+1=temp; system(cls); printf(学生成绩排序表:nn); for (i=0;i1000;i+) if (studenti.num!=0) printf(学号:%dt,studenti.num); printf(姓名:%st,); printf(第%d名:%5.2fn,(i+1),studenti.dlzh_score); printf(返回主菜单请按0n); scanf(%d,&a);void paixuyy() /*排序3*/struct stu temp;for (j=1;j1000;j+) for (k=0;k999;k+) if (studentk.yyzh_scorestudentk+1.yyzh_score) temp=studentk; studentk=studentk+1; studentk+1=temp; system(cls); printf(学生成绩排序表:nn); for (i=0;i1000;i+) if (studenti.num!=0) printf(学号:%dt,studenti.num); printf(姓名:%st,); printf(第%d名:%5.2fn,(i+1),studenti.yyzh_score); printf(返回主菜单请按0n); scanf(%d,&a);void paixuwl() /*排序4*/struct stu temp;for (j=1;j1000;j+) for (k=0;k999;k+) if (studentk.wlzh_scorestudentk+1.wlzh_score) temp=studentk; studentk=studentk+1; studentk+1=temp; system(cls); printf(学生成绩排序表:nn); for (i=0;i1000;i+) if (studenti.num!=0) printf(学号:%dt,studenti.num); printf(姓名:%st,); printf(第%d名:%5.2fn,(i+1),studenti.wlzh_score); printf(返回主菜单请按0n); scanf(%d,&a);void Showthefail()/*显示不及格学生的情况*/ system(cls); printf(不及格的学生:nn); for (i=0;i1000;i+) if (studenti.num!=0) if(studenti.gszh_score60|studenti.dlzh_score60|studenti.yyzh_score60|studenti.wlzh_score60) Printinformation(i);printf(-n);printf(n返回主

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论