资源描述
唐 山 学 院
数据结构 课 程 设 计
题 目 学生成绩管理系统设计与实现
系 (部) 计算机科学与技术系
班 级 11计本1班
姓 名 尹云
学 号 4112006102
指导教师 张小松
2013 年 1 月 4 日至 1 月 11 日 共 2 周
2013 年 1 月 11 日
数据结构 课程设计任务书
一、设计题目、内容及要求
1、设计题目:学生成绩管理系统设计与实现。
2、设计内容及要求:
(1)查询功能:可以通过姓名、学号进行查询学生成绩,同时可以查询有不及格科目的学生。
(2)录入功能:能够录入学生成绩(包括:学号、姓名、至少3门课程的成绩、总分、平均分等信息)。总分和平均分自动计算。
(3)排序功能:能够对学生成绩进行排序并可以浏览排序结果。
(4)统计功能:能够统计出优秀、良好、中等、及格和不及格这五个等级的人数。
二、要求的设计成果(课程设计说明书、设计实物、图纸等)
1、用C语言进行程序设计,实现系统的功能。注重算法效率,代码要有适当的注释;
2、撰写课程设计说明书一份,不少于2000字。课程设计说明书应包括封面、任务书、成绩评定表、正文(设计思路、设计步骤等)、参考文献(资料)、附录(程序代码)等内容。
三、进程安排
1月4日:进行需求分析,确定系统的主要功能和算法思路;
1月5日~1月6日:进行详细设计,确定各模块的算法思路;
1月7日~1月8日:进行编码实现;
1月9日~1月10日:进行测试调试,完善设计;撰写设计说明书,准备答辩;
1月11日:答辩。
四、主要参考资料
1.严蔚敏,吴伟民.数据结构.清华大学出版社,2007.
2.苏仕华.数据结构课程设计.机械工业出版社,2010.
3.滕国文.数据结构课程设计.清华大学出版社,2010.
指导教师(签名):
教研室主任(签名):
课程设计成绩评定表
出勤
情况
出勤天数
缺勤天数
成
绩
评
定
出勤情况及设计过程表现(20分)
课设答辩(20分)
设计成果(60分)
总成绩(100分)
提问
(答辩)
问题
情况
综
合
评
定
指导教师签名:
年 月 日
唐山学院课程设计
1引言
学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要。为了提高学校管理员和学生管理和查询学生成绩的效率,需要建立一个学生成绩管理系统,使我们可以在众多的学生信息中查找自己的成绩信息,面对学院大量的学生信息,学生只要登录本系统就可以查找到自己的成绩信息,而管理员也方便去管理每学期的学生的成绩信息。学生成绩管理系统,使学生成绩信息管理工作规范化、系统化、程序化,避免学生管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改学生信息。学生成绩管理系统有效地管理学生成绩相关信息,包括学生成绩的查询、录入、排序、统计等功能。该系统为用户提供了一个简单的人机界面,用户可以根据提示信息进行各种操作。
本次设计使用的编程语言是C语言。
2问题分析
根据设计题目要求分析如下:
(1) 本题目主要涉及顺序表的基本操作。
(2) 在学生成绩管理系统中,录入学生信息时通常按录入顺序的先后,因此选用线性表。在查找学生信息时,是在大量无序的学生信息中,通过比较所给关键字与对应信息项,找到所要查找的学生信息。修改学生信息是在查找的基础上完成的,首先要找到需要修改的信息项,用输入的新数据覆盖原来的老数据,达到修改的目的。删除学生信息也是在查找的基础上完成的,先找到要删除的学生信息,从要删除的那个信息项开始,用后一个信息项覆盖它,一直循环到最后,即可完成删除。在查询不及格的学生信息时,只要把符合不及格的学生信息输出即可做到查询。在统计不同等级的学生人数时,是想要根据划分的不同等级,将所有学生信息分成符合条件的几个部分。
学生信息的存储结构:
struct STU/*定义学生信息结构体*/
{
int num;/*学号*/
char name[20];/*姓名*/
double Data;/*数据结构成绩*/
double Math;/*高等数学成绩*/
double English;/*大学英语成绩*/
double sum;/*总成绩*/
double ave;/*平均成绩*/
}STU,stu[100000]
3总体设计
3.1 模块结构图
输入
退出
学生成绩管理系统
删除
统计
修改
排序
查询
查找
图3.1 系统模块结构图
输入:学生信息的录入。
查找:按学号或姓名查找学生成绩,输入关键字,查找指定信息记录并输出。
修改:通过调用查找函数,找到要修改的学生信息,输入新数据覆盖原先的数据。
删除:通过调用查找函数,找到要删除的学生信息,用后一项覆盖前一项。
查询:查询各科成绩不及格的学生成绩,输出其学生信息。
排序:按总成绩排序,并输出排序后学生信息。
统计:分别统计各个等级的学生人数,并输出各个等级的学生人数。
退出:结束程序运行。
3.2 总体流程图
开始
系统启动密码输入x=?
x=123456?
N
Y
进入系统功能表
密码错误系统重启
c=1?
Y
N
c=2?
录入学生信息
Y
N
查找学生信息
c=3?
Y
修改学生信息
c=4?
N
Y
c=5?
删除学生信息
N
Y
查询不及格信息
c=6?
N
Y
总成绩排序
N
c=7?
Y
N
统计学生信息
N
c=0
Y
结束
图3.2 系统流程图结构图
4详细设计
4.1 录入模块
该模块实现的功能是从键盘录入学生信息。
4.1.1设计思路
void Getinformation() 此函数用来录入学生信息。此函数用while循环达到循环输入的目的,只要输入的学号有效(在所有学号的范围内且不等于-1),就可以实现学生信息的不断录入,用-1做结束录入的标志。
开始
4.1.2流程图
1
输入学生信息
是否继续?继续按1,结束按-1
1
-1
结束
结束
图4.1 录入模块程序流程图
4.2 查找模块
该模块实现的功能是根据所给的学生信息(关键字),查找该学生的全部信息并输出。
4.2.1设计思路
在void Seekinformation()函数中,用while循环可以实现循环输入查找信息,用if语句可以实现按学号和姓名两种查找方式。用if语句确定查找方式,通过调用void Seeknum()或void Seekname()函数实现查找。在void Seeknum()(void Seekname())函数中,用for循环逐次查找,通过用if语句比较学号(姓名),返回符合条件的标号,并调用Printinformation()函数输出该生的所有信息。判断是否继续查找,继续查找则进入以上环境,否则退出查找。
开始
4.2.2流程图
2
按学号查找按1
按姓名查找按2
2
输出相应姓名
所对应的信息
输出相应学号
所对应的信息
1
是否继续?继续按1;结束按10
1
10
结束
图4.2 查找模块程序流程图
4.3 修改模块
该模块的实现的功能是根据需要修改学生信息。
4.3.1设计思路
在Modifinformation()函数中,此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据,达到修改的目的。本函数还调用了查找模块的函数,使修改前能按学号或姓名找到要修改的学生信息。
开始
4.3.2流程图
修改学生信息
3
输入要修改后的信息
是否继续?继续按1,结束按10
1
10
结束
图4.3 修改学生信息模块程序流程图
4.4 删除模块
该模块实现的功能是删除指定的学生信息
4.4.1设计思路
Deleteformation()此函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for(j=x;j<i-1;j++)stu[j]=stu[j+1],从要删除的那一个信息项开始,用后一个信息项覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。
4.4.2流程图开始
删除的学生信息
4
是否删除?是按1,否按2
2
1
删除成功
是否继续?继续按1,结束按10
1
10
结束
图4.4 删除学生信息模块程序流程图
4.5 查询模块
该模块实现的功能是查询不及格(某科成绩低于60分)的学生信息并输出。
4.5.1设计思路
void Showfail() 此函数用于显示不及格学生的信息。能够按要求输出不及格学生的学号、姓名、各科成绩、平均成绩、总成绩。首先在for循环中用if语句搜索该学生是否有成绩不及格,当三门课中至少有一门不及格时就会输出该学生的相关信息。
4.5.2流程图开始
5
判断是否有不及格的学生信息科目
N
输出该生的学生信息
Y
检索完毕?
N
Y
结束
图4.5 查询不及格的学生信息模块程序流程图
4.6 排序模块
该模块实现的功能是按学生总成绩对学生信息排序并输出排序后的结果。
4.6.1设计思路
Lineup函数用来对学生信息按总成绩进行排序。Lineup函数在排序时用的是冒泡排序法,冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大(则升序,小则降序。本程序一律采用降序)则交换两数。
开始
4.6.2流程图
6
m=1
m<i
<
N
输出已排
序的信息
n=m+1
Y
m++
n<i+1?
<
N
Y
结束
stu[m].sum<stu[n].sum?
Y
互换stu[m].sum与stu[n].sum
n++
N
图4.6 冒泡排序的模块程序流程图
4.7 统计模块
该模块的实现的功能是统计各个等级的学生人数并输出各等级的人数。
4.7.1设计思路
void Count()函数统计各个等级(优秀、良好、中等、及格、不及格)的学生人数。函数用switch语句划分出不同等级,用for循环依次判断每个学生所处的等级,并记录每个等级的人数。
4.7.2流程图开始
判断每个学生的成绩等级
(10、9、8、7、6、<6)
7
8
6
<6
=10
9
7
X++
结束
图4.7 统计不同等级学生的人数模块程序流程图
5运行测试
进入演示程序后即可显示的界面:
图5.0.1 系统进入
输入密码错误显示的界面:
图5.0.2 输入密码正确后的功能表
输入密码正确显示的界面:
图5.0.3 输入密码正确后的功能表
1、执行功能1,依次录入学生信息:
1.1录入第1个学生信息:
1.2录入第2个学生信息:
1.3录入第3个学生信息:
1.4录入第4个学生信息:
1.5录入第5个学生信息:
1.6录入第6个学生信息:
1.7结束录入!
图5.1 结束录入
2、执行功能2,按一定方式查找学生信息:
2.1按学号查找学生信息:
图5.2.1查找学号不存在
2.2继续按学号查找学生信息:
图5.2.2 查找学号存在
2.3按姓名查找的学生信息:
图5.2.3 查找姓名存在
2.4继续按姓名查找学生信息:
图5.2.4 查找姓名不存在
2.5退出查找:
图5.2.5 退出查找
3、 执行功能3,修改学生信息:
3.1执行修改学生信息功能:
图5.3.1 修改学生信息
3.2退出修改功能:
图5.3.2 退出修改
4、 执行功能4,删除学生信息:
4.1执行删除学生信息功能:
图5.4.1 删除学生信息
4.2退出删除功能:
图5.4.2 退出删除
5、 执行功能5,查询不及格的学生信息:
图5.5 查询不及格学生信息
6、 执行功能6,用冒泡法按总成绩对学生信息排序:
图5.6 按总成绩学生信息排序
7、 执行功能7,统计不同等级学生的人数:
图5.7 统计不同等级学生人数
8、 执行功能0,退出该系统:
图5.8 退出系统
9、 选择功能数字错误:
图5.9 重选功能
6总结
(1)综合实践过程的收获
通过本次的综合实践,收获颇多。对过去学习的数据结构与算法分析的相关知识进行了汇总。同时也自学了许多相关知识。通过调用各种功能函数实现对相关数据的具体操作。实践出真知,在课堂上,接受理论的知识,且把每一个内容都细分切块,最终学到的却不能完全有效的整合到一起,在做这个课程设计的时候,涉及到很多学过的内容。因此就必须要查阅很多课本和书籍,这样不仅把以前学过的快遗忘的知识重新复习一遍,还能有效的把那些零散的知识点相结合,并运用。通过这次综合实践,加强了对实践操作的要求,不但要掌握理论知识,还要通过自己动手操作,在实践中充分理解理论知识,使自己的理论水平上升到更高层次,此外在此次实践中,自学能力得到了增强,这是这次综合实践过程中的最大收获。
(2)遇到问题以及解决问题的思路和方法
通过本次得综合实践,在编写学生成绩管理系统程序代码的过程中遇到了很多的问题。如果录入的学生信息数量非常大时,用此系统的查找效率就比较低,所以此系统用于信息量比较少。由于学生人数不确定,可能造成存储空间的浪费。由于自己本身编程能力的问题,实现的功能非常有限,只可以进行简单的信息录入、查找、修改、删除、查询、排序、统计等简单功能。在每个模块也存在不足的地方,如输入学生信息时,对每个信息项没有严格的规定,所以在输入信息时要提起注意。
(3)程序调试能力的思考
在调试过程中逐渐学会了编译器的调试功能。学会读懂程序中出错时所报出的错误提示信息。并能够根据这些信息找到相应的错误,及时改正。
(4)在综合实践设计过程中对《数据结构》课程的认识
通过这次综合设计,对《数据结构》课程有了更深的认识。对于从事计算机专业的的人士来说,学习数据结构和算法都是有必要的。算法是对输入数据的处理,以产生解决问题的输出的过程。从实践的角度来看,我们必须了解计算机领域中不同问题的一系列标准算法以及计算机程序加工的对象之间的关系;此外,我们还要具备设计新算法和分析其效率的能力。要清楚地知道、算法和程序三者之间的关系及相应的技术。
参考文献
[1] 严蔚敏,吴伟民.数据结构.北京:清华大学出版社,2008.
[2] 苏仕华.数据结构课程设计.北京:机械工业出版社,2010.
[3] .滕国文.数据结构课程设计.北京:清华大学出版社,2010.
附录
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct STU/*定义学生信息结构体*/
{
int num;/*学号*/
char name[20];/*姓名*/
double Data;/*数据结构成绩*/
double Math;/*高等数学成绩*/
double English;/*大学英语成绩*/
double sum;/*总成绩*/
double ave;/*平均成绩*/
}STU,stu[100000];
int i=1;/*统计录入学生人数*/
int a,d,w;
char b[20];
void Getinformation()/*录入学生信息,用-1结束录入*/
{
stu[0].sum=0;stu[0].ave=0;
printf("1、录入学生信息功能(用-1结束信息录入):\n");
printf("学号:");
scanf("%d",&stu[i].num);
while((stu[i].num!=-1)&&(stu[i].num<=100000))/*确定输入的学号有效*/
{
printf("姓名:");scanf("%s",&stu[i].name);
printf("数据结构成绩:");scanf("%lf",&stu[i].Data);
printf("高等数学成绩:");scanf("%lf",&stu[i].Math);
printf("大学英语成绩:");scanf("%lf",&stu[i].English);
stu[i].sum=stu[i].Data+stu[i].Math+stu[i].English;
stu[i].ave=stu[i].sum/3;
i++;
printf("学号:");
scanf("%d",&stu[i].num);
}
if(stu[i].num==-1)printf("结束录入!\n");
printf("\n");
}
int Seeknum(int no)/*按学号查找*/
{
int j;
for(j=1;j<i;j++)
if(stu[j].num==no)return j;
return -1;
}
int Seekname(char b[20])/*按姓名查找*/
{
int k;
for(k=1;k<i;k++)
if(strcmp(stu[k].name,b)==0)return k;
return -1;
}
void Printinformation(int x)/*输出学生信息*/
{
if(x==-1)printf("该学生信息不存在!\n");
else
{
printf("-------------- %d %s %.2lf %.2lf %.2lf %.2lf %.2lf\n",stu[x].num,stu[x].name,stu[x].Data,stu[x].Math,stu[x].English,stu[x].sum,stu[x].ave);
}
}
void Seekinformation()/*查找学生信息*/
{
int x;
printf("2、查找学生信息功能:\n");
while(1)/*可以循环输入查找信息*/
{
printf("按学号查找按 1 按姓名查找按 2\n");
scanf("%d",&a);
if(a==1)
{
printf("输入要查找的学号:");
scanf("%d",&d);
x=Seeknum(d);/*调用按学号查找函数*/
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
Printinformation(x);
}
else if(a==2)
{
printf("输入要查找的姓名:");
scanf("%s",&b);
x=Seekname(b);/*调用按姓名查找函数*/
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
Printinformation(x);
}
printf("继续查找请按 1,退出查询请按 10\n");
scanf("%d",&a);
if(a==10)break;
}
}
void Modifinformation()/*修改学生信息*/
{
int x;
printf("3、修改学生信息功能:\n");
while(1)
{
printf("请先查找要修改的学生信息!\n");
printf("按学号查找按 1 按姓名查找按 2\n");
scanf("%d",&a);
if(a==1)
{
printf("输入要查找的学号:");
scanf("%d",&d);
x=Seeknum(d);/*调用按学号查找函数*/
}
else if(a==2)
{
printf("输入要查找的姓名:");
scanf("%s",&b);
x=Seekname(b);/*调用按姓名查找函数*/
}
if(x==-1)printf("该学生信息不存在!\n");
else
{
printf("输出要修改的信息:\n");
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
Printinformation(x);
printf("输入新信息:\n");
w=x;
printf("--------------学号 姓名 数据结构 高等数学 大学英语\n");
scanf("%d %s %lf %lf %lf",&stu[w].num,&stu[w].name,&stu[w].Data,&stu[w].Math,&stu[w].English);
stu[w].sum=stu[w].Data+stu[w].Math+stu[w].English;
stu[w].ave=stu[w].sum/3;
}
printf("继续修改请按 1,退出此功能请按 10\n");
scanf("%d",&a);
if(a==10)break;
}
}
void Deleteformation()/*删除学生信息*/
{
int x;
int j;
printf("4、删除学生信息功能:\n");
while(1)
{
printf("请先查找要删除的学生信息:\n");
printf("按学号查找按 1 按姓名查找按 2\n");
scanf("%d",&a);
if(a==1)
{
printf("输入要查找的学号:");
scanf("%d",&d);
x=Seeknum(d);/*调用按学号查找函数*/
}
else if(a==2)
{
printf("输入要查找的姓名:");
scanf("%s",&b);
x=Seekname(b);/*调用按姓名查找函数*/
}
if(x==-1)printf("该学生信息不存在!");
else
{
printf("输出要删除的信息:\n");
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
Printinformation(x);
printf("确认删除请按 1 不删除请按 2\n");
scanf("%d",&a);
if(a==1)
{
for(j=x;j<i;j++)
stu[j]=stu[j+1];/*用元素以覆盖的方式向前移动来删除元素*/
printf("删除成功!\n");i--;
}
}
printf("继续删除请按 1,退出此功能请按 10\n");
scanf("%d",&a);
if(a==10)break;
}
}
void Showfail()/*查询不及格(某科成绩低于60分)学生信息*/
{
int j,flag=0;
printf("5、查询不及格学生信息功能:\n");
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
for(j=1;j<i;j++)
{
if(stu[j].Data<60)
{
flag=1;
printf("输出数据结构成绩不及格的学生信息:\n");
Printinformation(j);
}
if(stu[j].Math<60)
{
flag=1;
printf("输出高等数学成绩不及格的学生信息:\n");
Printinformation(j);
}
if(stu[j].English<60)
{
flag=1;
printf("输出大学英语成绩不及格的学生信息:\n");
Printinformation(j);
}
}
if(flag==0)printf("不存在某科成绩不及格的学生!\n");
}
void Lineup()/*用冒泡法按总成绩排序*/
{
struct STU t;
double max;
int m,n,j;
printf("6、按总成绩对学生信息排序功能:\n");
max=stu[1].ave;
for(m=1;m<i;m++)
for(n=m+1;n<i+1;n++)
{
if(max<stu[n].ave)
{
t=stu[n];
stu[n]=stu[m];
stu[m]=t;
max=stu[n].ave;
}
}
printf("--------------学号 姓名 数据结构 高等数学 大学英语 总成绩 平均成绩\n");
printf("输出按总成绩排序的学生信息:\n");
for(j=1;j<i;j++)
{
Printinformation(j);
}
printf("\n");
}
void Count()/*统计不同等级学生的人数*/
{
int j,A=0,B=0,C=0,D=0,E=0;
printf("7、统计不同等级学生人数的功能:\n");
for(j=1;j<i;j++)
switch(int(stu[j].ave/10))/*利用switch语句统计各个等级的学生人数*/
{
case 10:
case 9:A++;break;/*统计优秀学生人数*/
case 8:B++;break;/*统计良好学生人数*/
case 7:C++;break;/*统计中等学生人数*/
case 6:D++;brea
展开阅读全文