数据结构课程设计 学生成绩管理系统45791Word格式文档下载.docx
《数据结构课程设计 学生成绩管理系统45791Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 学生成绩管理系统45791Word格式文档下载.docx(36页珍藏版)》请在冰豆网上搜索。
一、课程设计的分析
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,实习题中的问题比平时的习题复杂得多,也更接近实际。
实习着眼于原理与应用的结合点,使读者学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;
另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的练习较偏重于如何编写功能单一的“小”算法,而实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
2.课程设计题目
【课题】
学生成绩管理系统
【问题描述】
根据自己这个学期的课程表,设计一个成绩管理系统管理自己班的成绩;
每个学生记录包含学号、姓名、每门课程成绩、总分以及加权平均分。
【基本要求】
一个完整的成绩管理系统应具有以下功能:
(1)输入:
成绩录入;
(2)输出:
输出成绩表;
(3)插入:
在成绩表中适当位置插入某个学生成绩;
(4)删除:
在成绩表中删除某个学生成绩;
(5)查找:
根据某个关键字查找某个学生成绩;
(6)排序:
根据某一个或某几个关键字进行排序;
(7)筛选:
根据某个关键字筛选出符合某些条件的数据;
【测试数据】
用本班的成绩总表作为测试数据。
3.需求分析
本次课程设计的题目是学生成绩管理系统,要求可以存入学生,学生信息包括学生学号、姓名、每科成绩和平均成绩以及加权平均成绩等。
该系统主要有以下七个功能,即对学生信息进行:
输入、输出、插入、删除、查找、排序、筛选等功能。
对学生进行操作可以有很多思路,而我选用的是单链表村学生信息那一条思路,即设置一个单链表,其中节点数据域保存学生基本信息。
由于我们学号比较长,用整型数据无法保存,所以我定义char型的字符串来保存学号和姓名。
用一个数组来保存学生每一科的成绩,此外在定义一个总分和平均分变量。
定义学生如下:
typedefstructStudent
{
charmun[12];
//学号
charname[20];
//姓名
floatscore[8];
//成绩
floatall_score;
//总分
floatave_score;
//加权平均分
structStudent*next;
}LinkList;
二、概要设计
本程序采用链表的方法将每一个学生设置成为一个链表中的数据节点,节点中有字符型mun[12](学号)、name[20](姓名)、浮点型数据score[8](放置每一科成绩的数组)、all_score(总分)和ave_score(加权平均分)。
主函数中在执行成绩管理系统之前会先创建一个链表,并调用voidInitList(LinkList*&
L)函数来初始化链表;
而后进入菜单选择项选择功能进行操作,主程序流程图如下:
三、详细设计
1、添加学生:
2、输出学生:
创建节点sLinkList*p=L->
next;
输入学生信息,计算总分与加权分for(m=1;
m<
=总人数&
&
p!
=NULL;
m++)
r->
next=s;
r=s;
(尾插法插入链表)输出学生信息,p=p->
nextcount=count+1;
学生总数加1
3、插入学生4、删除学生
输入要插入的位置数字选择删除方式
scanf("
%d"
&
w);
按编号删除和学号删除
调用插入函数1编号调用Delete_Student
Insert_Student(h,w);
2学号调用Locate_Student找到
学生位置,在用Delete_Student
的流程图如下:
Insert_Student函数Delete_Student的函数流程图:
Locate_Student函数的流程图与如下:
Locate_Student1的流程图类似,不再重复了
5查找学生:
调用Seek_Student函数,分为按学号查找和按姓名查找
1按编号调用Locate_Student函数返回i在调用Out_one_Student输出第i个学生
2按姓名调用Locate_Student1函数返回i在调用Out_one_Student输出第i个学生
6排序函数调用Queue_Student函数:
其中有按学号,总分,各科成绩排序
我这里采用的是冒泡排序法进行排序,分别定义了两个节点指针q指向头指针p指向q的下一个节点,在进入双重循环进行比较排序流程图如下:
排序的方法都类似,知识比较数据不同,所以就没有一一画出来了
7筛选
创建另一个链表r用于存筛选出来的学生,并调用output_Student函数输出
筛选程序流程图如下:
筛选程序又分为1按总分选2全部及格的人3按各科成绩
1而总分筛选主要是输入一个数值,判断数据是否大于输入数据,大于的都输出
2去不几个的人通过比较每一科成绩是否都大于60分,大于的就选出插入新链表并输出
3各科成绩的话是只比较其中一科来创建链表并输出
其比较流程图都如上图所示,这里便不再一一画出来了。
四、调试分析
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析
在调试过程中遇到的第一个问题是输出学生的问题,因为输出的问题,其中总是发现输出乱码,找了好久,后来终于发现是输入时出了问题,因为姓名我定义了字符串型,而字符串长度我定义了20,在创建节点的时候我却把name[20]给了学生节点,导致输出时地址错误而输出乱码。
第二个问题是查找,我开始一直想不到怎么把查找到的学生输出,后来想了很久,找到了方法,我先通过查找关键字去找到该学生是在链表的那个位置,在通过返回的位置的值来输出想要输出的那个学生,所以就定义了Locate_Student和Out_one_Student来完成查找功能。
第三个问题是筛选功能的实现,我本来想通过比较,将符合关键字的学生筛选出来在输出,结果发现输出函数是已经定义成一次性全部输出的形式。
导致我一直想不到好的方法来进行这个功能的代码编写。
后来经过老师的指导,我知道了一种新的方法来编写,就是通过创建一个新的学生链表来存已经筛选出来的学生。
然后在通过输出函数来将新链表进行输出,这样就可以达到筛选的目的。
改进方法:
现在想了一下,其实可以将输出函数进行改进,改成一个一个学生输出的形式,在通过一个判断语句进行选择性输出,用这个输出的方法可以减少代码的的量,而达到同样的效果。
第四个问题是主函数的问题,因为我想让主函数看起来简洁一点,就把主函数分成两部分,一部分用于选择操作,另一部分用于进行选择好的操作,可是这样一来却出现了问题,就是输出数据之后无法暂停在输出界面,而是闪了一下就退出来进入主界面了,这个问题我开始以为是输出函数的问题,结果我去改了输出函数,结果还是无法停留。
后来知道原因了,主函数退出switch循环之后会立即回到主菜单界面,到时无法停在输出界面。
我在主函数最后加一个system(“pause”)之后才打到可以观察到的地方。
可以将主函数定义成一个,不用分开,去掉for(;
;
)这个循环会好点。
(2)经验和体会
本次课程设计的题目我一开始看到的时候以为很容易就能做出来,所以只是大概想了一下思路,就直接开始了,其实这个实验可以用顺序表做会思路更清晰一些,我没有选择顺序表来做,因为我在单链表这一部分有点模糊,所以想挑战一下用单链表来做。
这个程序的每一个代码都是我经过一步一步分析写出来的,在编写的过程中遇到了很多的阻碍,很多自己无法预知的错误,在不断的找错过程中,我感觉到自己在c语言这一方面的不足,对算法的精髓还不是很了解,对于单链表的操作也不是很熟练,尤其是在节点指针多起来的时候会有点乱,甚至搞不清指针到底指向哪里了。
然而,在编程过程中,一次次的测试失败,再一次次修改正确却让我慢慢的熟悉了数据结构一些用法,渐渐的知道要编写一个系统,需要各种功能协调才能算一个系统,而每一个功能有需要很多函数之间的相互联系来调用与支撑。
同时要想将课程设计完成的好,就需要积极提问,遇到不懂的地方可以找老师或同学相互交流经验,这样才会更加有效率的完成课设。
经过这一段时间的课设,我学到的不仅仅是数据结构的想关知识,也懂得了团队协作的重要性,知道学习需要真正扎实去学习,这样才能真正学到知识,并灵活运用这些所学知识。
五、用户使用说明
1、添加学生功能:
进入系统后先选择1回车即可进入输入界面,然后按照提示输入学生学号、姓名和数据结构、数字信号处理、数字电子技术基础的分数在按回车,如果还想再继续添加就按1继续,否则可以按任何键退出。
2、输出学生:
用户在输入完学生数据后既可以按2输出所输入的全部学生
3、插入学生:
用户需在主界面按3即可以进入插入界面,此时可以按数字键在选择要插入的位置,如输入1即可以将要插入的学生插入到第一个位置,可以在主界面输入2进行查看是否插入到指定位置。
4、删除学生:
用户可以在主界面输入4进入删除,在通过选择编号来删除要删除的学生。
5、查找:
查找查找功能有按学号和姓名查找,如按一进入学号查找,可以输入要查找的学号,回车即可以输出要查找的学生。
6、排序:
排序可以通过学号,总分,和各科成绩,输入1可以按学号从小到大排序,输入2可以按总分从小到大进行排序,输入3可以进入科目选择,再按1进行数据结构排序,2进行数字型号处理排序,3进行数电的排序。
7、筛选:
可以按1进入总分筛选,进入之后输入筛选多少分以上的人,输入分数,如:
200,即可输出所有大于200分的学生;
在筛选界面输入2可以输出全部及格的学生;
按3可以进入各科成绩的筛选,再按1选出所有数据结构及格的学生、再按2选出所有数字信号处理及格的学生、再按3选出所有数字电子技术基础及格的学生。
8、退出:
退出程序只需要在主界面按0再回车即可以退出程序。
六、测试结果
3、插入学生:
5、查找学生:
6、排序
7、筛选
0、退出程序:
七、附录
#include<
stdio.h>
malloc.h>
string.h>
stdlib.h>
intcount=0;
//记录学生人数
voidInitList(LinkList*&
L)//初始化链表
L=(LinkList*)malloc(sizeof(LinkList));
L->
next=NULL;
}
voidCreat_Student(LinkList*&
L)//输入学生并添加到链表里面
LinkList*r=L,*s;
inti=0,j=1;
floatall=0,ave,a[8];
while(j==1)
{
while(r->
next!
=NULL)
r=r->
s=(LinkList*)malloc(sizeof(LinkList));
s->
printf("
输入学生学号、姓名、每科成绩\n"
);
学号:
"
scanf("
%s"
s->
mun);
姓名:
name);
/*数据结构3.0、数字信号处理4.0、数字电子技术基础2.5这里只输入三门成绩作为示范*/
for(i=0;
i<
3;
i++)
{
if(i==0)
{
printf("
输入数据结构分数\n"
scanf("
%f"
a[i]);
s->
score[i]=a[i];
}
if(i==1)
输入数字信号处理分数\n"
if(i==2)
输入数字电子技术基础分数\n"
}
}
all=a[0]+a[1]+a[2];
all_score=all;
ave=(a[0]*3.0+a[1]*4.0+a[2]*2.5)/9.5;
ave_score=ave;
r->
next=s;
r=s;
count=count+1;
是否继续?
(按1继续,其他退出。
)"
j);
}
voidoutput_Student(LinkList*&
L,intn)//输出全部学生
LinkList*p=L->
if(p==NULL)
没有学生成绩!
请添加学生。
。
\n"
return;
printf("
\t\t学生成绩表\n"
编号学号姓名数据结构数字信号数字电路总分加权平均分\n"
intm;
for(m=1;
=n&
%-5d%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f%-10.1f\n"
m,p->
mun,p->
name,p->
score[0],p->
score[1],p->
score[2],p->
all_score,p->
ave_score);
p=p->
voidDelete_Student(LinkList*&
L,inti)//删除第i个学生
intj=0;
LinkList*p=L,*q;
if(i<
=0)
没有找到该学生"
while(j<
i-1&
j++;
return;
else
q=p->
if(q==NULL)
return;
p->
next=q->
free(q);
count=count-1;
删除成功!
intLocate_Student(LinkList*L,char*mun)//按学号定位,返回第i个学生
inti=1;
while(p!
=NULL&
strcmp(p->
mun,mun)!
i++;
return(0);
else
return(i);
intLocate_Student1(LinkList*L,char*name)//按姓名定位,返回第i个学生
name,name)!
voidQueue_Subject(LinkList*&
L)//不同科目排序
inti;
LinkList*q,*p,*t1,*t2;
请输入科目的代号:
1数据结构2数字信号处理3数电\n请输入:
scanf("
i);
if(i>
=1||i<
=3)
for(q=L;
q->
q=q->
next)
for(p=q->
p->
p=p->
if(q->
next->
score[i-1]>
score[i-1])
{
if(q->
next==p)
{
t1=p->
p->
next=p->
t1->
q->
next=t1;
p=t1;
}
else
t2=q->
t2->
next=t2;
}
没有找到该科目!
}
voidQueue_Student(LinkList*&
L)//排序函数
inti,j=1;
1、按照学号2、总分3、按各科分排序\n请输入:
switch(i)
case1:
//学号排序
if(strcmp(q->
mun)==1)
break;
case2:
//总分排序
all_score>
all_score)
case3:
Queue_Subject(L);
//科目排序
break;
voidOut_one_Student(LinkList*L,inti)//输出第i个学生
LinkList*p=L;
i)
%-9s%-9s%-10.1f%-10.1f%-10.1f%-8.1f%-10.1f\n"
p->
intSeek_Student(LinkList*L)//查找学生1按学号查找2按姓名查找
1按学号查找2按姓名查找3退出\n请输入:
m);
switch(m)
chara[12];
输入学号: