数据结构课程设计 学生成绩管理系统.docx
《数据结构课程设计 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 学生成绩管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计学生成绩管理系统
数据结构课程设计
题目名称:
学生成绩管理系统
计算机科学与技术学院
数据结构综合实验设计———————学生成绩管理系统
1.需求分析
系统主要管理学生信息及成绩信息排序等事项。
根据需要可以查询学生的信息。
主要功能包括如下。
(1)使用中文菜单,界面升级和用户输入要人性化。
(2)将学生信息保存到文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后在对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。
(3)具有数据输入功能,输入的数据能最终保存在文件中。
(4)具有数据删除功能,能最终从文件中删除。
(5)排序功能,根据自己设计的数据结构,升级排序算法。
(6)具有多种查询及输出功能。
(7)其他功能。
(8)学生信息的修改。
本程序要求设计一个学生信息管理程序,即用计算机来管理一个学校的各个班级成员的各种信息,实现学生信息管理。
(9)数据的输入形式和输入值得范围:
首先输入的是菜单的序号,选择你想要进行的操作,其次根据提示输入相关的班级或学生信息。
(10)结果的输出形式:
输出的是班级信息或学生信息。
2.设计概要
输入学生成绩
输出学生成绩
查询学生成绩
插入学生成绩
按总分排名
删除学生信息
退出系统
3函数
StructStudent//结构体
{
Intterm;//学期
Intnum;//学号
Charname[12];姓名
Floatmrak1;成绩
Floatmark2;
Floatmark3;
Floatsum;//总分
Floataverage;//平均分
};
voidinput(list*head)输入函数
voidoutput(list*h)输出函数
voidsortsum(list*head)总成绩排名
voidsortnum(list*head)按学号排名
voidfind(list*h)查找主函数
list*del(list*h)删除函数
list*insert(list*h)插入函数
全部的功能函数可以实现所有的功能
4详细设计:
程序代码:
#include
#include
#include
#defineMAXLEN100
#defineNull0
/**************************/
intcount=0;
/**************************/
typedefstructnode{
intnum;//学号
charname[MAXLEN];//姓名
/******************************/
charsex[2];///性别
//charsex;
/****************************/
floatsum;//总分
floatave;///平均分
intcomputer;///计算机成绩
intenglish;///英语成绩
intmath;///数学成绩
intchinese;//语文分数
structnode*next;//指针域
}list;
/*************************/
voidinput(list*head)///输入函数
/*************************/
{
list*p,*r;
inti,n;//n为学生人数
/*
p=(list*)malloc(sizeof(list));
p->next=Null;
*/
r=head;
printf("请输入学生人数.\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p=(list*)malloc(sizeof(list));
printf("请输入学生学号:
\n");
scanf("%d",&p->num);
printf("请输入学生性别:
\n");
scanf("%s",&p->sex);
printf("请输入学生姓名:
\n");
scanf("%s",&p->name);
printf("请输入语文成绩:
\n");
scanf("%d",&p->chinese);
printf("请输入英语成绩:
\n");
scanf("%d",&p->english);
printf("请输入数学成绩:
\n");
scanf("%d",&p->math);
printf("请输入计算机成绩:
\n");
scanf("%d",&p->computer);
(p->sum)=(p->chinese)+(p->computer)+(p->math)+(p->english);
(p->ave)=(p->sum)/4;
p->next=Null;
r->next=p;
r=r->next;
/********************/
count++;
/********************/
}
}
voidoutput(list*h)//输出函数
{
/************************/
if(h==NULL)
printf("记录为空!
");
/*************************/
list*p;
printf("学号\t姓名\t性别\t语文成绩\t数学成绩\t英语成绩\t计算机成绩\t平均分\t总成绩\t\n");
p=h->next;
while(p!
=NULL)
{
printf("%d\n\t%s\t%s\t%d\t%d\t%d\t%d\t%5.1f\t%5.1f\n",p->num,p->name,p->sex,p->chinese,p->math,p->english,p->computer,p->ave,p->sum);
p=p->next;
}
}
输出函数
voidsortsum(list*head)///总成绩排序
{
//structnodetemp;
//constintn=20;
//inti,j,k;
//printf("按照总成绩排序:
\t");
//for(i=0;i//{
//k=i;
//for(j=i+1;j//if(list[j].sum//k=j;
//temp=list[k];list[k]=list[i];list[i]=temp;
//output(p);
//}
inti=count,j,k;
printf("按照总成绩排序:
\n");
if(count==0||count==1)
{
return;
}
list*p,*temp;
while(i>0)
{p=head;
for(j=0;j{
if(p->next->sum>p->next->next->sum)
{
temp=p->next;
p->next=p->next->next;
temp->next=p->next->next;
p->next->next=temp;
}
p=p->next;
}
i--;
}
}
/*******************************************/
利用了冒泡排序的方法把成绩排序:
voidsortnum(list*head)
{
inti=count,j,k;
printf("按照学号排序:
\n");
if(count==0||count==1)
{
return;
}
list*p,*temp;
while(i>0)
{p=head;
for(j=0;j{
if(p->next->num>p->next->next->num)
{
temp=p->next;
p->next=p->next->next;
temp->next=p->next->next;
p->next->next=temp;
}
p=p->next;
}
i--;
}
}
/*******************************************/
/*
利用了冒泡排序的方法把学号排序:
intsortnum(node*list)///学号排序
{
structnodetemp;
constintn=20;
inti,j,k;
printf("按照总成绩排序:
\t");
for(i=0;i{
k=i;
for(j=i+1;jif(list[j].num{
k=j;
temp=list[k];
list[k]=list[i];
list[i]=temp;
}
}
return0;
}
*/
voidfind(list*h)///查找函数
{
intk;//要找的学生学号
list*p;
p=h->next;
printf("请输入要查找的学生学号:
\n");
scanf("%d",&k);
while(p&&p->num!
=k)
p=p->next;
if(p)
{
printf("学号\t姓名\t性别\t语文成绩\t数学成绩\t英语成绩\t计算机成绩\t平均成绩\t总成绩\n");
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d%5.1f\t%5.1f\n",p->num,p->name,p->sex,p->chinese,p->math,p->english,p->computer,p->ave,p->sum);
}
else
printf("目标没找到\n");
}
利用遍历按要求查找相应的学生:
list*del(list*h)///删除函数
{
intk;//要删除的学生学号
list*p,*q;
q=h;
p=h->next;
printf("请输入待删除的学生学号:
\n");
scanf("%d",&k);
while(p&&p->num!
=k)
{
q=p;
p=p->next;
}
if(p)
{
q->next=p->next;
free(p);
count--;
}
else
printf("没有此学生的记录,无法删除!
\n");
return(h);
}
list*insert(list*h)//插入函数
{
list*p,*q,*r,*head;
head=h;
r=h;
p=h->next;//下面构造一个学生的信息
q=(list*)malloc(sizeof(list));
printf("请输入待插入学生的学号:
\n");
scanf("%d",&q->num);
printf("请输入待插入学生性别:
\n");
scanf("%s",&q->sex);
printf("请输入待插入学生的姓名:
\n");
scanf("%s",&q->name);
printf("请输入待插入的语文成绩:
\n");
scanf("%d",&q->chinese);
printf("请输入待插入的英语成绩:
\n");
scanf("%d",&q->english);
printf("请输入待插入的数学成绩:
\n");
scanf("%d",&q->math);
printf("请输入待插入的计算机成绩:
\n");
scanf("%d",&q->computer);
(q->sum)=(q->chinese)+(q->computer)+(q->math)+(q->english);
(q->ave)=(q->sum)/4;
q->next=Null;//找到链表的结尾结点
count--;
while(p!
=Null)
{
r=p;
p=p->next;
}//将新结点插入表尾
r->next=q;
r=r->next;
return(head);
}
void
main()//主函数
{
list*p;
/*****************************/
p=(list*)malloc(sizeof(list));
p->next=Null;
/*****************************/
intk;//控制循环的标志
while
(1)
{
printf("---------------------------------------\n");
printf("|学生成绩管理系统|\n");
printf("---------------------------------------\n");
printf("|1.登记成绩|\n");
printf("|2.查询成绩|\n");
printf("|3.插入成绩|\n");
printf("|4.删除成绩|\n");
printf("|5.按学号排序|\n");
printf("|6.按总成绩排序|\n");
printf("|7.输出所有学生成绩|\n");
printf("|8.退出系统|\n");
printf("---------------------------------------\n");
printf("请输入你的选择\n");
scanf("%d",&k);
switch(k)
{
case1:
//p=input();
/****************/
input(p);
/****************/
break;
case2:
find(p);
break;
case3:
p=insert(p);
break;
case4:
p=del(p);
break;
case5:
sortnum(p);
output(p);
break;
case6:
sortsum(p);
output(p);
break;
case7:
output(p);
break;
case8:
exit(0);
default:
printf("选择错误,重新开始\n");
}
}
}
4调试分析
(1):
调试过程中在选择功能也就是简易界面出遇到了问题后才去switchcase的方法也决问题,在设计函数时第一次只进行了成绩排序,这样使得程序不够完整没有满足要求,之后加上了学号排序这样方便了查找,也方便了阅读。
(2)本次试验还要求利用文件的方式进行操作,后经过XX才找到方法,找到了文件操作。
(3)题目中没有什么复杂的算法,唯一一个就是利用了冒泡排序,对学生成绩和学生学号进行了排序,这次实验主要是通过各种小函数来进行,其中遍历操作用的次数最多。
(4)由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。
在用的时候难免出现这样那样的错误。
如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。
解决的这个问题的办法是调整。
一个系统的菜单和提示信息非常重要。
如果没有这些用户根本不知道怎么用你设计的这个系统。
在设计的调试过程中也无法顺利的完成调试工作。
有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾起此次课程设计,我感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体„„通过这次课程设计之后,一定把以前所学过的知识熟悉了,本次课程设计结束了,我们通过这次实践学到了许多知识。
学到了设计一个简单的系统。
要注意哪些方面。
也使我们知道自己哪些方面做得还不够。
这不仅是程序设计,更是锻炼我们处理问题的能力,同时也使我们了解到团队合作的可贵.编写程序是件细心活,稍不留神就会出错,这就必须要求我们对待事情要认真!
在编写程序的过程中。
错误不断出现,不同的类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半途而废。
但我们总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
5.测试结果:
上面是一个简易的界面有8中功能:
选则功能1,可以登录学生的成绩,可以输入多个人但是必须一个一个输入。
选择功能2
可以查看学生的成绩
前提是有1操作登录的出成绩才可以。
功能3
插入一个学生的的成绩
方式同1操作相同,注意相同的学号会直接覆盖
操作4
删除学生的成绩
这是会有两种情况
(1):
输入的学好号里存在学生,这是会直接删除该学生。
(2):
输入的学号不存在学生,这是会显示不存在该学生。
操作5
按学号排序:
利用排序函数中的冒泡排序进行排序将学生以学好的大小进行,
若只有一个学生则会直接输出。
操作6
按成绩排序:
利用排序函数中的冒泡排序进行排序将学生以成绩的大小进行,
若只有一个学生则会直接输出。
操作7
输出所有的学生成绩。
操作8
退出。
这个是大于两个学生是按学号排序的结果。
同理输出总成绩的结果。
整体的输出结果。
这次课程设计的心得体会通过实习我的收获如下
1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
从刚开始得觉得很难,到最后把这个做出来,付出了很多,也得到了很多,以前总以为自己对编程的地方还不行,现在,才发现只要认真做,没有什么不可能。
编程时要认真仔细,出现错误要及时找出并改正,(其中对英语的要求也体现出来了,因为它说明错误的时候都是英语)遇到问题要去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听其对你的程序的建议,在他们不知道程序怎么写的时候完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当局者迷旁观者清,把各个注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,要注意符号的使用,注意对字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意指针的初始化不管它怎么用以免不必要麻烦。
5、每一步的设计都是按照题中的要求来的,该利用排序用排序,该利用遍历用便利,
总之这次题目没有太大的点难度,用的算法也很简单,但是他要求的使用的功能很多
这导致了程序的复杂化,这次主要学到了将困难的问题简单化这一操作。