武汉理工大学华夏学院 课程设计报告书
课程名称: 数据结构课程设计
题 目:用C语言实现成绩统计程序的设计 系 名: 信息工程系
专业班级: 计算机1121
姓 名: 吴涛 学 号: 10210412104 指导教师: 司晓梅
2016年 3 月 20日
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
武汉理工大学华夏学院信息工程系
课 程 设 计 任 务 书
课程名称: 数据结构课程设计 指导教师: 司晓梅
班级名称: 计算机1121 开课系、教研室: 信息系计算机
一、课程设计目的与任务
《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程.旨在使学生学会分析研究数据对象的特性.学会数据的组织方法.以便选择合适的数据的逻辑结构和存储结构以及相应操作.把现实世界中的问题转换为计算机内部的表示和处理.这就是一个良好的程序设计技能训练的过程。提高学生的程序设计能力、掌握基本知识、基本技能.提高算法设计质量与程序设计素质的培养就是本门课程的课程设计的目的。
任务:根据题目要求.完成算法设计与程序实现.并按规定写出课程设计报告。
二、课程设计的内容与基本要求
设计题目:用C语言实现成绩统计程序的设计
〔问题描述〕给出n个学生的m门课程的考试成绩信息.每条信息由姓名、课程代号与分数组成.要求设计算法:
(1)输入每个人的各门课程的成绩.计算每人的平均成绩;
(2)按平均成绩的高低次序.打印出个人的名次.平均成绩相同的为同一名次; (3)按名次列出每个学生的姓名和各科成绩;
〔基本要求〕 学生的考试成绩必须通过键盘输入.且需对输出进行格式控制; 〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解; 具体要完成的任务是:
A. 编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。 B. 写出规范的课程设计报告书;
三、课程设计步骤及时间进度和场地安排
时间:1周 地点:现代教育中心 具体时间安排如下:
第一天:布置题目.确定任务、查找相关资料
第二天~第四天:功能分析.编写程序.调试程序、运行系统; 第五天上午:撰写设计报告; 第五天下午:程序验收、答辩。
四、课程设计考核及评分标准
课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
考勤、答辩情况等各因素。具体评分标准如下:
(1)设计方案正确.具有可行性、创新性; 30分 (2)系统开发效果较好; 20分 (3)设计报告规范、课程设计报告质量高; 20分 (4)课程设计答辩时.问题回答正确; 20分 (5)态度认真、刻苦钻研、遵守纪律; 10分 按上述五项分别记分后求和.总分按五级制记载最后成绩。
优秀(100~90分).良好(80~89分).中等(70~79分).及格(60~69分).不及
格(0~59分)
目 录
一、问题描述..........................................5
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
二、基本要求..........................................5 三、数据结构设计......................................6 四、软件模块结构图....................................7 五、程序设计思想......................................9 六、程序流程图.......................................13 七、源程序...........................................18 八、调试分析.........................................32 九、测试数据.........................................33 十、用户使用手册.....................................35
一、问题描述
〔问题描述〕给出n个学生的m门课程的考试成绩信息.每条信息由姓名、课程代号与分数组成.要求设计算法:
(1)输入每个人的各门课程的成绩.计算每人的平均成绩;
(2)按平均成绩的高低次序.打印出个人的名次.平均成绩相同的为同一名次; (3)按名次列出每个学生的姓名和各科成绩;
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
〔基本要求〕 学生的考试成绩必须通过键盘输入.且需对输出进行格式控制; 〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解;
二、基本要求
〔基本要求〕 学生的考试成绩必须通过键盘输入.且需对输出进行格式控制; 〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解;
三、数据结构的设计
为了对学生信息进行统一操作.使用了结构体这一数据结构.学生的各项数据信息都能用结构体来表示.具体如下: struct stu
{int num;/*学号.整型变量*/
char name[50];/*姓名.长度为50的字符串数组*/
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
char classes[50]/*班级名称.长度为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;/*平均成绩.双精度实型变量*/ }student[1000];/*最多存储1000个学生数据*/ 该结构体数据定义为全局变量。
四、软件模块结构图
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
学生信息录入模块 按学号查询学生信息 学生信息查询模块 按姓名查询学生信息 学生信息修改模块 主菜单控制模块学生信息删除模块 学生信息插入模块 输出优秀学生相关信息 学生信息输出模块 输出不及格学生信息
模块功能描述:
a.主菜单控制模块:主菜单直接控制七个模块(学生信息输出模块的两个子模块直接归主菜单控制).在各模块间起到纽带的作用。在主菜单.可以通过选择进入其他模块.其他模块运行结束后也可回到主菜单继续选择。 b.学生信息录入模块:循环输入学生信息.建立临时的学生信息数据库。 c.学生信息查询模块:可选择按学号或者按姓名查询学生信息.如学生信息不存在则给出提示。
d.学生信息修改模块:查找到要修改的学生信息后.可对该学生的信息进行逐项修改。
e.学生信息删除模块:查找到要删除的学生信息后.可对其进行删除操作。
----完整版学习资料分享----
每门课程的平均成绩 课程成绩统计模块 按单科成绩排名次 =====WORD完整版----可编辑----专业资料分享=====
f.学生信息插入模块:在数据库末尾插入学生信息.逐项输入要插入的学生信息即可。
g.学生信息输出模块:输出优秀学生信息模块能够输出优秀学生(平均成绩大于等90分)的学号和姓名;输出不及格学生信息模块能够输出不及格学生的相关信息。
h.课程成绩统计模块:可以得到每门课程的平均成绩.还可以任意抽取一门课按单科成绩排定学生名次。
五、程序设计思想
结构化的程序设计主要靠设计和调用各模块的函数来实现。本程序设计了多个函数.每个函数自身能完成一个任务.有的函数和别的函数结合能完成更大的任务。每一个模块功能的实现其实就是对函数的调用.本说明首先介绍本程序所涉及的子函数.再介绍主函数.最后介绍程序整体的
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
实现过程。
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 na[50]) 这是两个“兄弟函数”.是按学号查找和按姓名查询模块中的两个重要函数。主要功能是根据用户输入的学号\\姓名返回改学生所在的的数组下标。利用for循环嵌套一个if语句实现.若找到学生该学生信息就返回数组下标.若找不到就返回-1。
4.void Seekinformation()\\void Printinformation(int x) 这两个函数关系紧密.所以一起介绍。void Seekinformation()函数利用for循环和if语句使查找中能够使用学号和姓名两种方式。如源程序所示.在用
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
if语句确定了查找方式后先后调用了int Searchbynum (int no)\\int Searchbyname (char na[50])和void Printinformation(int x)两个函数.根据int Searchbynum (int no)\\int Searchbyname (char na[50])返回的数组下标.运用void Printinformation(int x)输出所查询的内容。所以
int Searchbynum (int no)\\int Searchbyname (char na[50])\\void Seekinformation()\\void Printinformation(int x)这四个函数是查询模块的四个联系紧密的重要函数.在它们的共同作用下查询模块的功能得以实现。
5.void Modifyinformation() 此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据.达到修改的目的。本函数还调用了查找模块的函数.使修改前能按学号或姓名找到要修改的学生信息。修改过程中调用了Inputfun()函数
6.void Deleteinformation() 此函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for (i=x;i<999;i++) student[i]=student[i+1];从要删除的那一个数据开始.用后一个数据覆盖它.一直循环到最后.相当于把开始的第一个数据删除了。
7.void Insertinformaton() 此函数用于插入学生数据。由于没有用链表.所以选择插入在最后一个有效数据之后。本函数运用if(student[j].num==0)这个语句找到了最后一个有效数据之后的数组下标j,然后将数据输入到student[j]中.便完成的了插入。插入过程中.调用了Inputfun()函数。
8.void Showthefail() 此函数用于显示不及格学生的信息。能够按要求
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
输出不及格学生的学号、姓名、各科成绩以及平均成绩。首先用这条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;}
----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
通过一个数值输入函数.使用户在简单的数值输入后就可轻松调用各模块。
还使用了for (;;)使各模块能够循环调用。
11.最后对程序的整体实现过程作个简要说明。源程序中多处运用continue和break语句.同时配合scanf函数和if条件判断语句.使用户能够根据提示通过简单的数值输入来选择下一步该做什么。中文界面.用户很容易根据提示上手.简单易用。
六、程序流程图
系统启动口令输入a=? N a=1? Y 进入选择菜单 N Y N Y N 查找学生信息 Y c=3? c=2? 录入学生信息 c=1? 口令错误,系统即将关闭! 开始 ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享=====
N 修改学生信息 c=4? Y N c=5? N Y 删除学生信息 c=6? Y N 优秀学生信息 插入学生信息 c=7? N Y Y N 课程成绩统计 c=8? 不及格学生信息 N
结束 以上为主函数流程图.主函数下八个供选择的模块只是简单的用一个执行框表示。现分别画出八个模块的流程图: 1、录入学生成绩:
开始 输入学生信息及成绩
是否继续?继续按1,结束按0 · 1 0
结束
2、查找学生信息:
----完整版学习资料分享----
开始 =====WORD完整版----可编辑----专业资料分享=====
2 按学号查找请按1, 1 输出相应学号所对应的信息 输出相应姓名所对应的信息 按姓名查找请按2 1 是否继续?继续按1,结束按0 0 0 结束 3、修改学生信息:
输入修改后的信息 调用查找函数找到要修改的信息 开始 1 是否继续?继续按1,结束按0 0
4、删除学生信息:
开始 结束 ----完整版学习资料分享----
=====WORD完整版----可编辑----专业资料分享=====
1 是否继续?继续按1,结束按0 0
5、插入学生信息:
输入要插入的信息 开始 结束 是否删除?是按1,否按0 调用查找函数找到要删除的信息 1 删除成功
是否继续?继续按1,结束按0 1 0
6、优秀学生信息:
----完整版学习资料分享---- 学生平均成绩是否大于等于90? 开始 结束 =====WORD完整版----可编辑----专业资料分享=====
N Y Y 输出该生学号和姓名 N Y
7、不及格学生信息:
判断该生是否有不及格科目 N 开始 结束 检索完毕? Y
输出该该生学信息 N 检索完毕? Y
8、成绩统计模块:
----完整版学习资料分享----
开始 结束 =====WORD完整版----可编辑----专业资料分享=====
每门课程平均成绩请按 1 1,单科成绩排名请按2 2
输出该科选择要排名的科目 输出每门课程平均成绩
成绩排名 结束
七、源程序
#include struct stu/*定义结构体*/ {int num; char name[50]; char classes[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; }student[1000]; int a,b,c,d,x,i,j,k,s,y,flag; char s1[50],c1; ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== double f,t,gp,dp,yp,wp; /***********************录入、修改、插入学生信息三个模块调用了输入模块*************************************/ void Inputfun()/*输入学生信息模块*/ { for(; ;)/*设计死循环以至于在输入格式错误时可以再次输入*/ { printf(\"请输入班级名称:\\"); /*输入班级名称*/ scanf(\"%s\ if(strlen(s1)>20) { printf(\"您输入的班级名称过长!\\n\"); continue; } strcpy(student[i].classes,s1); break; /*格式正确后跳出死循环*/ } for(; ;) { printf(\"请输入学号:\\");/*输入学号*/ scanf(\"%d\ if(student[i].num<0) { printf(\"您输入的学号错误!\\n\"); continue; } student[i].num=b; break; } for(; ;) { printf(\"请输入姓名:\\");/*输入姓名*/ scanf(\"%s\ if(strlen(s1)>20) { printf(\"您输入的姓名过长!\\n\"); continue; } strcpy(student[i].name,s1); break; } for(; ;) { printf(\"请输入该生高等数学平时成绩:\\");/*输入各科平时成绩和考试成绩*/ ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].gsps_score=f; break; } for(; ;) { printf(\"请输入该生高等数学考试成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].gsks_score=f; student[i].gszh_score=student[i].gsks_score*0.7+student[i].gsps_score*0.3;/*按考试成绩70%平时成绩30%算该门课程的最终成绩*/ break; } for(; ;) { printf(\"请输入该生电路理论平时成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].dlps_score=f; break; } for(; ;) { printf(\"请输入该生电路理论考试成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].dlks_score=f; ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== student[i].dlzh_score=student[i].dlks_score*0.7+student[i].dlps_score*0.3; break; } for(; ;) { printf(\"请输入该生英语平时成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].yyps_score=f; break; } for(; ;) { printf(\"请输入该生英语考试成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].yyks_score=f; student[i].yyzh_score=student[i].yyks_score*0.7+student[i].yyps_score*0.3; break; } for(; ;) { printf(\"请输入该生物理平时成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].wlps_score=f; break; } for(; ;) { ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== printf(\"请输入该生物理考试成绩:\\"); scanf(\"%lf\ if(f>100||f<0) { printf(\"成绩不合理!请您输入合理的成绩.\\n\"); continue; } student[i].wlks_score=f; student[i].wlzh_score=student[i].wlks_score*0.7+student[i].wlps_score*0.3; student[i].pj_score=(student[i].yyzh_score+student[i].dlzh_score+student[i].gszh_score+student[i].wlzh_score)/4;/*计算每个学生的平均成绩*/ break; } } /*********************************录入学生信息模块***************************************/ void Getinformation() /*获得学生信息*/ { for (i=0;i<1000;i++)/*利用循环连续输入学生信息*/ { if(i==0) { system(\"cls\"); printf(\"请根据提示输入学生的信息\\n\\n\"); } else printf(\"请输入下一个学生的信息\\n\\n\"); Inputfun(); printf(\"继续请按1.返回主菜单请按0.\\n\"); scanf(\"%d\ if(a==0) break; } } /****************查询模块:包含四个函数.函数间有联系**********************************/ int Searchbynum (int no) /*按学号查找*/ { for (j=0;j<1000;j++) { if (student[j].num==no) ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== { return j; } } return -1; } int Searchbyname (char na[50])/*按姓名查找*/ { for (k=0;k<1000;k++) { if (strcmp(student[k].name,na)==0) { return k; } } return -1; } void Printinformation(int x)/*输出学生信息*/ { if (x==-1) printf(\"该学生信息不存在!\\n\"); else { printf(\"班级:%s\\n\printf(\"学号:%d\\n\printf(\"姓名:%s\\n\\n\ printf(\"高数平时成绩:%5.2f\\n\printf(\"高数考试成绩:%5.2f\\n\printf(\"高数综合成绩:%5.2f\\n\\n\printf(\"电路平时成绩:%5.2f\\n\printf(\"电路考试成绩:%5.2f\\n\printf(\"电路综合成绩:%5.2f\\n\\n\printf(\"英语平时成绩:%5.2f\\n\printf(\"英语考试成绩:%5.2f\\n\printf(\"英语综合成绩:%5.2f\\n\\n\printf(\"物理平时成绩:%5.2f\\n\printf(\"物理考试成绩:%5.2f\\n\printf(\"物理综合成绩:%5.2f\\n\\n\printf(\"平均成绩:%5.2f\\n\} } void Seekinformation()/*查询学生信息*/ ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== { for(; ;) { system(\"cls\"); printf(\"按学号查找请按1.按姓名查找请按2\\n\");/*提供两种查找方式*/ scanf(\"%d\if(a==1) { system(\"cls\"); printf(\"请输入要查找的学生的学号\\n\"); scanf(\"%d\ x=Searchbynum (d);/*调用按学号查找函数*/ Printinformation(x); } else if (a==2) { system(\"cls\"); printf(\"请输入要查找的学生的姓名\\n\"); scanf(\"%s\ x=Searchbyname (s1);/*调用按姓名查找函数*/ Printinformation(x); } printf(\"继续请按1.返回主菜单请按0.\\n\"); scanf(\"%d\ if(a==0) break; } } /*************************学生信息删改:包含三个相互独立的函数**********************************/ void Modifyinformation() /*修改学生信息*/ { for(; ;) { system(\"cls\"); printf(\"请先查找要修改的学生信息!\\n\\n\"); printf(\"按学号查找请按1.按姓名查找请按2\\n\");/*先查找后修改*/ scanf(\"%d\if(a==1) { system(\"cls\"); printf(\"请输入要查找的学生的学号\\n\"); scanf(\"%d\x=Searchbynum (d); } ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== else if (a==2) { system(\"cls\"); printf(\"请输入要查找的学生的姓名\\n\"); scanf(\"%s\ x=Searchbyname (s1); } if (x==-1) printf(\"学生信息不存在!\\n\"); else { printf(\"您要修改的学生信息为:\\n\"); Printinformation(x); printf(\"请您输入新值\\n\"); i=x; Inputfun(); } printf(\"继续请按1.返回主菜单请按0.\\n\"); scanf(\"%d\ if(a==0) break; } } void Deleteinformation() /*删除学生信息*/ { for (;;) { system(\"cls\"); printf(\"请先查找要删除的学生信息!\\n\\n\"); printf(\"按学号查找请按1.按姓名查找请按2\\n\"); scanf(\"%d\if(a==1) { system(\"cls\"); printf(\"请输入要查找的学生的学号\\n\"); scanf(\"%d\x=Searchbynum (d); } else if (a==2) { system(\"cls\"); printf(\"请输入要查找的学生的姓名\\n\"); scanf(\"%s\ x=Searchbyname (s1); } if (x==-1) ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== printf(\"学生信息不存在!\\n\"); else { printf(\"您要删除的学生信息为:\\n\"); Printinformation(x); printf(\"是否真的要删除该生信息?是请按1.否请按0.\\n\"); scanf(\"%d\if (a==1) { for (i=x;i<999;i++) student[i]=student[i+1];/*该数组后的数组向前移动以覆盖的方式删除该数组*/ printf(\"删除成功!\\n\"); } } printf(\"继续请按1.返回主菜单请按0.\\n\"); scanf(\"%d\ if(a==0) break; } } void Insertinformaton() /*插入学生信息*/ { system(\"cls\"); for(j=0;j<1000;j++) { if(student[j].num==0) { x=j; break; } } for(i=x;i<1000;i++) { system(\"cls\"); printf(\"请输入要插入的学生信息\\n\\n\"); Inputfun();/*利用信息录入函数把学生信息插在末尾*/ printf(\"继续请按1.返回主菜单请按0.\\n\"); scanf(\"%d\ if(a==0) break; } } /********各科成绩排序的四个程序********************/ void paixugs() /*排序1*/ { struct stu temp; ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== for (j=1;j<1000;j++) { for (k=0;k<999;k++) { if (student[k].gszh_score student[k]=student[k+1]; student[k+1]=temp; } } } system(\"cls\"); printf(\"学生成绩排序表:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) { printf(\"学号:%d\\ printf(\"姓名:%s\\ printf(\"第%d名:%5.2f\\n\ } printf(\"返回主菜单请按0\\n\"); scanf(\"%d\} void paixudl() /*排序2*/ { struct stu temp; for (j=1;j<1000;j++) { for (k=0;k<999;k++) { if (student[k].dlzh_score student[k]=student[k+1]; student[k+1]=temp; } } } system(\"cls\"); printf(\"学生成绩排序表:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== { printf(\"学号:%d\\ printf(\"姓名:%s\\ printf(\"第%d名:%5.2f\\n\ } printf(\"返回主菜单请按0\\n\"); scanf(\"%d\} void paixuyy() /*排序3*/ { struct stu temp; for (j=1;j<1000;j++) { for (k=0;k<999;k++) { if (student[k].yyzh_score student[k]=student[k+1]; student[k+1]=temp; } } } system(\"cls\"); printf(\"学生成绩排序表:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) { printf(\"学号:%d\\ printf(\"姓名:%s\\ printf(\"第%d名:%5.2f\\n\ } printf(\"返回主菜单请按0\\n\"); scanf(\"%d\} void paixuwl() /*排序4*/ { struct stu temp; for (j=1;j<1000;j++) { for (k=0;k<999;k++) { if (student[k].wlzh_score ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== student[k]=student[k+1]; student[k+1]=temp; } } } system(\"cls\"); printf(\"学生成绩排序表:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) { printf(\"学号:%d\\ printf(\"姓名:%s\\ printf(\"第%d名:%5.2f\\n\ } printf(\"返回主菜单请按0\\n\"); scanf(\"%d\} void Showthefail()/*显示不及格学生的情况*/ { system(\"cls\"); printf(\"不及格的学生:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) if(student[i].gszh_score<60||student[i].dlzh_score<60||student[i].yyzh_score<60||student[i].wlzh_score<60) {Printinformation(i);printf(\"--------------------\\n\");} printf(\"\\n返回主菜单请按0\\n\"); scanf(\"%d\} void Stu_p()/*优秀学生(平均分大于等于90分)信息*/ { system(\"cls\"); printf(\"平均分90以上的学生:\\n\\n\"); for (i=0;i<1000;i++) if (student[i].num!=0) if(student[i].pj_score>=90) {printf(\"学号:%d\\n\ printf(\"姓名:%s\\n\\n\printf(\"\\n返回主菜单请按0\\n\"); scanf(\"%d\ void Chengjitongji()/*按要求统计成绩*/ {int flag=0; double gp=0,dp=0,yp=0,wp=0; ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== system(\"cls\"); printf(\"每门课程平均成绩请按1.单科成绩排序请按2\\n\"); scanf(\"%d\if(s==1) { for (i=0;i<1000;i++) { gp+=student[i].gszh_score; dp+=student[i].dlzh_score; yp+=student[i].yyzh_score; wp+=student[i].wlzh_score; if (student[i].pj_score>0) flag++; }gp=gp/flag;dp=dp/flag;yp=yp/flag;wp=wp/flag; system(\"cls\"); printf(\"高等数学平均成绩:\%5.2f\\n\printf(\"电路理论平均成绩:\%5.2f\\n\printf(\"英语平均成绩:\%5.2f\\n\printf(\"物理平均成绩:\%5.2f\\n\printf(\"\\n返回主菜单请按0\\n\"); scanf(\"%d\if(s==2){ printf(\"请选择\\n\\n\"); printf(\"高等数学成绩排序请按1\\n\"); printf(\"电路理论成绩排序请按2\\n\"); printf(\"英语成绩排序请按3\\n\"); printf(\"物理成绩排序请按4\\n\"); scanf(\"%d\ if(y==1) paixugs();/*调用相应的排序函数*/ if(y==2) paixudl(); if(y==3) paixuyy(); if(y==4) paixuwl();}} /**************************************************************************************************/ void main() /*主函数*/ { printf(\"\\ **************************************\\n\\n\");/*开始界面*/ printf(\"\\ **********学生成绩管理系统**********\\n\\n\"); printf(\"\\ **********设计者:乐骏彦**********\\n\\n\"); printf(\"\\ *********指导老师:彭春华*******\\n\\n\"); printf(\"\\ ********通信工程0902班********\\n\\n\"); printf(\"\\ ********2011年6月30日*******\\n\\n\"); printf(\"\\ **************************\\n\\n\"); printf(\"\\n\\n\\n\\n\"); printf(\"请输入系统启动口令\\n\");/*启动口令*/ ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== scanf(\"%d\ if(a!=1) { printf(\"口令错误!系统即将关闭!\\n\"); exit(0); } for (;;) { system(\"cls\"); printf(\"请从主菜单选择您所需要的操作\\n\\n\");/*系统主菜单*/ printf(\"1.首次输入学生信息请按\\n\"); printf(\"2.查找学生信息\\n\"); printf(\"3.修改学生信息\\n\"); printf(\"4.删除学生信息\\n\"); printf(\"5.插入学生信息\\n\"); printf(\"6.优秀学生信息\\n\"); printf(\"7.不及格学生信息\\n\"); printf(\"8.课程成绩统计\\n\"); printf(\"0.退出\\n\"); scanf(\"%d\ 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; } } } 八、调试分析 调试程序比编写程序还要困难.花的时间也最多.对于整个程序的分析在程序设计思想一节里已经讨论过了.这里就不在赘述。而调试的过程 ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== 比较繁琐对于很多小错误也没有留心去记录.这里只举出一个我映像较深的例子来说明调试的过程。例如下面这段代码(按学号查找学生信息的函数) int Searchbynum (int no) /*按学号查找*/ {for (j=0;j<1000;j++) {if (student[j].num==no) { return j;}} return -1;} 我在刚开始时吧return -1;这句代码写到了for循环内部.编译时并没有错误.只有一条警告 “ warning C4715: 'Searchbynum' : not all control paths return a value ”.当时也没在意.然而当运行到学生信息查询模块时.只能查询第一个学生的数据.从第二个数据开始就无法查询到了。后来经过仔细检查才发现了这个错误。 通过这个例子.我明白了编程中出现语法错误机器会帮你找出.而出现逻辑错误想靠机器帮你找出的是不太可能的!所以在以后的编程中要尽量避免出现逻辑错误。 九、测试数据 如果把每一个功能的测试的结果都截图放到报告中来.将会占用很大的篇幅.所以这里只贴出在设计题目要求中着重提到的几个功能(优秀学生和不及格学生的信息输出、每门课程的平均成绩以及高等数学按学生成 ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== 绩的排序)的测试的数据。此次测试输入了5名学生的成绩进行测试.其中有两人为优秀学生.有两人有不及格的记录。测试截图如下: 各科平均成绩: ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== 高等数学成绩排名: 十、用户使用手册 此学生成绩管理系统为中文界面.提示清楚.界面友好.只要输入学生信息及成绩.即可自动生成优秀学生信息、不及格学生信息、各科成绩平 ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== 均分、以及各科成绩排名。还可以查找、修改、插入、删除学生信息与成绩.是一个较全面的成绩管理系统。 输入学生信息及成绩时请注意以下几点: 1、输入学生姓名和班级名称时不要过长(超过50个字符).否则系统会判定为恶意输入; 2、输入学号时请不要超过10位数字.否则也会被判定为恶意输入; 3、学生成绩分为平时成绩与考试成绩.输入时请看清楚.不要混淆; 4、输入学生成绩时请出入0到100之间的数.成绩不能小于0也不能大于100; 5、本管理系统最多可存储1000个学生的信息。 设计过程中质疑(或答辩)记载: 问: void Inputfun() 是做什么的? 答: void Inputfun() 此函数较特别.它只进行输入操作.用于输入学生信息。 ----完整版学习资料分享---- =====WORD完整版----可编辑----专业资料分享===== 指导教师评语: 签名: 年 月 日 ----完整版学习资料分享---- 因篇幅问题不能全部显示,请点此查看更多更全内容