1、学号 武汉理工大学华夏学院 课程设计汇报书 课程名称: 数据结构 题 目:用C语言实现成绩统计程序设计 系 名: 信息工程系 专业班级: 软件工程1121 姓 名: 指导老师: 黄启荃 年 6月 28日 课程设计任务书 设计题目:用C语言实现成绩统计
2、程序设计 设计目标 1.巩固和加深课堂所学知识、学会分析研究数据对象特征及数据组织方法; 2.选择适宜数据逻辑结构和存放结构和对应操作,实现一个班成绩统计 3. 提升程序设计能力、加强查阅、利用资料能力、算法分析和程序设计素质培养 ; 设计任务 (在要求时间内完成下列任务) 〔问题描述〕给出n个学生m门课程考试成绩信息,每条信息由姓名、课程代号和分数组成,要求设计算法: (1)输入每个人各门课程成绩,计算每人平均成绩; (2)按平均成绩高低次序,打印出出个人名次,平均成绩相同为同一名次; (3)按名次列出每个学生姓名和各科成绩; 〔基础要求〕 学生考试成绩必需经过键盘输入
3、且需对输出进行格式控制; 〔算法提醒〕能够用选择排序、冒泡排序等多个排序算法求解; 具体要完成任务是: A. 编制完成上述问题C语言程序、进行程序调试并能得出正确运行结果。 B. 写出规范课程设计汇报书; 时间安排:6月24日---28日 第一天 部署题目,确定任务、查找相关资料 第二天~第四天 功效分析,编写程序,调试程序、运行系统; 第五天 程序验收、答辩;撰写设计汇报。 具体要求 1. 课程设计汇报按统一通用格式书写,具体内容以下: ① 设计任务和要求 ② 总体方案和说明 ③ 软件关键模块步骤图 ④ 源程序清单和注释 ⑤ 问题分析
4、和处理方案(包含调式汇报,即在调式过程中碰到关键问题、处理方法及改善设想); ⑥ 小结和体会 附录:① 源程序(必需有简单注释) ② 使用说明 ③ 参考资料 2.每位学生应独立完成各自任务且天天最少在设计室工作半天; 指 导 教 师 签 名: 年 6月 22日 教研室主任(或责任老师)署名: 6月 24日 1.设计题目及要求 1.1设计题目 用C语言实现成绩统计程序设计。 1.2具体任务 对学生信息(包含学号、语文、数学、英语、平均分)进行管理,包含学生成绩信息输入、输出、查询、删除、
5、排序、统计、退出.将学生成绩信息进行统计,信息内容包含:(1)学生学号(2)学生姓名(3)学生成绩。假设,现搜集到了一个班学生全部成绩信息,要求用C语言编写一个简单成绩管理系统,可进行录入、查询、修改和浏览等功效。学习相关开发工具和应用软件,熟悉系统建设过程。 2.系统设计思想 2.1 系统设计思想 在编写成绩统计管理系统程序过程中利用结构体,把问题中所包含变量定义在结构体中,利用函数来管理学生成绩,循环语句控制所选择选择界面,case语句进行选择。然后利用相关变量函数把学生成绩统计下来,利用循环语句再回到选择界面,利用查找函数,统计函数来查找统计学生成绩,利用冒泡排序法来对学生平均成绩
6、进行排序。然后按成绩高低对学生进行排名。 2.2 系统算法设计 2.2.1系统模块结构图 系统结构图2-1所表示 图2-1 系统结构图 结束 开始 菜单显示 菜单选择 输入 退出 输出 保留 查找 排序 统计 插入 删除 2.2.2主函数步骤图 主函数图2-2所表示 结束 判定输入数 int num; char name[20];int score[3]; float average; 开始 输入选择操作 t=4 t=2 t=1 插入数
7、据 查找 t=3 输出信息 输入 信息 选择排序法排序平均数 保留文件 按学号删除 输出平均分成绩 记载对应模块并进行处理 图2-2 主函数步骤图 3.系统调试和运行 3.1开发环境 Visual C++6.0,Microsoft Windows XP 3.2程序调试 3.2.1主界面调试 选择界面图3-1所表示 图3-1 选择界面截图 3.2.2成绩录入模块成绩录入界面 录入界面图3-2所表示
8、 图3-2 成绩录入模块 3.2.3成绩查询模块 成绩查询界面图3-3所表示 图3-3 成绩查询模块 3.2.4成绩统计模块 成绩统计界面图3-4所表示 图3-4 成绩统计模块 4.设计评价和修改 在数据结构课程设计过程中,很多知识点全部没有学过,全部要靠自己到课外资料中去查找。在用时候难免出现这么那样错误。如开始设计出来菜单不是预想那样,而是窗中出现混乱,要经过自己一遍遍调试和修改,和老师同学帮助下逐步改善完善,最终才逐步成型。运行也基础达成所需要运算要求。 5.心得和体会 回顾起此次课程设计,我感慨颇多,从拿
9、到题目到完成整个编程,从理论到实践,在整整一个礼拜日子里,能够学到很多很多东西,同时不仅能够巩固了以前所学过知识,而且学到了很多在书本上所没有学到过知识。经过这次课程设计使我们知道了理论和实际相结合是很关键,只有理论知识是远远不够,只有把所学理论知识和实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提升自己实际动手能力和独立思索能力。在设计过程中碰到问题,能够说得是困难重重,这毕竟第一次做,难免会碰到过多种多样问题,同时在设计过程中发觉了自己不足之处,对以前所学过知识了解得不够深刻,掌握得不够牢靠,比如说结构体。经过这次课程设计以后,一定把以前所学过知识熟悉了,此次课程设计结束了,我
10、们经过这次实践学到了很多知识。学到了设计一个简单系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我们处理问题能力,同时也使我们了解到团体合作可贵.编写程序是件细心活,稍不留神就会犯错,这就必需要求我们对待事情要认真!在编写程序过程中,错误不停出现,不一样类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能中途而废。 每一次课程设计全部是一次对自己曾经学习知识检验,经过每次实践,使自己认识之前不足和缺点,利于以后更正和以后学习发展方向,期望每一次课程设计全部能有一个很好提升 参考文件 [1]詹春华
11、李小艳 黄启荃•《计算机应用基础》•科学出版社 .5
[2]詹春华 杨沙•《C语言程序设计》•科学出版社.8
[3]谭浩强·C语言程序设计·北京·清华大学出版社,1月。
[4]徐孝凯 魏荣•《数据结构》•机械工业出版社•1996年
[5]徐孝凯•《数据结构简明教程》•清华大学出版社•1995年
[6]陈文博 朱青•《数据结构和算法》•机械工业出版社•1996年
附录:程序代码
#include
12、 typedef struct student //学生信息 { int no; char name[MAX_NAME]; double Chinese; double math; double English; double mark_ave; double mark_tot; } STUDENT; /*-----------输入信息子程序---------*/ void input(STUDENT *data, int *len) { int no; putchar('\n'); printf("%s\n", "请输入新统计
13、假如需要退出目前菜单请输入-1."); printf("%s\n", "格式:\n学号\n"); printf("%s\n", "姓名 语文 数学 英语"); putchar('\n'); printf("如:\n"); printf("1\n"); printf("小明 93 95 89\n"); scanf("%d", &no); while(no != -1) { data[*len].no = no; scanf("%s %lf %lf %lf", data[*len].name, &data[*len].Chinese, &data[*l
14、en].math,&data[*len].English); data[*len].mark_ave=(data[*len].Chinese+data[*len].math+data[*len].English)/3.0; data[*len].mark_tot=data[*len].Chinese+data[*len].math+data[*len].English; (*len)++; scanf("%d", &no); } } /*---------------输出信息子程序---------------*/ void output(STUDENT *data
15、 int len) { int i; system("cls"); printf("%8s", "学号"); printf("%8s", "姓名"); printf("%8s", "语文"); printf("%8s", "数学"); printf("%10s", "英语"); printf("%12s", "平均分"); printf("%10s", "总分"); putchar('\n'); for (i =0; i < 80; i++) putchar('='); putchar('\n'); fo
16、r (i = 0; i< len; i++) { printf("%8d", data[i].no); printf("%8s", data[i].name); printf("%8.1lf", data[i].Chinese); printf("%8.1lf", data[i].math); printf("%10.1lf", data[i].English); printf("%12.1lf", data[i].mark_ave); printf("%10.1lf", data[i].mark_tot);
17、 putchar('\n');
}
for (i =0; i < 80; i++)
putchar('=');
putchar('\n');
printf("按回车键继续.");
getchar();
getchar();
}
/*--------------排序子程序------------*/
void sort(STUDENT *data, int len)
{
int i,j,k;
STUDENT temp;
for (i=0; i 18、 j++)
if (data[k].mark_ave > data[j].mark_ave) k=j;
if (k != i) {
temp = data[i];
data[i] = data[k];
data[k] = temp;
}
}
}
/*--------------------搜索子程序-----------------------*/
void find(STUDENT *data, int len)
{
int find_no, result ;
int i;
lab: result=0; 19、
printf("%s\n", "请输入需要查找学生学号,退出目前菜单请输入 -1.");
scanf("%d", &find_no);
if (find_no == -1) return; /*exit the fine sub program*/
while( data[result].no != find_no && result < len) result ++;
if (result >= len ) {
printf("%s\n", "未查询到相关信息");
goto lab;
}
else {
20、 system("cls");
printf("%s\n", "查询信息以下:");
for (i =0; i < 80; i++)
putchar('=');
putchar('\n');
printf("%8s", "学号");
printf("%8s", "姓名");
printf("%8s", "语文");
printf("%8s", "数学");
printf("%10s", "英语");
printf("%12s", "平均分");
printf("%10s", " 21、总分");
putchar('\n');
printf("%8d", data[result].no);
printf("%8s", data[result].name);
printf("%8.1lf", data[result].Chinese);
printf("%8.1lf", data[result].math);
printf("%10.1lf", data[result].English);
printf("%12.1lf", data[result].mark_ave);
printf("%10.1 22、lf", data[result].mark_tot);
putchar('\n');
for (i =0; i < 80; i++)
putchar('=');
putchar('\n');
goto lab;
}
}
/*-----------------插入子程序-------------*/
void insert(STUDENT *data, int *len)
{
int no, pos;
double Chinese, math, English, mark_ave, mark_tot;
int i 23、
char name[MAX_NAME];
lab: printf("%s\n", "输入新统计,退出目前菜单请输入-1.");
printf("%s\n", "格式:学号");
printf("%s\n", " 姓名 语文 数学 英语");
scanf("%d", &no);
if (no == -1) return;
data[*len].no = no;
scanf("%s %lf %lf %lf", name, &Chinese, &math, &English);
mark_ave=(Chinese+math 24、English)/3.0;
mark_tot=Chinese+math+English;
pos = 0;
while ((data[pos].mark_ave < mark_ave) && (pos < *len) )
pos ++;
for (i = *len-1; i >= pos; i--)
data[i+1] = data[i];
data[pos].no = no;
strcpy(data[pos].name, name);
data[pos].Chinese = Chinese;
data[po 25、s].math = math;
data[pos].English = English;
data[pos].mark_ave = mark_ave;
data[pos].mark_tot = mark_tot;
(*len)++;
goto lab;
}
/*-------------删除子程序--------------*/
void delete_item(STUDENT *data, int *len)
{
int no, i, pos;
lab: pos=0;
printf("%s\n", "输入需要删除学生学号,退出目 26、前菜单请输入-1.");
scanf("%d", &no);
if (no == -1) return;
while( (data[pos].no != no) && (pos < *len) ) pos = pos +1;
if (pos >= *len) {
printf("%s\n", "未找到需要删除学生");
goto lab;
}
else {
for (i = pos+1;i < *len; i++)
data[i-1] = data[i];
*len = *len -1;
27、 if (*len == 0) {
printf("%s\n", "没有任何统计,请按回车键返回.");
getchar();
getchar();
return;
}
goto lab;
}
}
/*---------------统计子程序------------*/
void stat(STUDENT *data, int len)
{
int no_59=0, no_69=0, no_79=0, no_89=0, no_100=0;
int i;
for (i = 0;i < le 28、n; i++) {
if (data[i].mark_ave <=59) no_59++;
else if (data[i].mark_ave <=69) no_69++;
else if (data[i].mark_ave <=79) no_79++;
else if (data[i].mark_ave <= 89) no_89++;
else no_100++;
}
system("cls");
for (i =0; i < 80; i++)
putchar('=');
putchar('\n');
printf(" 29、10s", "分数");
printf("%10s", "0--59");
printf("%10s", "60--69");
printf("%10s", "70--79");
printf("%10s", "80--89");
printf("%10s", "90--100");
putchar('\n');
putchar('\n');
printf("%10s", "学生");
printf("%10d", no_59);
printf("%10d", no_69);
printf("%10d", no_79);
30、 printf("%10d", no_89);
printf("%10d", no_100);
putchar('\n');
for (i =0; i < 80; i++)
putchar('=');
putchar('\n');
printf("按回车键返回");
getchar();
getchar();
}
/*---------------显示信息子程序------------*/
void paint()
{
int i;
system("cls");
printf("%55s\n", "武汉理工大学华夏学院 31、学生成绩管理系统\n");
printf(" 制作者:武汉理工大学华夏学院软件1121班钟伟 \n");
for (i = 0; i < 80; i++)
putchar('=');
putchar('\n');
printf(" 1 输入信息 2 输出信息\n");
printf(" 3 按平均分排序 4 按学号查找\n");
printf(" 5 插入 32、 6 按学号删除\n");
printf(" 7 按平均分输出统计信息 8 保留到文件\n");
printf(" 0 退出\n");
for (i = 0; i<= 79; i++)
putchar('=');
putchar('\n');
printf("%s\n", "请输入各操作对应序号:");
}
void save(STUDENT *data, int len)//将数据保留到文件
{
int i;
FILE *fp;
fp 33、fopen("成绩统计表.txt","w");
fprintf(fp,"%8s", "学号");
fprintf(fp,"%8s", "姓名");
fprintf(fp,"%8s", "语文");
fprintf(fp,"%8s", "数学");
fprintf(fp,"%10s", "英语");
fprintf(fp,"%12s", "平均分");
fprintf(fp,"%10s\n", "总分");
fprintf(fp,"=========================================================== 34、\n");
putchar('\n');
for (i = 0; i< len; i++)
{
fprintf(fp,"%8d", data[i].no);
fprintf(fp,"%8s", data[i].name);
fprintf(fp,"%8.1lf", data[i].Chinese);
fprintf(fp,"%8.1lf", data[i].math);
fprintf(fp,"%10.1lf", data[i].English);
fprintf(fp,"%12.1lf", 35、 data[i].mark_ave);
fprintf(fp,"%10.1lf\n", data[i].mark_tot);
}
fprintf(fp,"========================================================================\n");
fclose(fp);
printf("文件已保留到\"成绩统计表.txt\"");
getchar();getchar();
}
/*-----------主程序--------------*/
void main()
{
STUDENT 36、data[MAXN];
int len = 0;
char ctrl_ch;
paint();
scanf("%c", &ctrl_ch);
while (ctrl_ch != '0') {
switch(ctrl_ch) {
case '1':
input(data, &len);
break;
case '2':
output(data, len);
break;
case '3':
sort(data, len);
break;
case '4':
find(data, 37、 len);
break;
case '5':
insert(data, &len);
break;
case '6':
delete_item(data, &len);
break;
case '7':
stat(data, len);
break;
case '8':
save(data, len);
break;
default:
if (ctrl_ch != '\n') printf("%s\n", "输入错误!");
break;
}
if (ct 38、rl_ch != '\n') paint();
scanf("%c", &ctrl_ch);
}
}
设计过程中质疑(或答辩)记载:
1.提问:数据在程序中是怎样存放?
答:数据是以数组形式存放在结构体数组中。
2.提问:怎样实现由用户自己选择学生个数和科目数?
答:经过改变宏定义所定义数目来改变,或经过输入语句来由用户自己确定。
指导老师评语:
署名:
7 月 1 日






