数据结构课程设计报告学生成绩管理系统1.docx
《数据结构课程设计报告学生成绩管理系统1.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告学生成绩管理系统1.docx(23页珍藏版)》请在冰点文库上搜索。
数据结构课程设计报告学生成绩管理系统1
学院:
职业技术学院专业:
计算机科学与技术
姓名:
学号:
1班级:
计科061班
实习性质:
课程设计实习地点:
蔡家关校区国合楼二楼计算机房
指导教师:
曾劼成绩:
学生成绩管理系统设计
一、需求分析
随着社会的发展,学校的规模不断的扩大,日常教学活动中提取相关信息,以反映教学情况。
传统的手工操作方式,易发生数据丢失,统计错误,劳动强度高,且速度慢。
使用计算机可以高速,快捷地完成以上工作。
在计算机联网后,数据在网上传递,可以实现数据共享,避免重复劳动,规范教学管理行为,从而提高了管理效率和水平。
学生成绩管理系统以计算机为工具,通过对学生成绩管理所需的信息管理,把管理人员和老师从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学计划的制定执行和教学质量的监督检查,从而全面提高教学质量。
信息社会的高科技,商品经济化的高效益,使计算机的应用已普及到经济和社会生活的各个领域。
计算机虽然与人类的关系愈来愈密切,还有人由于计算机操作不方便继续用手工劳动。
为了适应现代社会人们高度强烈的时间观念,学生成绩管理系统软件为教学办公室带来了极大的方便。
该软件是以C语言为实现语言,其功能在系统内部有源代码直接完成。
通过操作目录,管理者和老师可以了解本软件的基本工作原理。
管理者和老师只需输入一些简单的汉字、数字,即可达到自己管理学生成绩的目标。
在学生成绩管理系统中,需要从大量的日常教学活动中提取相关信息,以反映教学情况。
传统的手工操作方式,易发生数据丢失,统计错误,劳动强度高,且速度慢。
使用计算机可以高速,快捷地完成以上工作。
在计算机联网后,数据在网上传递,可以实现数据共享,避免重复劳动,规范教学管理行为,从而提高了管理效率和水平。
通过本学生成绩管理系统,可以从一下几个方面减少老师的工作负担和提高学校的管理效率,实现学校的信息化和自动化。
1.应用学生成绩管理系统,把老师从繁杂的学生成绩了登记分数、统计分数、学生排名等等的工作职工解脱出来,把更多的时间和精力用来提高教学质量和学生的辅导工作上,提高学生的学生效率和成绩。
2.应用学生成绩管理系统,可以学校教务处的工作效率,有效的管理学校学生的成绩,更加科学的统计管理学生成绩。
学生成绩管理适用各学校的教学老师用于班上的学生成绩了登录、统计和对班上学生成绩的排名。
学生管理系统以计算机为工具,通过对学生成绩管理所需的信息管理,把老师从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学计划的制定执行和教学质量的监督检查,从而全面提高教学质量。
二、概要设计
数据结构形式:
链表+二叉排序树。
以成绩为节点建立二叉排序树,以学生为节点,以链表形式接在成绩节点之后。
功能:
查找(按学号、成绩、姓名)、插入、删除、统计(统计平均成绩、,统计分数段的人数。
)
学生成绩管理系统是以计算机为工具,通过对教务管理所需的信息管理,把管理人员从繁琐的数据计算处理中解脱出来,使其有更多的精力从事教务管理政策的研究实施,教学计划的制定执行和教学质量的监督检查,从而全面提高教学质量。
软件开发的意图为便于学校和老师的管理,方便查看有关学校及学生的情况。
如教学老师对学生成绩的修改、删除、查找、添加、总分数的统计、总分排名,单科排名等。
成绩管理系统是面向中学的管理系统,其目的是提高老师对学生的科学化管理。
本软件针对学校的管理现状和要求,从理论和应用的角度论述了学生成绩管理信息系统的特点、功能、设计思路。
本系统主要包括五个模块:
学生成绩录入、学生成绩查询、学生成绩的添加、修改、统计学生的总成绩、并对其进行排名、求每个学生的平均分等这八个模块基本实现设计。
1.定义头文件,包括标准输入输出函数库、标准函数库、字符串函数库、屏幕操作函数库
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#defineHEADER1"学生成绩\n"
#defineHEADER2"|学号|姓名|C|数学|英语|总分|平均|名次|\n"
#defineHEADER3"|----------|---------------|----|----|----|-------|--------|-----|"
#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
#defineEND"---------------------------------------------------------------------\n"
2.建立查询菜单,方便软件使用者根据根据自己的需要进行操作:
voidmenu()
{
system("cls");
cprintf("学生成绩管理系统\n");
cprintf("*************************Menu********************************\n");
cprintf("*1输入成绩2删除成绩*\n");
cprintf("*3查询成绩4修改成绩*\n");
cprintf("*5插入成绩6统计成绩*\n");
cprintf("*7名次排名8保存成绩*\n");
cprintf("*9显示成绩0退出系统*\n");
cprintf("**************************************************\n");
cprintf("本软件由张进,杨秀玲共同设计,欢迎使用!
\n");
}
3.定义与学生有关的数据结构
typedefstructstudent/*标记为student*/
{
charnum[10];/*学号*/
charname[15];/*姓名*/
intcgrade;/*C语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
intmingci;/*名次*/
};
4.由于是动态内存分配空间的数据操作,而非文件I/O,那么在程序一开始的时候首先得建立数据,返回头成绩节点。
于是首先要有一个创建数据的函数:
Creat()。
分析要求,可以得到一些初步的功能函数:
插入函数Insert()、查找函数Search()(2种:
按学号、按姓名)、删除函数Delete()、输出学生信息函数Print()。
1.Creat():
以二叉排序树的定义建立树并返回根节点,在输入学生信息的同时判断是否已有该成绩节点,若有则直接链在该成绩的学生节点之后;若无,开辟新空间给此成绩节点,并把学生节点链在其后。
2.Insert():
方法和Creat()一样,只要指明根节点就可以了。
3.Search():
按成绩:
只要按二叉排序树的定义就可以找到成绩,然后遍历其成绩节点后的学生链
按学号:
遍历二叉排序树的方法。
按姓名:
遍历二叉排序树的方法。
4.Delet():
在查找成绩的时候就可以返回该成绩的节点指针和其父节点指针,那么可以根据二叉排序树的删除定义进行操作。
5.Print():
遍历二叉排序树的方法。
6.Tongji():
统计该班的总分第一名和单科第一,和各科不及格人数。
三、详细设计
一、对整体的设计思想进行构思,并写出软件大概的设计步骤和软件要实现的功能,并对需要的硬件设备和软件进行准备,电脑等相关的设备和资料。
1.打开TC编译器,新建一个文件。
图1
2.输入源程序,实现学生成绩管理系统的相关功能。
二、软件具体功能的设计方法和步骤。
1、定义整个程序需要的头文件,
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
3.定义所有和学生有关的数据结构。
typedefstructstudent
{
charnum[10];/*学号*/
charname[15];/*姓名*/
intcgrade;/*C语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
intmingci;/*名次*/
};
4.编写学生成绩管理系统的菜单,方便软件使用者的操作。
cprintf("学生成绩管理系统\n");
cprintf("******************菜单********************************\n");
cprintf("*1输入成绩2删除成绩*\n");
cprintf("*3查询成绩4修改成绩*\n");
cprintf("*5插入成绩6统计成绩*\n");
cprintf("*7名次排名8保存成绩*\n");
cprintf("*9显示成绩0退出系统*\n");
cprintf("******************************************************\n");
cprintf("本软件由王兴宇和崔凯共同设计,欢迎使用!
\n");
5.定义错误信息时函数调用,软件的提示信息。
voidWrong()
{
printf("\n\n\n\n\n***********输入错误,任意键返回!
**********\n");
getchar();
6.定义查询时的错误提示函数。
voidNofind()
{
printf("\n=====>没有发现该学生!
\n");
}
7.显示单链表l中存储的学生记录,内容为student结构中定义的内容,存储单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息。
查询时指针时,逐条输出链表中存储的学生信息。
voidDisp(Linkl){
Node*p;
p=l->next;
if(!
p)/*p==NULL,NUll在stdlib中定义为0*/
{
printf("\n=====>没有学生记录\n");
getchar();
return;
printdata(p);
p=p->next;
printf(HEADER3);
8.定位链表中符合要求的节点,并返回指向该节点的指针,其中findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;在单链表l中查找;
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
9.进行分数的验证,输入的分数必须在0到100之间,大于100或小于0时提示输入错误,并要求重新输入。
intnumberinput(char*notice)
{
intt=0;
do{
printf(notice);
scanf("%d",&t);
if(t>100||t<0)printf("\成绩必须在[0,100]!
\n");
}while(t>100||t<0);
returnt;
}
10.构造增加学生记录的函数,实现添加操作的临时的结构体指针变量,并且保证输入的学号没有被使用,若输入学号为0,则退出添加记录操作。
若增加的学生型号已经存在,则要求重新输入一个未被占用的学号。
voidAdd(Linkl)
{
Node*p,*r,*s;
charch,flag=0,num[10];
r=l;
s=l->next;
system("cls");
Disp(l);while(r->next!
=NULL)
r=r->next;while
(1){
while
(1){
stringinput(num,10,"输入0返回主菜单,输入学号:
");
flag=0;
if(strcmp(num,"0")==0)
{return;}
s=l->next;
while(s){
if(strcmp(s->data.num,num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
{getchar();
printf("=====>学号%s已经存在,是否重新输入?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return;
}
else
{break;}
}
11.构造查询成绩的函数,查询的方法有两种:
一、按学号查询,二、按学生姓名查询。
intselect;
charsearchinput[20];Node*p;
if(!
l->next){
system("cls");
printf("\n=====>没有学生记录!
\n");
getchar();
return;
}
system("cls");
printf("\n=====>1按学号查询=====>2按姓名查询\n");
printf("选择[1,2]:
");
scanf("%d",&select);
if(select==1)
12.构造删除学生记录的函数,首先查询要删除的学生是否存在,若不存在,提示重新输入,若存在,找到该节点,然后删除该节点。
if(!
l->next)
{system("cls");
printf("\n=====>没有学生记录!
\n");
getchar();
return;
}
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指节点从链表中去除*/
free(p);/*释放内存空间*/
printf("\n=====>删除成功!
\n");
getchar();
saveflag=1;
13.修改学生记录。
先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改。
if(!
l->next)
{system("cls");
printf("\n=====>没有学生记录!
\n");
getchar();
return;
}
system("cls");
printf("修改学生成绩");
Disp(l);
14.插入记录:
按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。
若学号存在,则进行插入之前的新记录的输入操作。
15.统计该班的总分第一名和单科第一,和各科不及格人数,并显示出来。
voidTongji(Linkl)
{
Node*pm,*pe,*pc,*pt;
Node*r=l->next;
intcountc=0,countm=0,counte=0;
if(!
r)
{system("cls");
printf("\n=====>没有学生记录\n");
getchar();
return;
}
system("cls");
Disp(l);
pm=pe=pc=pt=r;
while(r)
{
if(r->data.cgrade<60)countc++;
if(r->data.mgrade<60)countm++;
if(r->data.egrade<60)counte++;
if(r->data.cgrade>=pc->data.cgrade)pc=r;
if(r->data.mgrade>=pm->data.mgrade)pm=r;
if(r->data.egrade>=pe->data.egrade)pe=r;
if(r->data.total>=pt->data.total)pt=r;
r=r->next;
}
printf("\n------------------------------统计结果--------------------------------\n");
printf("C成绩不及格有:
%d(人)\n",countc);
printf("数学不及格有:
%d(人)\n",countm);
printf("英语不及格有:
%d(人)\n",counte);
printf("-------------------------------------------------------------------------------\n");
printf("总分最高的学生姓名:
%s总分:
%d\n",pt->data.name,pt->data.total);
printf("语最高成绩学生姓名:
%s分数:
%d\n",pe->data.name,pe->data.egrade);
printf("数学最高学生姓名:
%s分数:
%d\n",pm->data.name,pm->data.mgrade);
printf("C语言最高学生姓名:
%s成绩:
%d\n",pc->data.name,pc->data.cgrade);
printf("\n\n任意键返回");
getchar();
}
16.利用插入排序法实现单链表的按总分字段的降序排序,从高到低为学生成绩排名。
17.数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘.
getchar();
printf("\n=====>是否保存?
(y/n):
");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);
FILE*fp;
Node*p;
intcount=0;
fp=fopen("c:
\\student","wb");
18.建立菜单。
case1:
Add(l);break;/*增加学生记录*/
case2:
Del(l);break;/*删除学生记录*/
case3:
Qur(l);break;/*查询学生记录*/
case4:
Modify(l);break;/*修改学生记录*/
case5:
Insert(l);break;/*插入学生记录*/
case6:
Tongji(l);break;/*统计学生记录*/
case7:
Sort(l);break;/*排序学生记录*/
case8:
Save(l);break;/*保存学生记录*/
四、软件测试
1.利用VC++进行软件的测试,并记录相关的数据。
编译、连接、运行程序,出现如图的菜单。
图2
2.选择1,添加学生成绩,出现如图的视图。
图3
图4
如图所示,系统中已经加入了三条数据。
3.选择2,出现如图所示的画面。
图5
3.选择1和选择2分别按学号删除学生成绩记录和按姓名删除学生成绩记录,出现如图所示。
图6
图7
4.选择3,查询学生的各科成绩,分别按学号和姓名查询。
图8
5.选择4,修改学生成绩。
图9
6.选择5,增加学生学号为7的姓名以及各科成绩。
图10
7.选择6.统计全部学生成绩的总分,单科成绩第一、各科不及格人数以及总分第一名和各科成绩第一名的详细情况。
图11
8.选择7,为全部学生排名。
图12
9.选择8,保存全部学生数据。
图13
10.选择0,退出学生成绩管理系统。
图14
11.通过各项功能的测试,学生成绩管理系统可以实现预期的相关操作,因此,学生成绩管理系统设计成功。
五、实验总结
在一个星期的数据结构课程设计中,我们组的四个小组成员,细致分工,通力合作,每个人都认真的完成自己所承担的任务,为完成数据结构课程设计一起努力,其中王兴宇负责需求分析部分,他细致的分析了软件适用的行业和软件的具体功能,崔凯负责概要设计部分,我和杨秀玲主要负责学生成绩管理系统的详细设计和对软件的测试,对软件的功能进行完善和对各个功能模块的调试,并写出详细的设计过程和软件调试情况。
通过这一个星期的程序设计,我们基本熟悉了数据结构中对于二叉排序树和单链表的运用,特别是二叉排序树的结果特点,在对其查找的时候特别方便。
结合了二叉树和链表的特点,就比较出二叉树在查找上的结构特点优于单链表。
但在结合二叉树和链表的时候,对于查找链表中的内容时就比较麻烦,我们目前所能使用的方法就是遍历二叉树再从链表中查找。
这样就不如直接查找二叉树节点那么容易、方便。
而如果是从二叉树的节点定位某串链(例如:
查找取得70分的人)还是比较方便的,这就体现了二叉树的特点。
在程序设计方面,逐渐感觉到模块化设计的重要性。
在程序设计时,应该分析出功能块,然后对其细节中的共性和特性作分析。
在算法上使得其结果精简、完整,达到模块化,在编程时,思考方式就会集中在结构的逻辑上而非细节的问题上。
这样可以使得程序更加严密可靠。
而这样的技能是要在每次的程序设计及编程中慢慢积累的。
这次的设计,让我大大地感觉到,对于程序设计中,对语言再熟悉也比不过在设计中算法和结构分析的真知灼见。
当然,成功的程序设计是要建立在熟悉语言的基础之上的。
平时语言的基本功要扎实。
而每一次程序设计的经营能大大地增加对语言的熟悉和感知。
程序设计的技能来自多方面,每一次的亲自实践、思考揣摩、刨根问底就会让自己更加清楚所欠缺的是什么。
所以,现在觉得在设计实践中作为参考的书册阅读和研究远远比过单纯的阅读,因为它是在最紧迫的时间上填补自己最紧迫的不足。
数据结构是计算机科学与技术专业的专业基础课,是一门十分重要的核心课程。
数据结构的知识为后续专业课程的学习提供必要的知识和技能准备,学好“数据结构”这门课程,对于学习计算机专业的其他课程,如操作系统、编译原理、数据库管理系统、软件工程、人工智能等都是十分有益的,而且所有的计算机系统软件和应用软件都要用到各种类型的数据结构。
通过实际的进行数据结构的程序设计,了解数据结构在程序设计中的重要应用,在软件的设计过程中,尽