数据结构课程设计报告学生成绩管理系统.docx
- 文档编号:13276846
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:40
- 大小:185.38KB
数据结构课程设计报告学生成绩管理系统.docx
《数据结构课程设计报告学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告学生成绩管理系统.docx(40页珍藏版)》请在冰点文库上搜索。
数据结构课程设计报告学生成绩管理系统
武汉理工大学华夏学院
课程设计报告书
课程名称:
数据结构课程设计
题目:
用C语言实现成绩统计程序的设计
系名:
信息工程系
专业班级:
计算机1121
姓名:
吴涛
学号:
指导教师:
司晓梅
2016年3月20日
武汉理工大学华夏学院信息工程系
课程设计任务书
课程名称:
数据结构课程设计指导教师:
司晓梅
班级名称:
计算机1121开课系、教研室:
信息系计算机
一、课程设计目的与任务
《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。
目的:
学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应操作,把现实世界中的问题转换为计算机内部的表示和处理,这就是一个良好的程序设计技能训练的过程。
提高学生的程序设计能力、掌握基本知识、基本技能,提高算法设计质量与程序设计素质的培养就是本门课程的课程设计的目的。
任务:
根据题目要求,完成算法设计与程序实现,并按规定写出课程设计报告。
二、课程设计的内容与基本要求
设计题目:
用C语言实现成绩统计程序的设计
〔问题描述〕给出n个学生的m门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法:
(1)输入每个人的各门课程的成绩,计算每人的平均成绩;
(2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次;
(3)按名次列出每个学生的姓名和各科成绩;
〔基本要求〕学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;
〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解;
具体要完成的任务是:
A.编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。
B.写出规范的课程设计报告书;
三、课程设计步骤及时间进度和场地安排
时间:
1周地点:
现代教育中心
具体时间安排如下:
第一天:
布置题目,确定任务、查找相关资料
第二天~第四天:
功能分析,编写程序,调试程序、运行系统;
第五天上午:
撰写设计报告;
第五天下午:
程序验收、答辩。
四、课程设计考核及评分标准
课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、答辩情况等各因素。
具体评分标准如下:
(1)设计方案正确,具有可行性、创新性;30分
(2)系统开发效果较好;20分
(3)设计报告规范、课程设计报告质量高;20分
(4)课程设计答辩时,问题回答正确;20分
(5)态度认真、刻苦钻研、遵守纪律;10分
按上述五项分别记分后求和,总分按五级制记载最后成绩。
优秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),不及格(0~59分)
一、问题描述..........................................5
二、基本要求..........................................5
三、数据结构设计......................................6
四、软件模块结构图....................................7
五、程序设计思想......................................9
六、程序流程图.......................................13
7、源程序...........................................18
八、调试分析.........................................32
九、测试数据.........................................33
十、用户使用手册.....................................35
一、问题描述
〔问题描述〕给出n个学生的m门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法:
(1)输入每个人的各门课程的成绩,计算每人的平均成绩;
(2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次;
(3)按名次列出每个学生的姓名和各科成绩;
〔基本要求〕学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;
〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解;
二、基本要求
〔基本要求〕学生的考试成绩必须通过键盘输入,且需对输出进行格式控制;
〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解;
三、数据结构的设计
为了对学生信息进行统一操作,使用了结构体这一数据结构,学生的各项数据信息都能用结构体来表示,具体如下:
structstu
{intnum;/*学号,整型变量*/
charname[50];/*姓名,长度为50的字符串数组*/
charclasses[50]/*班级名称,长度为50的字符串数组*/;
doublegsps_score;/*高等数学平时成绩,双精度实型变量*/
doublegsks_score;/*高等数学考试成绩,双精度实型变量*/
doublegszh_score;/*高等数学综合成绩,双精度实型变量*/
doubledlps_score;/*电路理论平时成绩,双精度实型变量*/
doubledlks_score;/*电路理论考试成绩,双精度实型变量*/
doubledlzh_score;/*电路理论综合成绩,双精度实型变量*/
doubleyyps_score;/*英语平时成绩,双精度实型变量*/
doubleyyks_score;/*英语考试成绩,双精度实型变量*/
doubleyyzh_score;/*英语综合成绩,双精度实型变量*/
doublewlps_score;/*物理平时成绩,双精度实型变量*/
doublewlks_score;/*物理考试成绩,双精度实型变量*/
doublewlzh_score;/*物理综合成绩,双精度实型变量*/
doublepj_score;/*平均成绩,双精度实型变量*/
}student[1000];/*最多存储1000个学生数据*/
该结构体数据定义为全局变量。
四、软件模块结构图
模块功能描述:
a.主菜单控制模块:
主菜单直接控制七个模块(学生信息输出模块的两个子模块直接归主菜单控制),在各模块间起到纽带的作用。
在主菜单,可以通过选择进入其他模块,其他模块运行结束后也可回到主菜单继续选择。
b.学生信息录入模块:
循环输入学生信息,建立临时的学生信息数据库。
c.学生信息查询模块:
可选择按学号或者按姓名查询学生信息,如学生信息不存在则给出提示。
d.学生信息修改模块:
查找到要修改的学生信息后,可对该学生的信息进行逐项修改。
e.学生信息删除模块:
查找到要删除的学生信息后,可对其进行删除操作。
f.学生信息插入模块:
在数据库末尾插入学生信息,逐项输入要插入的学生信息即可。
g.学生信息输出模块:
输出优秀学生信息模块能够输出优秀学生(平均成绩大于等90分)的学号和姓名;输出不及格学生信息模块能够输出不及格学生的相关信息。
h.课程成绩统计模块:
可以得到每门课程的平均成绩,还可以任意抽取一门课按单科成绩排定学生名次。
五、程序设计思想
结构化的程序设计主要靠设计和调用各模块的函数来实现。
本程序设计了多个函数,每个函数自身能完成一个任务,有的函数和别的函数结合能完成更大的任务。
每一个模块功能的实现其实就是对函数的调用,本说明首先介绍本程序所涉及的子函数,再介绍主函数,最后介绍程序整体的实现过程。
Inputfun()此函数较特别,它只进行输入操作,但由于此函数所包含的语句较长且需要被其他三个函数使用,为方便调用单写了一个函数。
此函数在源程序中放在最前,所以在此先作说明。
此函数可细分为11个小块,用来输入学生的基本数据。
每小块的结构基本相同即for(;;){基本语句+一个continue语句+基本语句+一个break语句}之所以用这个结构为了使输入的数据更加正规。
比如在分数的输入中就限定了只能输入0至100之间的数值,这也符合分数录入规则。
需要特别注意的是,这个函数完成了本程序中要做的两个计算。
其一是在每门课的考试试成绩输入后完成了对这门课的综合成绩的加权计算(考试成绩*+平时成绩*);其二是在最后一门课程的综合成绩算出后,计算了该学生四门课的平均成绩。
Getinformation()此函数用来录入学生信息。
它调用了voidInputfun()函数,其实它的主体部分就是voidInputfun()函数。
这函数还用了一个for循环以达到循环输入的目的。
Searchbynum(intno)\intSearchbyname(charna[50])这是两个“兄弟函数”,是按学号查找和按姓名查询模块中的两个重要函数。
主要功能是根据用户输入的学号\姓名返回改学生所在的的数组下标。
利用for循环嵌套一个if语句实现,若找到学生该学生信息就返回数组下标,若找不到就返回-1。
Seekinformation()\voidPrintinformation(intx)这两个函数关系紧密,所以一起介绍。
voidSeekinformation()函数利用for循环和if语句使查找中能够使用学号和姓名两种方式。
如源程序所示,在用if语句确定了查找方式后先后调用了intSearchbynum(intno)\intSearchbyname(charna[50])和voidPrintinformation(intx)两个函数,根据intSearchbynum(intno)\intSearchbyname(charna[50])返回的数组下标,运用voidPrintinformation(intx)输出所查询的内容。
所以
intSearchbynum(intno)\intSearchbyname(charna[50])\voidSeekinformation()\voidPrintinformation(intx)这四个函数是查询模块的四个联系紧密的重要函数,在它们的共同作用下查询模块的功能得以实现。
Modifyinformation()此函数用于修改学生信息。
基本原理就是用输入的新数据覆盖原来的老数据,达到修改的目的。
本函数还调用了查找模块的函数,使修改前能按学号或姓名找到要修改的学生信息。
修改过程中调用了Inputfun()函数
Deleteinformation()此函数用于删除学生信息。
同样调用了查找模块的函数。
删除模块的关键语句是for(i=x;i<999;i++)student[i]=student[i+1];从要删除的那一个数据开始,用后一个数据覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。
Insertinformaton()此函数用于插入学生数据。
由于没有用链表,所以选择插入在最后一个有效数据之后。
本函数运用if(student[j].num==0)这个语句找到了最后一个有效数据之后的数组下标j,然后将数据输入到student[j]中,便完成的了插入。
插入过程中,调用了Inputfun()函数。
Showthefail()此函数用于显示不及格学生的信息。
能够按要求输出不及格学生的学号、姓名、各科成绩以及平均成绩。
首先用这条if语句搜索该学生是否有成绩不及格,当四门课中至少有一门不及格时会输出该学生的相关信息。
Stu_p()此函数用于输出优秀学生(平均成绩大于90分)的信息,利用for循环和条件判断句输出找出相应的学生输出相关信息。
Chengjitongji()此函数用于按要求统计成绩。
有分别统计每门课的平均成绩的功能;还能够按每门课程的成绩对学生进行排序,使学生在该门课的表现一目了然。
排序中用到了冒泡排序的方法。
9.voidmain()下面对主函数作简要说明。
Switch语句是函数的主体:
switch(c)/*利用switch语句集成各个功能函数*/
{
case1:
Getinformation();break;/*获得学生信息*/
case2:
Seekinformation();break;/*查找学生信息*/
case3:
Modifyinformation();break;/*修改学生信息*/
case4:
Deleteinformation();break;/*删除学生信息*/
case5:
Insertinformaton();break;/*插入学生信息*/
case6:
Stu_p();break;/*显示优秀学生信息*/
case7:
Showthefail();break;/*显示不及格学生信息*/
case8:
Chengjitongji();break;/*课程成绩的统计*/
case0:
exit(0);/*退出*/
default:
break;
}
default:
break;}
通过一个数值输入函数,使用户在简单的数值输入后就可轻松调用各模块。
还使用了for(;;)使各模块能够循环调用。
11.最后对程序的整体实现过程作个简要说明。
源程序中多处运用continue和break语句,同时配合scanf函数和if条件判断语句,使用户能够根据提示通过简单的数值输入来选择下一步该做什么。
中文界面,用户很容易根据提示上手,简单易用。
六、程序流程图
N
Y
N
Y
N
Y
N
Y
N
YN
NY
Y
N
NY
Y
N
N
以上为主函数流程图,主函数下八个供选择的模块只是简单的用一个执行框表示。
现分别画出八个模块的流程图:
1、录入学生成绩:
·1
0
2、查找学生信息:
2
1
1
0
0
3、修改学生信息:
1
0
4、删除学生信息:
1
1
0
5、插入学生信息:
1
0
6、优秀学生信息:
N
Y
Y
N
Y
7、不及格学生信息:
N
Y
N
Y
8、成绩统计模块:
1
2
七、源程序
#include<>
#include<>
#include<>
#include<>
structstu/*定义结构体*/
{intnum;
charname[50];
charclasses[50];
doublegsps_score;
doublegsks_score;
doublegszh_score;
doubledlps_score;
doubledlks_score;
doubledlzh_score;
doubleyyps_score;
doubleyyks_score;
doubleyyzh_score;
doublewlps_score;
doublewlks_score;
doublewlzh_score;
doublepj_score;
}student[1000];
inta,b,c,d,x,i,j,k,s,y,flag;
chars1[50],c1;
doublef,t,gp,dp,yp,wp;
/***********************录入、修改、插入学生信息三个模块调用了输入模块*************************************/
voidInputfun()/*输入学生信息模块*/
{
for(;;)/*设计死循环以至于在输入格式错误时可以再次输入*/
{
printf("请输入班级名称:
\t");/*输入班级名称*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您输入的班级名称过长!
\n");
continue;
}
strcpy(student[i].classes,s1);
break;/*格式正确后跳出死循环*/
}
for(;;)
{
printf("请输入学号:
\t");/*输入学号*/
scanf("%d",&b);
if(student[i].num<0)
{
printf("您输入的学号错误!
\n");
continue;
}
student[i].num=b;
break;
}
for(;;)
{
printf("请输入姓名:
\t");/*输入姓名*/
scanf("%s",&s1);
if(strlen(s1)>20)
{
printf("您输入的姓名过长!
\n");
continue;
}
strcpy(student[i].name,s1);
break;
}
for(;;)
{
printf("请输入该生高等数学平时成绩:
\t");/*输入各科平时成绩和考试成绩*/
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].gsps_score=f;
break;
}
for(;;)
{
printf("请输入该生高等数学考试成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].gsks_score=f;
student[i].gszh_score=student[i].gsks_score*+student[i].gsps_score*;/*按考试成绩70%平时成绩30%算该门课程的最终成绩*/
break;
}
for(;;)
{
printf("请输入该生电路理论平时成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].dlps_score=f;
break;
}
for(;;)
{
printf("请输入该生电路理论考试成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].dlks_score=f;
student[i].dlzh_score=student[i].dlks_score*+student[i].dlps_score*;
break;
}
for(;;)
{
printf("请输入该生英语平时成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].yyps_score=f;
break;
}
for(;;)
{
printf("请输入该生英语考试成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].yyks_score=f;
student[i].yyzh_score=student[i].yyks_score*+student[i].yyps_score*;
break;
}
for(;;)
{
printf("请输入该生物理平时成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].wlps_score=f;
break;
}
for(;;)
{
printf("请输入该生物理考试成绩:
\t");
scanf("%lf",&f);
if(f>100||f<0)
{
printf("成绩不合理!
请您输入合理的成绩.\n");
continue;
}
student[i].wlks_score=f;
student[i].wlzh_score=student[i].wlks_score*+student[i].wlps_score*;
student[i].pj_score=(student[i].yyzh_score+student[i].dlzh_score+student[i].gszh_score+student[i].wlzh_score)/4;/*计算每个学生的平均成绩*/
break;
}
}
/*********************************录入学生信息模块***************************************/
voidGetinformation()/*获得学生信息*/
{
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",&a);
if(a==0)
break;
}
}
/****************查询模块:
包含四个函数,函数间有联系**********************************/
intSearchbynum(intno)/*按学号查找*/
{
for(j=0;j<1000;j++)
{
if(student[j].num==no)
{
returnj;
}
}
return-1;
}
intSearchbyname(charna[50])/*按姓名查找*/
{
for(k=0;k<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 学生 成绩管理系统