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

下载本文档

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

文档简介

1、武汉理工大学华夏学院课程设计报告书课程名称:数据结构课程设计题目 :用 C 语言实现成绩统计程序的设计系名:信息工程系专业班级:计算机 1121姓名:吴涛学号:10210412104指导教师 :司晓梅2016年3月20日第1页共37页武汉理工大学华夏学院信息工程系课程设计任务书课程名称:数据结构课程设计指导教师:司晓梅班级名称:计算机 1121开课系、教研室:信息系计算机一、课程设计目的与任务数据结构 课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存

2、储结构以及相应操作,把现实世界中的问题转换为计算机内部的表示和处理,这就是一个良好的程序设计技能训练的过程。提高学生的程序设计能力、掌握基本知识、 基本技能, 提高算法设计质量与程序设计素质的培养就是本门课程的课程设计的目的。任务:根据题目要求,完成算法设计与程序实现,并按规定写出课程设计报告。二、课程设计的内容与基本要求设计题目:用C 语言实现成绩统计程序的设计问题描述给出 n 个学生的 m 门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法:( 1)输入每个人的各门课程的成绩,计算每人的平均成绩;( 2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次;

3、( 3)按名次列出每个学生的姓名和各科成绩;基本要求学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;算法提示可以用选择排序、冒泡排序等多种排序算法求解;具体要完成的任务是:A. 编制完成上述问题的C 语言程序、进行程序调试并能得出正确的运行结果。B. 写出规范的课程设计报告书;三、课程设计步骤及时间进度和场地安排时间: 1 周地点:现代教育中心具体时间安排如下:第一天:布置题目,确定任务、查找相关资料第二天第四天:功能分析,编写程序,调试程序、运行系统;第五天上午:撰写设计报告;第五天下午:程序验收、答辩。四、课程设计考核及评分标准第2页共37页课程设计考核将综合考虑学生的系统设计方案

4、、运行结果、 课程设计报告书的质量、态度、考勤、答辩情况等各因素。具体评分标准如下:( 1)设计方案正确,具有可行性、创新性;30分( 2)系统开发效果较好;20分( 3)设计报告规范、课程设计报告质量高;20分( 4)课程设计答辩时,问题回答正确;20分( 5)态度认真、刻苦钻研、遵守纪律;10分按上述五项分别记分后求和,总分按五级制记载最后成绩。优秀( 100 90分),良好( 80 89分),中等( 70 79分),及格( 60 69分),不及格( 0 59分)第3页共37页目录一、问题描述5二、基本要求5三、数据结构设计6四、软件模块结构图7五、程序设计思想9六、程序流程图13七、源程

5、序18八、调试分析32九、测试数据33十、用户使用手册35一、问题描述第4页共37页问题描述给出 n 个学生的 m门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法:( 1)输入每个人的各门课程的成绩,计算每人的平均成绩;( 2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次;( 3)按名次列出每个学生的姓名和各科成绩;基本要求学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;算法提示可以用选择排序、冒泡排序等多种排序算法求解;二、基本要求基本要求学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;算法提示可以用选择排序、冒泡排序等多种排序算法求

6、解;三、数据结构的设计第5页共37页为了对学生信息进行统一操作,使用了结构体这一数据结构,学生的各项数据信息都能用结构体来表示,具体如下:structstu int num; /* 学号,整型变量 */char name50; /* 姓名,长度为 50的字符串数组 */char classes50 /* 班级名称,长度为 50的字符串数组 */ ; double gsps_score; /* 高等数学平时成绩,双精度实型变量 */ double gsks_score; /* 高等数学考试成绩,双精度实型变量 */ double gszh_score; /* 高等数学综合成绩,双精度实型变量 *

7、/ double dlps_score; /* 电路理论平时成绩,双精度实型变量 */ double dlks_score; /* 电路理论考试成绩,双精度实型变量 */ double dlzh_score; /* 电路理论综合成绩,双精度实型变量 */ double yyps_score; /* 英语平时成绩,双精度实型变量 */ double yyks_score; /* 英语考试成绩,双精度实型变量 */ double yyzh_score; /* 英语综合成绩,双精度实型变量 */ double wlps_score; /* 物理平时成绩,双精度实型变量 */ double wlks_

8、score; /* 物理考试成绩,双精度实型变量 */ double wlzh_score; /* 物理综合成绩,双精度实型变量 */double pj_score; /* 平均成绩,双精度实型变量 */ student1000; /* 最多存储 1000 个学生数据 */该结构体数据定义为全局变量。四、软件模块结构图第6页共37页主菜单控制模块模块功能描述:学生信息录入模块按学号查询学生信息学生信息查询模块按姓名查询学生信息学生信息修改模块学生信息删除模块学生信息插入模块输出优秀学生相关信息学生信息输出模块输出不及格学生信息每门课程的平均成绩课程成绩统计模块按单科成绩排名次a. 主菜单控制模

9、块: 主菜单直接控制七个模块 (学生信息输出模块的两个子模块直接归主菜单控制) ,在各模块间起到纽带的作用。在主菜单,可以通过选择进入其他模块, 其他模块运行结束后也可回到主菜单继续选择。b. 学生信息录入模块: 循环输入学生信息, 建立临时的学生信息数据库。c. 学生信息查询模块: 可选择按学号或者按姓名查询学生信息,如学生信息不存在则给出提示。d. 学生信息修改模块: 查找到要修改的学生信息后,可对该学生的信第7页共37页息进行逐项修改。e. 学生信息删除模块: 查找到要删除的学生信息后, 可对其进行删除操作。f. 学生信息插入模块: 在数据库末尾插入学生信息, 逐项输入要插入的学生信息即

10、可。g. 学生信息输出模块: 输出优秀学生信息模块能够输出优秀学生 (平均成绩大于等 90 分)的学号和姓名;输出不及格学生信息模块能够输出不及格学生的相关信息。h. 课程成绩统计模块: 可以得到每门课程的平均成绩,还可以任意抽取一门课按单科成绩排定学生名次。五、程序设计思想第8页共37页结构化的程序设计主要靠设计和调用各模块的函数来实现。本程序设计了多个函数, 每个函数自身能完成一个任务,有的函数和别的函数结合能完成更大的任务。 每一个模块功能的实现其实就是对函数的调用,本说明首先介绍本程序所涉及的子函数,再介绍主函数,最后介绍程序整体的实现过程。1.voidInputfun()此函数较特别

11、,它只进行输入操作,但由于此函数所包含的语句较长且需要被其他三个函数使用,为方便调用单写了一个函数。此函数在源程序中放在最前,所以在此先作说明。此函数可细分为 11 个小块,用来输入学生的基本数据。每小块的结构基本相同即for(;)基本语句+ 一个continue语句 +基本语句 +一个break 语句 之所以用这个结构为了使输入的数据更加正规。比如在分数的输入中就限定了只能输入 0 至 100 之间的数值,这也符合分数录入规则。需要特别注意的是, 这个函数完成了本程序中要做的两个计算。其一是在每门课的考试试成绩输入后完成了对这门课的综合成绩的加权计算(考试成绩 *0.7+ 平时成绩 *0.3

12、 );其二是在最后一门课程的综合成绩算出后,计算了该学生四门课的平均成绩。2.void Getinformation() 此函数用来录入学生信息。 它调用了 void Inputfun() 函数,其实它的主体部分就是 void Inputfun() 函数。这函数还用了一个 for 循环以达到循环输入的目的。3.int Searchbynum (int no)int Searchbyname (char na50)这是两个“兄弟函数”,是按学号查找和按姓名查询模块中的两个重要函数。主要功能是根据用户输入的学号姓名返回改学生所在的的数第9页共37页组下标。利用for 循环嵌套一个 if语句实现,若

13、找到学生该学生信息就返回数组下标,若找不到就返回-1 。4.void Seekinformation()void Printinformation(int x)这两个函数关系紧密,所以一起介绍。void Seekinformation()函数利用for循环和 if语句使查找中能够使用学号和姓名两种方式。如源程序所示,在用 if语句确定了查找方式后先后调用了intSearchbynum(intno)intSearchbyname(charna50)和voidPrintinformation(int x)两个函数,根据int Searchbynum (intno)int Searchbyname

14、(char na50)返回的数组下标,运用voidPrintinformation(int x)输出所查询的内容。所以int Searchbynum (int no)int Searchbyname (char na50)voidSeekinformation()voidPrintinformation(intx) 这四个函数是查询模块的四个联系紧密的重要函数,在它们的共同作用下查询模块的功能得以实现。5.void Modifyinformation() 此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据, 达到修改的目的。 本函数还调用了查找模块的函数, 使修改前能按学号或姓

15、名找到要修改的学生信息。修改过程中调用了 Inputfun() 函数6.void Deleteinformation()此函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for (i=x;i<999;i+)studenti=studenti+1;从要删除的那一个数据开始, 用后一个数据覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。第10页共37页7.voidInsertinformaton()此函数用于插入学生数据。 由于没有用链表,所以选择插入在最后一个有效数据之后。本函数运用if(studentj.num=0)这个语句找到了最后一个有效数据之后的数组下标

16、 j, 然后将数据输入到studentj中,便完成的了插入。插入过程中,调用了Inputfun()函数。8.void Showthefail()此函数用于显示不及格学生的信息。能够按要求输出不及格学生的学号、姓名、各科成绩以及平均成绩。首先用这条 if 语句搜索该学生是否有成绩不及格,当四门课中至少有一门不及格时会输出该学生的相关信息。9.void Stu_p() 此函数用于输出优秀学生(平均成绩大于 90 分)的信息,利用 for 循环和条件判断句输出找出相应的学生输出相关信息。10.void Chengjitongji()此函数用于按要求统计成绩。有分别统计每门课的平均成绩的功能;还能够按

17、每门课程的成绩对学生进行排序,使学生在该门课的表现一目了然。 排序中用到了冒泡排序的方法。9. void main() 下面对主函数作简要说明。 Switch 语句是函数的主体:switch(c)/*利用 switch 语句集成各个功能函数 */case 1 : Getinformation();break;/*获得学生信息 */case 2 : Seekinformation();break;/*查找学生信息 */case 3 : Modifyinformation();break;/*修改学生信息 */第11页共37页case 4 : Deleteinformation();break;/

18、*删除学生信息 */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. 最后对程序的整体实现过程

19、作个简要说明。源程序中多处运用continue和 break 语句,同时配合scanf 函数和 if条件判断语句,使用户能够根据提示通过简单的数值输入来选择下一步该做什么。中文界面,用户很容易根据提示上手,简单易用。六、程序流程图第12页共37页开始系统启动口令输入a=?Na=1?Y口令错误,系N进入选择菜单统即将关闭!Yc=1?N录入学生信息c=2?Y查找学生信息NYc=3?N修改学生信息c=4?YN删除学生信息c=5?NY插入学生信息Yc=6?N优秀学生信息c=7?NYY不及格学生信息Nc=8?N课程成绩统计结束以上为主函数流程图, 主函数下八个供选择的模块只是简单的用一个第13页共37页

20、执行框表示。现分别画出八个模块的流程图:1、录入学生成绩:开始输入学生信息及成绩是否继续?继续按1,结束按 0·10结束2、查找学生信息:开始按学号查找请按 1,2按姓名查找请按 21输出相应姓名所对应的信息输出相应学号所对应的信息1是否继续?继续按1,结束按 000结束3、修改学生信息:第14页共37页开始调用查找函数找到要修改的信息输入修改后的信息是否继续?继续按1,结束按00结束4、删除学生信息:开始调用查找函数找到要删除的信息是否删除?是按1,否按 01删除成功是否继续?继续按1,结束按00结束11第15页共37页5、插入学生信息:开始输入要插入的信息是否继续?继续按1,结束

21、按00结束6、优秀学生信息:开始1N学生平均成绩是否大于等于90?YY输出该生学号和姓名检索完毕?NY结束7、不及格学生信息:第16页共37页开始判断该生是N否有不及格科目Y输出该该生学信息N检索完毕?Y结束8、成绩统计模块:开始每门课程平均成绩请按1,单1科成绩排名请按22选择要排名的科目输出该科成绩排名结束输出每门课程平均成绩第17页共37页七、源程序#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>struct stu/*定义结构体 */int num

22、;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

23、;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; /*格

24、式正确后跳出死循环 */第18页共37页for(; ;)printf("请输入学号 :t");/*输入学号 */scanf("%d",&b);if(studenti.num<0)printf("您输入的学号错误 !n");continue;studenti.num=b;break;for(; ;)printf("请输入姓名 :t");/*输入姓名 */scanf("%s",&s1);if(strlen(s1)>20)printf("您输入的姓名过长 !n&q

25、uot;);continue;strcpy(,s1);break;for(; ;)printf("请输入该生高等数学平时成绩:t");/*输入各科平时成绩和考试成绩 */ scanf("%lf",&f);if(f>100|f<0)printf("成绩不合理!请您输入合理的成绩.n");continue;studenti.gsps_score=f;break;for(; ;)printf("请输入该生高等数学考试成绩:t");scanf("%lf",&

26、amp;f);if(f>100|f<0)第19页共37页printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.gsks_score=f;studenti.gszh_score=studenti.gsks_score*0.7+studenti.gsps_score *0.3;/* 按考试成绩 70%平时成绩 30%算该门课程的最终成绩 */break;for(; ;)printf("请输入该生电路理论平时成绩:t");scanf("%lf",&f);if(f>100|

27、f<0)printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.dlps_score=f;break;for(; ;)printf("请输入该生电路理论考试成绩:t");scanf("%lf",&f);if(f>100|f<0)printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.dlks_score=f;studenti.dlzh_score=studenti.dlks_score*0.7+studen

28、ti.dlps_score *0.3;break;for(; ;)printf("请输入该生英语平时成绩:t");scanf("%lf",&f);if(f>100|f<0)printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;第20页共37页studenti.yyps_score=f;break;for(; ;)printf("请输入该生英语考试成绩:t");scanf("%lf",&f);if(f>100|f<0)printf(

29、" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.yyks_score=f;studenti.yyzh_score=studenti.yyks_score*0.7+studenti.yyps_score *0.3;break;for(; ;)printf("请输入该生物理平时成绩:t");scanf("%lf",&f);if(f>100|f<0)printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.wlps_score

30、=f;break;for(; ;)printf("请输入该生物理考试成绩:t");scanf("%lf",&f);if(f>100|f<0)printf(" 成绩不合理!请您输入合理的成绩 .n"); continue;studenti.wlks_score=f;studenti.wlzh_score=studenti.wlks_score*0.7+studenti.wlps_score *0.3;第21页共37页studenti.pj_score=(studenti.yyzh_score+studenti.dlz

31、h_score+studenti.gszh_score+studenti.wlzh_score)/4;/* 计算每个学生的平均成绩 */ break;/*录入学生信息模块*/void Getinformation() /*获得学生信息 */for (i=0;i<1000;i+)/*利用循环连续输入学生信息*/if(i=0)system("cls");printf("请根据提示输入学生的信息nn");elseprintf("请输入下一个学生的信息nn");Inputfun();printf("继续请按 1,返回主菜单请按

32、0.n");scanf("%d",&a);if(a=0)break;/*查询模块:包含四个函数,函数间有联系*/int Searchbynum (int no) /*按学号查找 */for (j=0;j<1000;j+)if (studentj.num=no)return j;return -1;int Searchbyname (char na50)/*按姓名查找 */第22页共37页for (k=0;k<1000;k+)if (strcmp(,na)=0)return k;return -1;void Printi

33、nformation(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",studen

34、tx.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

35、); 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(&qu

36、ot; 平均成绩 :%5.2fn",studentx.pj_score);void Seekinformation()/*查询学生信息 */for(; ;)system("cls");printf("按学号查找请按 1,按姓名查找请按2n");/*提供两种查找方式 */scanf("%d",&a);if(a=1)第23页共37页system("cls");printf("请输入要查找的学生的学号n");scanf("%d",&d);x=Searchb

37、ynum (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;/*学生信息删改:包含三个相互独立的函数*/

38、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

39、 if (a=2)system("cls");printf("请输入要查找的学生的姓名n");scanf("%s",&s1);第24页共37页x=Searchbyname (s1);if (x=-1)printf("学生信息不存在 !n");elseprintf("您要修改的学生信息为 :n");Printinformation(x);printf("请您输入新值 n");i=x;Inputfun();printf("继续请按 1,返回主菜单请按0.n&qu

40、ot;);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("%

41、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第25页共37页printf("您要删除的学生信息为 :n");Printinformation(x);printf("是否真的要删除该生信息?是请按 1,否请按 0.n&

42、quot;);scanf("%d",&a);if (a=1)for (i=x;i<999;i+)studenti=studenti+1;/*该数组后的数组向前移动以覆盖的方式删除该数组 */printf("删除成功 !n");printf("继续请按 1,返回主菜单请按0.n");scanf("%d",&a);if(a=0)break;void Insertinformaton() /*插入学生信息 */system("cls");for(j=0;j<1000;j+)

43、if(studentj.num=0)x=j;break;for(i=x;i<1000;i+)system("cls");printf("请输入要插入的学生信息nn");Inputfun();/* 利用信息录入函数把学生信息插在末尾 */ printf(" 继续请按 1,返回主菜单请按 0.n");scanf("%d",&a);if(a=0)break;/*各科成绩排序的四个程序*/void paixugs() /*排序 1*/struct stu temp;第26页共37页for (j=1;j<

44、1000;j+)for (k=0;k<999;k+)if (studentk.gszh_score<studentk+1.gszh_score)/*利用冒泡排序的方法完成排序 */temp=studentk;studentk=studentk+1;studentk+1=temp;system("cls");printf("学生成绩排序表 :nn");for (i=0;i<1000;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;j<1000;j+)for (

温馨提示

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

评论

0/150

提交评论