数据结构课程设计学生成绩管理系统.docx
《数据结构课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计学生成绩管理系统
数据结构课程设计
说明书
学院:
班级:
完成人:
姓名:
学号:
姓名:
学号:
指导教师:
山东科技大学
2012年12月08日
课程设计任务书
一、课程设计题目:
学生成绩管理
二、课程设计应解决的主要问题:
(1)从键盘输入学生数据
(2)显示所有学生成绩
(3)查询学生成绩
(4)在末尾增加学生
(5)在输入学号的位置的后面插入学生
(6)按学号删除学生
(7)显示不及格学生成绩
(8)按总成绩排序并输出成绩
(9)保存所有学生信息
(10)拷贝所有学生信息到文件中
(11)退出成绩管理系统
三、任务发出日期:
2012-9-4课程设计完成日期:
2010-12-8
小组分工说明
小组编号9题目:
学生成绩管理
小组分工情况:
整体构思由两人共同完成。
XXX:
追加学生函数StudentScore*Add_new(),插入学生函数void*Insert(),删除学生函数voidDelete(),查找学生函数voidSearch(),拷贝链表中的数据函数StudentScore*Copy(),保存学生信息函数voidPreserve(),main()函数。
YY:
从键盘输入学生成绩函数StudentScore*Input(),显示学生成绩函数voidShow(),显示拷贝学生成绩函数voidShowcopy(),按总成绩排序函数voidCompositor(),显示不及格学生成绩函数voidFail()。
课程设计说明书由XXX完成。
组长签字:
2012年12月8日
指导教师对课程设计的评价
成绩:
指导教师签字:
年月日
目录
1.需求分析说明…………….………………………4
2.概要设计说明.........................................................4
3.详细设计说明…………………………………….6
4.调试分析…………………………..……………..9
5.用户使用说明及测试结果………………….…….10
6.课程设计总结……………………...……….…….15
7.参考书目………………………..…………..…….16
8.附:
程序代码…………………………………….16
需求分析说明
1.需求分析
为了提高学生信息的管理效率,方便对学生信息进行管理、学校里面的学生和管理员方便去管理和查询学生信息,如果要进行查询,就得在众多的学生信息中查找自己的成绩信息,面对学院大量的学生信息,怎么可以即时而方便的管理,建立一个学生成绩管理系统,学生只要登录本系统就可以查找到自己的成绩信息,而管理员也方便去管理每学期的学生的成绩信息。
使学生信息管理工作规范化,系统化,程序化,提高信息处理的速度和准确性,能够及时、准确、有效的查询和管理学生信息。
建立学生成绩管理系统可使学院教职员工减轻工作压力,比较系统地对教务、教学上的各项服务和信息进行管理,同时,可以减少劳动力的使用,加快查询速度、加强管理,使各项管理更加规范化。
学生成绩管理系统主要提供成绩查询,学生可以通过该系统查阅与自己相关信息,管理员可以通过成绩管理系统查阅学生成绩信息。
2.功能分析
“学生成绩管理系统”实现的功能包括:
输入学生信息,输出学生信息,按姓名查找并显示学生信息,按学号查找并显示学生信息,添加学生信息,插入学生信息,按学号删除该学生信息,按总成绩排序并输出成绩,显示不及格学生信息,拷贝所有学生信息,保存学生信息,退出管理系统。
本系统根据学生成绩管理的需要,而建立一个“学生成绩管理系统”,以方便对成绩的各项管理操作。
本系统能对成绩进行输入和输出;能按总成绩对学生进行排序,并显示学生成绩等,不过得以系统输入学生资料、成绩为前提;能添加学生成绩资料;能根据学生的姓名和学号来查询该学生的成绩信息,或是删除该学生信息;能把对系统所进行的操作进行备份,保存,以及时更新系统中的数据。
这些模块既相互联系又相互独立。
概要设计说明
系统总体框架
学生成绩的结构体类型定义为:
typedefstructStudentScore
{
intstunum;//学生学号
charstuname[20];//学生姓名
floatscore1;//语文成绩
floatscore2;//数学成绩
floatscore3;//英语成绩
floatsum;//总成绩
structStudentScore*next;
}StudentScore;
StudentScore*head=(StudentScore*)malloc(sizeof(StudentScore));
//定义一个单链表头结点并申请结点空间
StudentScore*headcopy=(StudentScore*)malloc(sizeof(StudentScore));
//定义另一个单链表头结点并申请结点空间
intn=0;//定义全局变量n,用以对学生人数计数
函数及功能:
StudentScore*Input();//从键盘输入学生成绩
voidShow();//显示学生成绩
voidShowcopy();//显示拷贝学生成绩
StudentScore*Add_new();//在链表末尾追加学生
void*Insert();//插入学生
voidDelete();//根据用户输入的学号删除该学生
voidSearch();//按学号或姓名查找学生
voidCompositor();//按总成绩排序
voidFail();//显示不及格学生成绩
StudentScore*Copy();//拷贝链表中的数据
voidPreserve();//保存学生信息
详细设计说明
主菜单包含在主函数里面,首先出现一个界面。
printf("\n\t\t*****学生成绩管理系统********\n");
printf("\t\t*\t1.从键盘输入学生数据\t\t*\n");
printf("\t\t*\t2.显示学生成绩\t\t\t*\n");
printf("\t\t*\t3.查询学生成绩\t\t\t*\n");
printf("\t\t*\t4.追加学生\t\t\t*\n");
printf("\t\t*\t5.插入学生\t\t\t*\n");
printf("\t\t*\t6.按学号删除学生\t\t*\n");
printf("\t\t*\t7.显示不及格学生成绩\t\t*\n");
printf("\t\t*\t8.按总成绩排序并输出成绩\t*\n");
printf("\t\t*\t9.保存所有学生信息\t\t*\n");
printf("\t\t*\t10.拷贝所有学生信息\t\t*\n");
printf("\t\t*\t0.退出成绩管理系统\t\t*\n");
printf("\t\t********************\n\n");
printf("请输入你要执行的操作:
");
下面是main()的调用
{
case1:
Input();
Show();break;
case2:
Show();break;
case3:
Search();break;
case4:
Add_new();break;
case5:
Insert();break;
case6:
Delete();break;
case7:
Fail();break;
case8:
Compositorw();break;
case9:
Preserve();break;
case10:
Copy();break;
case0:
system("pause");return0;
}
(1)输入学生信息模块:
是通过Input()和Show()两个函数来实现的。
主要功能用来对学生的成绩进行输入。
在学生信息保存在系统中的前提下,成绩录入需要输入学生信息,比如学号,姓名。
在准确输入学生信息后,就可以对该学生的各科成绩进行录入。
该学生各科成绩输入成功后,系统会提示是否继续进行操作,如果想继续输入学生成绩就继续输入学生的学号,不想再输入学生成绩的话就输入0,输入0之后会输出一下当前所有学生信息,因为在输入之后调用了一下输出函数,并且统计输入学生的总人数。
然后按任意键返回主菜单。
(2)输出学生信息模块:
是通过Show()函数实现的。
主要功能用来对学生的成绩进行输出。
在系统已经录入了学生信息的前提下,使用该功能可以显示所有学生的信息。
具体包括学生的学号,姓名,各科成绩,总成绩和平均成绩。
在查看学生的成绩等各方面的信息后,按任意键就可以返回到主菜单。
(3)查找并显示学生信息模块:
是通过Search()函数实现的。
主要功能是用来查找学生资料。
在系统保存了某学生资料的前提下,查找该学生资料。
在主菜单进入查找后,会有子菜单,根据子菜单选择1按学号查找,或者选择2按姓名查找,或者选择0退出查找。
输入该学生学号或者姓名后,系统就会显示该学生学号,姓名,各科成绩,总成绩和平均成绩。
根据提示继续输入学号或姓名将继续查找,第一次输入0表示结束按学号或姓名查找第二次输入0表示结束查找,然后按任意键即可返回主菜单。
(4)追加学生模块:
是通过Add_new()函数实现的。
主要功能是用来在链表末尾添加学生信息。
在主菜单中进入次模块后就可增加学生了,输入学生学号,姓名,各科成绩等。
在成功添加学生信息后,就可以对该学生进行其他的操作。
增加一个节点t,t中存放追加学生的信息,将t连接到最后一个结点后边,t->next=NULL。
(5)插入学生信息模块:
是通过Insert()函数实现的。
主要功能是用来插入学生信息。
进入此模块后,用户先输入要插入位置的前一个学号,系统自动找到输入的学号之后,用户就可进行输入要插入学生的信息。
继续输入学号将继续插入,输入0表示结束插入。
在成功插入学生信息后,就可以对该学生进行其他的操作。
(6)删除学生信息模块:
是通过Delete()函数实现的。
主要功能是用来删除学生信息。
在系统保存学生信息的前提下,想删除某学生的信息,可以输入学生的学号,系统查找到该学生学号后,先显示一下该学生的信息和成绩,就成功删除了。
由于学生辍学,毕业等原因,及时对系统进行更新,删除一些没用的信息,可以使系统更加优化。
(7)显示不及格学生成绩:
是通过Fail()函数实现的。
主要功能用来对不及格学生的成绩进行输出。
在系统已经录入了学生信息的前提下,使用该功能可以显示不及格学生的信息(只要有一科成绩不及格,就认为该生不及格)。
具体也包括学生的学号,姓名,各科成绩,总成绩和平均成绩,并且统计不及格学生的人数。
(8)按总成绩排序并输出成绩:
是通过Compositor()函数实现的。
主要功能是用来对学生的总成绩进行排序。
在系统保存学生信息和成绩的前提下,使用此功能可以对学生的总成绩进行排序,这样就方便查看学生的总体成绩情况。
p=head->next,利用冒泡排序的思想,q结点中的总成绩依次和其后边结点r中的总成绩进行比较,若有(q->sum)<(r->sum),则交换一下结点中的信息,两层for循环实现排序。
(9)保存所有学生信息模块:
是通过Preserve()函数实现的。
主要功能是用来储存学生信息。
在对系统进行一系列操作,比如输入、追加、插入、删除、排序等,将学生信息保存在名为studentscore的文本文档中。
对系统的最新操作进行保存,及时更新系统信息,方便下一次的操作。
(10)拷贝所有学生信息:
是通过Copy()函数实现的。
主要功能是用来拷贝学生信息。
在系统已经录入了学生信息的前提下,或者在对系统进行一系列操作,比如输入、追加、插入、删除、排序等之后,将学生信息拷贝一遍。
(11)保存学生信息并退出系统模块:
是通过Preserve()函数实现的。
主要功能是退出学生成绩管理系统。
在退出学生成绩管理系统之前先先自动保存一下学生信息。
这样就避免在进行一系列操作,比如添加、插入、删除、排序等之后,退出系统而忘记保存的情况。
调试分析
我遇到的问题:
1.删除模块:
我输入一个要删除的学号,显示删除成功!
但输出一下删除学生的信息,输出的学生的学号和姓名是乱码。
解决问题:
显示一下当前所有学生信息,发现删除成功。
再检查输出,检查指针指向的学号和姓名变量,发现没有错误;重新检查整个函数,发现错误原因是我在free(q)(q是要删除的结点)之后输出的被删除学生的信息。
结点已经释放掉了,所以不知道q指的会是什么。
2.按总成绩排序模块:
输入几个学生后,选择按总成绩排序,发现输出的是原来的顺序,根本没排序。
解决问题:
利用printf发现进入了if循环,但是输出的却是没排序的成绩。
仔细分析指针的指向,值交换了但指针的指向不对。
最终我决定利用指针不动,只交换值的方法。
改完之后发现学号,姓名和各科成绩交换了总成绩和平均成绩却没交换,仔细检查觉得函数没问题就是不知道为什么。
通过向同学请教后来才发现程序运行过程中没进入我写的排序函数,而是调用了我电脑中其他程序的排序函数。
最后换了一个路径才解决了这个问题。
3.查找模块:
此模块包括按学号查找和按姓名查找,我选择按学号查询完之后还想按姓名查找,但是程序没有进行查找,一直出现“1、按学号查询;2、按姓名查询;0、我不查询了。
”字样。
解决问题:
通过测试发现没进入按姓名查找循环,检查所编写的程序代码是否完全正确,通过重新一点一点改写程序代码,一遍一遍测试,最终解决了这个问题。
4.保存模块:
我已经输入了学生信息,保存时为读写建立一个新的文本文档studentscore.txt,但仍出现“文件不存在”字样。
解决问题:
我把if((fp=fopen("studentscore.txt","w+"))==NULL);语句改成fp=fopen("studentscore.txt","w+");if(!
fp)后就能成功保存。
后一种写法是先建立一个studentscore.txt文本文档,然后将学生信息写进去。
用户使用说明及测试结果
运行程序,首先进入的是学生成绩管理系统主菜单界面,如图1所示,根据菜单上的提示选择相应的序号进行操作。
图1学生成绩管理系统主菜单界面
当用户选择1后,开始输入学生信息,输入学号,姓名,语文,数学和英语成绩,当学号输入为0时结束输入,输出一下当前所有学生的信息,如图2所示。
图2输入学生信息并显示学生信息
当用户选择3后,会出现“1、按学号查询;2、按姓名查询;0、我不查询了。
”的子菜单,按1选择按学号查询,按2选择按姓名查询,输入正确的学号或姓名后会输出相应的学生成绩,如图3所示。
输入0退出查询子菜单,再输入0退出查询,再按任意键返回到主菜单界面。
图3查找学生并输出学生成绩
用户选择4后,追加一个学生,输入要追加学生的信息后,输入0结束输入,显示一下当前学生成绩表,如图4所示。
图4追加学生并输出追加后的学生成绩表
用户选择6后,输入要删除学生的学号后显示一下删除学生的信息,如图5所示。
图5删除学生并显示要删除学生的信息
删除学生成功后,回到主菜单,按2显示当前学生成绩表,如图6所示。
图6删除后的学生成绩表
用户选择5后,插入学生信息并输出当前学生成绩表,如图7所示。
图7插入后的学生成绩表
用户选择8后,系统将按当前所有学生的总成绩进行排序,并输出排序后的学生成绩表,如图8所示。
图8排序后的学生成绩表
课程设计总结
在我和我的搭档的共同努力下,我们最终完成了对此程序的编译及试运行。
通过这次数据结构课程设计,使我对程序的设计有了一个比较深刻的了解。
首先是要设计整个程序的框架,确定各个功能函数;然后一个个具体地对他们进行编程,并且仔细检查看是否有错;在完成这一步之后才开始构造主函数,通过主函数把各个功能函数联系起来,编译修改错误和不足之处。
在实际编程过程中会遇到很多不同的错误,经过很多次的修改与调试,有时候是一些很明显很细节的语法错误,这些可以通过编译来查找错误的所在,然而那些并不明显难以查找的隐性错误真让人头痛,只好利用断点调试来一步步检查代码中的错误,这样为了找一个错误花费了大量的时间,但是找出错误之后会让我记忆尤为深刻。
在做这个课程设计的时候,涉及到很多学过的内容,比如链表的插入、删除操作,再比如把链表中的数据保存到文件中等等,因此我们就得翻书重新看他们的用法。
这样不仅把以前学过的知识重新复习一遍,还能有效的把那些零散的知识点相结合,并运用。
同时也学到了一些没学过的知识,让我从中受益匪浅。
熟悉了一些基本操作和解决问题的方法。
总之,此次学生成绩管理系统的设计给我们提供了一个既动手又动脑、自学、独立实践的机会,使我们养成了勤翻阅各种相关资料的习惯,将书本上的理论知识和实际有机地结合起来,锻炼了实际分析问题和解决问题的能力,提高了适应实际、实践编程的能力,为今后的学习和实践打下了良好的基础。
参考书目
[1]数据结构(c语言版),严蔚敏吴伟民,清华大学出版社
[2]程序设计基础——基于c语言,孙承爱赵卫东,科学出版社
[3]数据结构经典算法实现与习题解答,汪杰,人民邮电出版社
[4]数据结构与算法(c语言版),郭龙源胡虚怀何光明,清华大学出版社
附:
程序代码
#include
#include
#include
typedefstructStudentScore
{
intstunum;//学生学号
charstuname[20];//学生姓名
floatscore1;//语文成绩
floatscore2;//数学成绩
floatscore3;//英语成绩
floatsum;//总成绩
structStudentScore*next;
}StudentScore;
StudentScore*head=(StudentScore*)malloc(sizeof(StudentScore));
//定义头结点并申请结点空间
StudentScore*headcopy=(StudentScore*)malloc(sizeof(StudentScore));
intn=0;//定义全局变量n,用以对学生人数计数
//函数声明
StudentScore*Input();
voidShow();
voidShowcopy();
StudentScore*Add_new();
void*Insert();
voidDelete();
voidSearch();
voidCompositor();
voidFail();
StudentScore*Copy();
voidPreserve();
/*****从键盘输入学生成绩*****/
StudentScore*Input()
{
intnumber;
StudentScore*p1,*p2;
head=(StudentScore*)malloc(sizeof(StudentScore));//分配空间
p2=head;
printf("\n请输入第%d名学生的学号,学号为0表示结束输入:
",n+1);
scanf("%d",&number);
while(getchar()!
='\n');
for(;number;)
{
n++;
p1=(StudentScore*)malloc(sizeof(StudentScore));
p1->stunum=number;
printf("请输入第%d名学生的姓名:
",n);
scanf("%s",p1->stuname);
printf("请输入第%d名学生的语文成绩:
",n);
scanf("%f",&p1->score1);
printf("请输入第%d名学生的数学成绩:
",n);
scanf("%f",&p1->score2);
printf("请输入第%d名学生的英语成绩:
",n);
scanf("%f",&p1->score3);
p1->sum=p1->score1+p1->score2+p1->score3;
p2->next=p1;
p2=p1;
printf("\n请输入第%d名学生的学号,没有此学生则输入0表示结束:
",n+1);
scanf("%d",&number);
}
p2->next=NULL;
printf("\n\n");
return(head);
}
/*****显示学生成绩*****/
voidShow()
{
StudentScore*p;
p=head->next;
if(p==NULL)
{
printf("\n\n此系统目前没有任何学生数据!
\n\n\n");
return;
}
printf("目前共有学生%d名:
\n",n);
printf("*********学生成绩统计一览*********\n\n");
printf("学号\t姓名\t语文成绩\t数学成绩\t英语成绩\t总分\t平均分\n");
for(;p;p=p->next)
{
printf("%d\t",p->stunum);
printf("%s\t",p->stuname);
printf("%.1f\t\t",p->score1);
printf("%.1f\t\t",p->score2);
printf("%.1f\t\t",p->score3);
printf("%.1f\t",p->sum);
printf("%.1f\n",(p->sum)/3);
}
}
/*****显示拷贝学生成绩*****/
voidShowcopy()
{
StudentScore*p;
p=headcopy->next;
if(p==NULL)
{
printf("\n\n此系统目前没有任何学生数据!
\n\n\n");
return;
}
printf("目前共有学生%d名:
\n",n);
printf("*********学生成绩统计一览*********\n\n");
printf("学号\t姓名\t语文成绩\t数学成绩\t英语成绩\t总分\t平均分\n");
for(;p;