数据结构学生成绩管理系统.docx
《数据结构学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构学生成绩管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构学生成绩管理系统
课程设计报告
课程设计名称:
数据结构课程设计
系:
三系
学生姓名:
班级:
学号:
成绩:
指导教师:
开课时间:
2011-2012学年一学期
课程设计任务书
课程名称:
数据结构
指导教师:
专业班级:
学生姓名:
起止日期:
2012.12-2013.1
设计题目一:
学生成绩管理系统
1.实习目的
通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
2.问题描述
实现功能:
学生相关信息的输入、输出、查找、读入、显示、保存、排序、退出。
3.需求分析
该程序所做的工作是对学生的成绩的管理,为师生进行学生成绩的记录、查询提供方便。
此程序规定:
1.在成绩录入是,姓名为10个字母以内的字符串;各科成绩为整形;学号长整型,性别和出生日期为字符型;
2.程序的输出信息主要为:
输出学生的各科成绩及排序统计学生相关成绩数据;
3.程序的功能主要包括:
学生本人信息的录入、修改、查找、学生本人及成绩的输出和统计;
首先运行程序,包括4个选项,0.保存并退出系统.1.按学号录入学生信息2.按学号查询学生成绩3.分段统计与排序输出。
4.然后可以根据不同的需要选择不同的选项进行操作
4.概要设计
4.1系统用到的数据有:
intPhysics;//语文
intEnglish;//英语
intChinese;//数学
longnumber;//学号
charname[10];//姓名
charsex[10];//性别
chardate[20];//出生日期
scores;//成绩
4.2用到的主要函数:
(1)inthash(intkey);//用除留余数法构造哈希函数
(2)intBuild_Hash(Hash*H,stust);//输入一组关键字,建立Hash表,用链地址法处理冲突
(3)intSearch(Hash*H,intkey);//成绩查询
(4)voidHeapAdjust(HeapType&H,ints,intm);//筛选
(5)voidHeapSort(HeapType&H);//堆排序。
(6)voidSegment(HeapTypeh);//统计各个分数段的人数
(7)intSort(Hash*H);//使用堆排序对各科成绩按从高到低排列输出
(8)voidcreate(Hash*H);//录入学生信息
(9)voidFind(Hash*H);//查询学生信息
(10)voidtongji(Hash*H);//分段统计及排序
(11)voidsavedata(student*&p);
(12)student*getdata();
(13)voidmain();//主函数内部可以实现多函数调用
4.3本实验从整体上分为四大模块:
(1)创建并录入学生相关信息;
(2)按学号查询学生成绩信息;(3)分段统计成绩与排序输出;(4)退出管理系统;
5.详细设计
#include
#include
#include
#include
typedefstruct//成绩结构定义
{
intPhysics;//语文
intEnglish;//英语
intChinese;//数学
}score;
typedefstructstudent//学生信息结构定义
{
longnumber;//学号
charname[10];//姓名
charsex[10];//性别
chardate[20];//出生日期
scores;//成绩
structstudent*next;
}student,*stu;
typedefstuHash;//定义哈希表的类型
typedefstruct//堆结构定义
{
intr[20];//记录分数
intlength;//长度
}HeapType;
inthash(intkey);//用除留余数法构造哈希函数
intBuild_Hash(Hash*H,stust);//输入一组关键字,建立Hash表,用链地址法处理冲突
intSearch(Hash*H,intkey);//成绩查询
voidHeapAdjust(HeapType&H,ints,intm);//筛选
voidHeapSort(HeapType&H);//堆排序。
voidSegment(HeapTypeh);//统计各个分数段的人数
intSort(Hash*H);//使用堆排序对各科成绩按从高到低排列输出
voidcreate(Hash*H);//录入学生信息
voidFind(Hash*H);//查询学生信息
voidtongji(Hash*H);//分段统计及排序
voidsavedata(student*&p);
student*getdata();
voidmain()
{
intn,i;
student*getdata();
HashH[5];//哈希表
for(i=0;i<5;i++)
{
H[i]=NULL;//对哈希表各表头初始化为NULL
}
for(;;)
{
printf("\t\t\t-------------------------------------\n");
printf("\n\t\t\t学生成绩管理系统\n\n");
printf("\t\t\t1.创建并录入学生相关信息\n");
printf("\t\t\t2.按学号查询学生成绩信息\n");
printf("\t\t\t3.分段统计成绩与排序输出\n");
printf("\t\t\t0.退出管理系统\n");
printf("\n\t\t\t-------------------------------------\n");
printf("请选择0-3:
");
scanf("%d",&n);
switch(n)
{
case1:
create(H);break;//学生数据录入
case2:
Find(H);break;//查询学生数据
case3:
tongji(H);break;//成绩分段统计与排序输出
case0:
exit(0);
printf("谢谢使用...");//退出
default:
printf("\n\n您的输入有误!
请重新输入:
\n\n");
break;
}
}
}
inthash(intkey)//用除留余数法构造哈希函数散列存储
{
returnkey=key%5;
}
intBuild_Hash(Hash*H,stust)//输入一组关键字,建立Hash表,用链地址法处理冲突
{
stup;
inti;
i=hash(st->number);
if(H[i]==NULL)
{
H[i]=st;
}//作为链表的第一个结点
else
{
for(p=H[i];p->next;p=p->next);
{
if(p->number==st->number)
{
printf("已存在该学号的学生,添加学生信息出错!
\n");
return0;
}
p->next=st;//插入链表尾部.
}
}
return1;
}
intSearch(Hash*H,intkey)//成绩查询
{
inti;
stup;
i=hash(key);
if(H[i])
{
if((H[i]->number==key))//在表头
{
printf("学号:
%d\n姓名:
%s\n",key,H[i]->name);
printf("性别:
%s\n出生日期:
%s:
%s\n",H[i]->sex,
H[i]->date);
printf("\n各科分数如下:
\n");
printf("物理:
%d\n英语:
%d\n语文:
%d\n",H[i]->s.Physics,H[i]->s.English,H[i]->s.Math);
return1;
}
else//探测下一个地址,在链表中查找
{
for(p=H[i]->next;p;p=p->next)
{
if(p->number==key)
{
printf("学号:
%d\n姓名:
%s\n",key,p->name);
printf("性别:
%s\n出生日期:
%s\n",p->sex,p->date);
printf("\n各科分数如下:
\n");
printf("物理:
%d\n英语:
%d\n语文:
%d\n",p->s.Physics,p->s.English,p->s.Math);
return1;
}
}
}
}
return0;
}
voidHeapAdjust(HeapType&H,intlow,inthigh)//堆排序
{
intrc;
intj;
rc=H.r[low];//rc是low
for(j=2*low;j<=high;j*=2)//j沿Key较大的孩子结点向下筛选//r[j]是r[i]的左孩子
{
if(j++j;//j为Key较大记录的下标
if(!
(rcbreak;//rc应插入在位置s上
H.r[low]=H.r[j];
low=j;
}
H.r[low]=rc;//插入
}
voidHeapSort(HeapType&H)
{
intt,i;
for(i=H.length/2;i>0;i--)//循环建立初始堆
HeapAdjust(H,i,H.length);//建大顶堆
for(i=H.length;i>1;i--)
{
t=H.r[1];//将堆顶记录和当前未经排序子序列H.r[1..i]中最后一个记录相互交换
H.r[1]=H.r[i];
H.r[i]=t;
HeapAdjust(H,1,i-1);//对H.r[1..i-1]重新调整为大顶堆
}
}
voidSegment(HeapTypeh)//统计各个分数段的人数
{
inta,b,c,d,e;
inti;
a=b=c=d=e=0;
for(i=1;i<=h.length;i++)
{
if(h.r[i]>=90)
a++;
elseif(h.r[i]>=80)
b++;
elseif(h.r[i]>70)
c++;
elseif(h.r[i]>60)
d++;
else
e++;
}
printf("\n90分以上的有%d人\n",a);
printf("80-90分的有%d人\n",b);
printf("70-80分的有%d人\n",c);
printf("60-70分的有%d人\n",d);
printf("60分以下的有%d人\n",e);
}
intSort(Hash*H)//使用堆排序对各科成绩按从高到低排列输出
{
HeapTypea,b,c;
inti,j,k,m;
stust;
j=k=m=1;
a.length=b.length=c.length=0;
//把哈希表中的数据放到堆结构中
for(i=0;i<5;i++)
{
if(H[i])
{
st=H[i];
while(st)
{
a.r[j]=st->s.Physics;
b.r[k]=st->s.English;
c.r[m]=st->s.Math;
j++;
k++;
m++;
a.length++;
b.length++;
c.length++;
st=st->next;
}
}
}
if(a.length>1)
{//物理成绩
HeapSort(a);
printf("物理成绩从高到低排列为:
");//按学号进行每位学生成绩由高到低排序
for(i=a.length;i>0;i--)
printf("%3d",a.r[i]);
Segment(a);
}
//英文成绩
if(b.length>1)
{
HeapSort(b);
printf("\n英语成绩从高到低排列为:
");
for(i=b.length;i>0;i--)
printf("%3d",b.r[i]);
Segment(b);
}
//语文成绩
if(c.length>1)
{
HeapSort(c);
printf("\n语文成绩从高到低排列为:
");
for(i=c.length;i>0;i--)
printf("%3d",c.r[i]);
Segment(c);
}
return0;
}
voidcreate(Hash*H)//录入学生信息这个文件有问题
{
FILE*fp;
fp=fopen("stu.txt","wb");
stust;intm;
intc;
c=1;
m=0;
while(c)
{
m++;
st=(stu)malloc(sizeof(student));
st->next=NULL;
st->number=0;
printf("\n请输入第%d名学生的学号:
",m);
scanf("%d",&st->number);fprintf(fp,"%d",st->number);
printf("请输入姓名:
");
scanf("%s",st->name);fprintf(fp,"%s",st->name);
printf("请输入性别:
");
scanf("%s",st->sex);fprintf(fp,"%s",st->sex);
printf("请输入出生年月:
");
scanf("%s",st->date);fprintf(fp,"%s",st->date);
st->s.Physics=0;
printf("请输入物理成绩:
");
scanf("%d",&st->s.Physics);fprintf(fp,"%d",st->s.Physics);
st->s.English=0;
printf("请输入英语成绩:
");
scanf("%d",&st->s.English);fprintf(fp,"%d",st->s.English);
st->s.Math=0;
printf("请输入语文成绩:
");
scanf("%d",&st->s.Math);fprintf(fp,"%d",st->s.Math);
Build_Hash(H,st);
printf("\n继续?
选(1/0):
");
scanf("%d",&c);
}
fclose(fp);
printf("\n*********此系统共有%d名学生!
*************\n",m);
}
voidFind(Hash*H)//查询学生信息
{
intkey=0;
intc;
c=1;
while(c)
{
printf("\n请输入要查询学生的学号:
");
scanf("%d",&key);
if(!
Search(H,key))
printf("不存在该学生的信息!
\n");
printf("要继续查询吗?
输入1继续,输入0结束!
(1/0):
");
scanf("%d",&c);
}
}
//分段统计及排序
voidtongji(Hash*H)
{
Sort(H);
}
voidupdate(stup)
{
FILE*fp;
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("文件无法打开.\n");
exit(0);
}
while(p!
=NULL)
{
fwrite(p,sizeof(student),1,fp);//写入数据
p=p->next;
}
fclose(fp);//关闭文件
}
voidsavedata(student*&p)
{
FILE*fp;
if((fp=fopen("data.dat","ab"))==NULL)
{
printf("文件无法打开.\n");
exit(0);
}
while(p!
=NULL)
{
fwrite(p,sizeof(student),1,fp);//写入数据
p=p->next;
}
fclose(fp);//关闭文件
}
student*getdata()
{
FILE*fp;
student*p,*head=NULL,*tail=NULL;
p=(student*)malloc(sizeof(student));
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("文件不存在.\n");
exit(0);
}
while(fread(p,sizeof(student),1,fp))
{//读数据到P数组里面
if(head==NULL)//如果头指针不为空,判断空链表的情况
{
head=p;
tail=p;//头指针与尾指针同时指向第一块内存区域
}
else
{
p=(student*)malloc(sizeof(student));
tail->next=p;//如果头指针不为空,尾指针的指针指向新开辟的内存单元
tail=p;//尾指针后移,指向新开辟的单元
tail->next=NULL;//尾指针的指针指向空
}
}
fclose(fp);
returnhead;
}
6通讯录程序运行结果:
7通讯录程序设计过程中产生的问题及采取的措施:
在此程序中,由于该程序与上个通讯录管理系统存在相同联系,所以在菜单的设计和swith语句的运用上不再陌生,有了前车之鉴,后车之师。
但是学生成绩管理系统程序也存在诸多困难譬如在实现堆排序上以及散列存储和散列查找,都相对陌生,解决的方法主要去多方位查找资料和利用好相关资料,可以从书本上获得也可以从XX文库中得到,利用好就成为自己的资源了。
8通讯录程序设计总结与展望:
将近一周的数据结构课程设计,通过vc6.0反复的尝试和测试此次设计,渐渐了解和掌握了用C语言和相关数据结构知识实现通讯录管理系统和学生成绩管理系统的实现,当然此程序还是有不少缺陷的,说明自己的努力还不过,还需要进一步去好好学习,本程序中把近一学期学习的数据结构应用到实践中去,用心去做,提高了自己的动手实践能力,加深了对理论知识的理解。
以前对于C语言,数据结构的认识是模糊的,概念上的,现在通过自己动手做实验,对课本的认识更加深刻。
课程设计过程中遇到了很多的困难,主要是由于自己对课本知识没有融会贯通,不能把书本知识应用到实践中,这次课程设计让我受益匪浅,我清醒的认识到,只要自己肯努力,愿意去付出行动,不怕麻烦,就能收获好的结果,铭记一句话,付出总会有收获。
此次课程设计过程中我遇到了很多困难,由于理论知识的欠缺,刚开始在实验过程中,无从下手,不知道该怎么编写这样一个程序。
后来,经过查阅相关的资料以及请教身边的同学和老师,逐渐的对这个程序的实现有了一定的认识,慢慢的我开始有了自己的想法,逐渐有了自己的实现轮廓,就这样通过我在经历摸索以后逐渐完成了自己的课程设计报告。
此次课程设计让我知道了自己还存在很多的不足,为我以后的学习提供了必要的参考意见,以后的学习生活中,我希望自己能够提高动手操作能力,真正的把理论知识应用到实践中去,更重要的是要脚踏实地去学习,认真去学!
9参考文献:
[1]严蔚敏.数据结构(C语言版)[M].北京:
清华大学出版社,2009.1.2:
3-56
[2]李春葆等著.数据结构教程(第三版).清华大学出版社,2009
[3]李春葆等主编.数据结构教程上机实验指导(第三版).清华大学出版社,2009