数据结构课程设计学生成绩管理系统.docx

上传人:b****5 文档编号:4575274 上传时间:2022-12-06 格式:DOCX 页数:31 大小:331.35KB
下载 相关 举报
数据结构课程设计学生成绩管理系统.docx_第1页
第1页 / 共31页
数据结构课程设计学生成绩管理系统.docx_第2页
第2页 / 共31页
数据结构课程设计学生成绩管理系统.docx_第3页
第3页 / 共31页
数据结构课程设计学生成绩管理系统.docx_第4页
第4页 / 共31页
数据结构课程设计学生成绩管理系统.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

数据结构课程设计学生成绩管理系统.docx

《数据结构课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统.docx(31页珍藏版)》请在冰豆网上搜索。

数据结构课程设计学生成绩管理系统.docx

数据结构课程设计学生成绩管理系统

数据结构课程设计

说明书

 

学院:

班级:

完成人:

姓名:

学号:

姓名:

学号:

指导教师:

 

山东科技大学

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1