资源描述
学号
武汉理工大学华夏学院
课程设计汇报书
课程名称: 数据结构
题 目:用C语言实现成绩统计程序设计
系 名: 信息工程系
专业班级: 软件工程1121
姓 名:
指导老师: 黄启荃
年 6月 28日
课程设计任务书
设计题目:用C语言实现成绩统计程序设计
设计目标
1.巩固和加深课堂所学知识、学会分析研究数据对象特征及数据组织方法;
2.选择适宜数据逻辑结构和存放结构和对应操作,实现一个班成绩统计
3. 提升程序设计能力、加强查阅、利用资料能力、算法分析和程序设计素质培养 ;
设计任务 (在要求时间内完成下列任务)
〔问题描述〕给出n个学生m门课程考试成绩信息,每条信息由姓名、课程代号和分数组成,要求设计算法:
(1)输入每个人各门课程成绩,计算每人平均成绩;
(2)按平均成绩高低次序,打印出出个人名次,平均成绩相同为同一名次;
(3)按名次列出每个学生姓名和各科成绩;
〔基础要求〕 学生考试成绩必需经过键盘输入,且需对输出进行格式控制;
〔算法提醒〕能够用选择排序、冒泡排序等多个排序算法求解;
具体要完成任务是:
A. 编制完成上述问题C语言程序、进行程序调试并能得出正确运行结果。
B. 写出规范课程设计汇报书;
时间安排:6月24日---28日
第一天
部署题目,确定任务、查找相关资料
第二天~第四天
功效分析,编写程序,调试程序、运行系统;
第五天
程序验收、答辩;撰写设计汇报。
具体要求
1. 课程设计汇报按统一通用格式书写,具体内容以下:
① 设计任务和要求
② 总体方案和说明
③ 软件关键模块步骤图
④ 源程序清单和注释
⑤ 问题分析和处理方案(包含调式汇报,即在调式过程中碰到关键问题、处理方法及改善设想);
⑥ 小结和体会
附录:① 源程序(必需有简单注释) ② 使用说明 ③ 参考资料
2.每位学生应独立完成各自任务且天天最少在设计室工作半天;
指 导 教 师 签 名: 年 6月 22日
教研室主任(或责任老师)署名: 6月 24日
1.设计题目及要求
1.1设计题目
用C语言实现成绩统计程序设计。
1.2具体任务
对学生信息(包含学号、语文、数学、英语、平均分)进行管理,包含学生成绩信息输入、输出、查询、删除、排序、统计、退出.将学生成绩信息进行统计,信息内容包含:(1)学生学号(2)学生姓名(3)学生成绩。假设,现搜集到了一个班学生全部成绩信息,要求用C语言编写一个简单成绩管理系统,可进行录入、查询、修改和浏览等功效。学习相关开发工具和应用软件,熟悉系统建设过程。
2.系统设计思想
2.1 系统设计思想
在编写成绩统计管理系统程序过程中利用结构体,把问题中所包含变量定义在结构体中,利用函数来管理学生成绩,循环语句控制所选择选择界面,case语句进行选择。然后利用相关变量函数把学生成绩统计下来,利用循环语句再回到选择界面,利用查找函数,统计函数来查找统计学生成绩,利用冒泡排序法来对学生平均成绩进行排序。然后按成绩高低对学生进行排名。
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
插入数据
查找
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所表示
图3-2 成绩录入模块
3.2.3成绩查询模块
成绩查询界面图3-3所表示
图3-3 成绩查询模块
3.2.4成绩统计模块
成绩统计界面图3-4所表示
图3-4 成绩统计模块
4.设计评价和修改
在数据结构课程设计过程中,很多知识点全部没有学过,全部要靠自己到课外资料中去查找。在用时候难免出现这么那样错误。如开始设计出来菜单不是预想那样,而是窗中出现混乱,要经过自己一遍遍调试和修改,和老师同学帮助下逐步改善完善,最终才逐步成型。运行也基础达成所需要运算要求。
5.心得和体会
回顾起此次课程设计,我感慨颇多,从拿到题目到完成整个编程,从理论到实践,在整整一个礼拜日子里,能够学到很多很多东西,同时不仅能够巩固了以前所学过知识,而且学到了很多在书本上所没有学到过知识。经过这次课程设计使我们知道了理论和实际相结合是很关键,只有理论知识是远远不够,只有把所学理论知识和实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提升自己实际动手能力和独立思索能力。在设计过程中碰到问题,能够说得是困难重重,这毕竟第一次做,难免会碰到过多种多样问题,同时在设计过程中发觉了自己不足之处,对以前所学过知识了解得不够深刻,掌握得不够牢靠,比如说结构体。经过这次课程设计以后,一定把以前所学过知识熟悉了,此次课程设计结束了,我们经过这次实践学到了很多知识。学到了设计一个简单系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我们处理问题能力,同时也使我们了解到团体合作可贵.编写程序是件细心活,稍不留神就会犯错,这就必需要求我们对待事情要认真!在编写程序过程中,错误不停出现,不一样类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能中途而废。
每一次课程设计全部是一次对自己曾经学习知识检验,经过每次实践,使自己认识之前不足和缺点,利于以后更正和以后学习发展方向,期望每一次课程设计全部能有一个很好提升
参考文件
[1]詹春华 李小艳 黄启荃•《计算机应用基础》•科学出版社 .5
[2]詹春华 杨沙•《C语言程序设计》•科学出版社.8
[3]谭浩强·C语言程序设计·北京·清华大学出版社,1月。
[4]徐孝凯 魏荣•《数据结构》•机械工业出版社•1996年
[5]徐孝凯•《数据结构简明教程》•清华大学出版社•1995年
[6]陈文博 朱青•《数据结构和算法》•机械工业出版社•1996年
附录:程序代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXN 35
#define MAX_NAME 256
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", "请输入新统计,假如需要退出目前菜单请输入-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[*len].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, 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');
for (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);
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<len-1; i++) {
for (k=i, j=i+1; j<len; 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;
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 {
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", "总分");
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.1lf", 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;
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+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[pos].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", "输入需要删除学生学号,退出目前菜单请输入-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;
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 < len; 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("%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);
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", "武汉理工大学华夏学院学生成绩管理系统\n");
printf(" 制作者:武汉理工大学华夏学院软件1121班钟伟 \n");
for (i = 0; i < 80; i++)
putchar('=');
putchar('\n');
printf(" 1 输入信息 2 输出信息\n");
printf(" 3 按平均分排序 4 按学号查找\n");
printf(" 5 插入 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=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,"========================================================================\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", 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 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, 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 (ctrl_ch != '\n') paint();
scanf("%c", &ctrl_ch);
}
}
设计过程中质疑(或答辩)记载:
1.提问:数据在程序中是怎样存放?
答:数据是以数组形式存放在结构体数组中。
2.提问:怎样实现由用户自己选择学生个数和科目数?
答:经过改变宏定义所定义数目来改变,或经过输入语句来由用户自己确定。
指导老师评语:
署名:
7 月 1 日
展开阅读全文