数据结构课程设计学生成绩管理系统Word文件下载.docx
《数据结构课程设计学生成绩管理系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
(3)?
程序所能达到的功能;
1.数据输入功能,输入的数据能最终保存在文件中;
2.数据删除功能,能最终从文件中删除;
3.排序功能,根据自己设计的数据结构,设计排序算法
4.多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;
6.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)
7.其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)
2、概要设计
1.数据结构:
数组(顺序存储结构)
2.程序模块:
(1)先编入系统所需的库函数,使程序可运行
#include<
>
um==n&
&
r[m].term==k)若找到则显示学生记录并跳出循环;
if(r[m].num!
=n&
r[m].term!
=k)若没有则提示“该学号不存在,或没有这个学期的成绩!
”。
按姓名及学期来查找学生记录模块:
用函数voidsearchname(Student*r)来实现
主要功能也是用来查找学生记录的。
首先会有提示输入姓名及学期,再用for循环语句和if判断语句来进行查找,if((r[m].name[0]==n[0])&
(r[m].term==k))若找到则显示学生记录并跳出循环;
if(r[m].name[0]!
=n[0]&
=k)若没有则提示"
该姓名不存在,或没有这个学期的成绩!
"
按学号及学期修改信息:
用函数voidchange(Student*r)来实现
主要功能是用来修改学生记录。
首先也要有个判断语句,判断学生是否存在,这个是通过学号及学期来判断的,这里会有提示输入学号及学期,之后是for和if语句,if(r[m].num==n&
r[m].term==k)若存在则先输出修改之前的信息,查看是否正确。
若正确,则修改此学生记录,这里有个while循环语句,和switch-case选择语句,用来选择修改哪科成绩,和是否进行再修改记录(通过选择Y或y来实现)。
最后将修改过后的记录保存到文件中去,并输出提示"
文件已修改并写入"
。
插入学生资料模块:
用函数Student*insert(Student*r);
实现
主要功能是用来添加学生资料,成绩。
若显示没有此学生的信息,就可以使用本模块来进行添加。
在此模块代码中定义了另一个指针数组:
Student*y=(Student*)newStudent[num+1];
用来存放新添加的学生记录。
再利用for循环进行输入新学生记录,for(m=0;
m<
num;
m++)最后会有一个提示语句cout<
<
是否继续输入?
(继续,输入y,否则输入其他)"
endl;
若输入y则继续输入,否则将返回主菜单。
按学号及学期删除学生记录模块
用函数voidshanchu(Student*r)来实现
主要功能是用来删除学生记录。
首先有个读文件的操作,之后会有判断语句,根据所输入的学号及学期,来显示删除前的信息记录,添加for循环语句,循环把后一位的信息提前一位,整体数量减一,来进行全局变量的修改,之后再把修改过后的信息记录保存到文件中去。
按数据结构成绩(冒泡)降序排序模块
用函数voidmaopao(Student*r)来实现
主要功能时是用来对学生的记录来按单科成绩(这里以数据结构成绩为例)进行排序。
这样方便对某科成绩有个大致的了解。
首先会有一个读文件操作,为排序做基础。
本排序使用冒泡排序。
它有两个优点:
一是很容易写出代码;
二是具有稳定性,这里的稳定性是指原序列中相同两元素的相对顺序仍然保持到排序后的序列。
冒泡排序时进过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大(则升序,小则降序。
本程序一律采用降序)则交换两数。
排序之后,将排序之后的结果写入文件,再打开文件的时候,里面显示的就是按单科成绩排序后的结果。
按总分(选择)降序排序:
用函数voidxuanze(Student*r)来实现
主要功能时是用来对学生的记录来按总分成绩进行排序。
这样方便对学生总体有个大致的了解。
本排序使用选择排序。
其基本思想是:
n个记录的文件的直接选择排序可进过n-1趟直接选择排序得到有序结果:
初始状态,无序区为R[1..n],有序区为空。
第一趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第一个记录R[1]交换,使R[1..n]和R[2..n]分别变为记录个数增加1个的新有序区记录和记录数减少1个的新无序区。
.....
第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。
该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第一个记录与R交换,使R[1..i]和R分别变成为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
统计各科总分及平均分模块:
用函数voidtongji(Student*r)来实现
主要功能是计算总分和各科平均分,计算完之后将总分保存到文件中。
4、测试与分析
进入主界面选择<
1>
输入学生信息
输入结束后的界面:
:
23赵月3
12李丽3
31王虎3
选择<
2>
,输出了学生信息:
3>
,按学号及学期查询学生信息:
4>
,按姓名及学期查询学生信息:
5>
,按学号及学期修改学生信息:
6>
,插入学生信息:
17王万3
7>
,按学号及学期删除学生信息:
8>
,按数据结构降序<
冒泡>
排序:
9>
,按总分降序<
选择>
17王万381.
10>
统计各科成绩的总分和平均分:
11>
,退出:
5、总结
课程设计终于结束了感觉有很多的收获,通过课程设计我又一次巩固了所学的知识,对学习到的理论知识进行了巩固,真正的理解及体会了。
平时有很多知识都是似懂非懂,通过平时上机操作,自己也了解了一些,但在这次的课设上,之前的困惑也通过这次的课设解决了一些,虽然还是不能够全面的理解,但是有进步就很有成就感。
在课程设计中遇到不少困难,通过查阅资料,询问同学,在应用课本的前提下,拓展课外知识,完成了此次课程设计,虽然还有许多不足之处,但是从中我学到了许多东西。
我懂得了我们不能拘泥于所学知识,应对其灵活运用。
通过此次课程的设计使我认识到对知识的掌握不全面,而且感觉我们在学习专业知识的同时还需要再加强其他方面知识的学习,因为编程有时候涉及到其他方面的知识,只有了解了其他方面的知识才能收集资料,然后编程。
在编程的过程中,又重新复习了课本,从中学到了许多以前未学到的知识,感觉非常有成就感,特别当自己把程序一点点完善时,
让我对自己更加有信心,让我对数据结构这门课程也更感兴趣了,以前我一直感觉枯燥难学的数据结构,在编程的过程中我也愿意去认真研究学习了。
这次数据结构课程设计中,多亏了同学的耐心帮助。
如果没有同学的指导改错,我会花更多的时间去找错误。
在以后的学习过程中,我一定会认真负责地对待课本中的每一个知识点,进一步充实自己,提高自己。
争取在不断的练习中提高自己的层次。
也希望可以在以后的专业课当中多增加一些实践的内容,只有多动手,我们才能不断提高。
6、附录:
源程序清单
erm;
cout<
请输入第"
i+1<
个人的学号:
;
cin>
r[i].num;
if(i>
=1)
{
for(n=0;
n<
i;
n++)
{
if(r[n].num==r[i].num)
{
cout<
该学号已存在!
!
t=1;
}
}
}
if(t==1)ame;
请输入高等数学成绩:
r[i].mark1;
请输入数据结构成绩:
r[i].mark2;
请输入大学英语成绩:
r[i].mark3;
r[i].sum=r[i].mark1+r[i].mark2+r[i].mark3;
r[i].average=(r[i].mark1+r[i].mark2+r[i].mark3)/3;
}
fp=fopen("
"
w+"
);
if(!
fp)
{
文件不能打开"
exit(0);
for(n=0;
fprintf(fp,"
%d%s%.1f%.1f%.1f%d%.1f%.1f"
r[n].num,r[n].name,r[n].mark1,r[n].mark2,r[n].mark3,r[n].term,r[n].sum,r[n].average);
\n"
fclose(fp);
cout<
文件已经写入"
}
um,r[n].name,&
r[n].mark1,&
r[n].mark2,&
r[n].mark3,&
r[n].term,&
r[n].sum,&
r[n].average);
fclose(fp);
um<
setw(6)<
r[m].name<
setw(7)<
r[m].mark1<
setw(10)
<
r[m].mark2<
setw(10)<
r[m].mark3<
setw(8)<
r[m].term<
setw(6)
r[m].sum<
r[m].average<
\0\0"
else
未输入任何信息!
r[m].term==k)um<
r[m].mark2
<
setw(8)
break;
if(r[m].num!
=k)ame[0]==n[0])&
(r[m].term==k))um<
if(r[m].name[0]!
=k)um==n&
r[m].term==k)
{
intj;
cout<
------------------------->
修改前的信息如下<
--------------------------"
学号"
姓名"
高等数学"
数据结构"
大学英语"
学期"
总分"
平均分"
r[m].num<
while(chiose=='
Y'
||chiose=='
y'
)
{
\t\t\t-------->
可以修改的项目如下<
-------\n"
\t\t\t1.修改学生的高等数学成绩记录\n"
\t\t\t2.修改学生的数据结构成绩记录\n"
\t\t\t3.修改学生的大学英语成绩记录\n"
请选择:
cin>
j;
switch(j)
{
case1:
cout<
输入新的高等数学成绩:
cin>
r[m].mark1;
break;
case2:
输入新的数据结构成绩:
r[m].mark2;
case3:
输入新的大学英语成绩:
r[m].mark3;
}
是否要继续修改此学生的其他成绩记录?
(Y/N)"
fflush(stdin);
f%.1f%.1f%d%.1f%.1f"
um,r[o].name,&
r[o].mark1,&
r[o].mark2,&
r[o].mark3,&
r[o].term,&
r[o].sum,&
r[o].average);
Student*y=(Student*)newStudent[num+1];
erm;
请输入学号:
r[num].num;
请输入姓名:
r[num].name;
r[num].mark1;
r[num].mark2;
r[num].mark3;
r[num].sum=r[num].mark1+r[num].mark2+r[num].mark3;
verage=(r[num].mark1+r[num].mark2+r[num].mark3)/3;
num++;
n;
}while(n=='
if((fp=fopen("
))==NULL)
returnr;
intn,k,t=0;
请输入要删除学生的学号:
请输入要删除成绩的学期:
k;
for(intm=0;
m++)
if(r[m].num==n&
r[m].term==k)
{
for(intk=m;
k<
k++)f%.1f%.1f%d%.1f%.1f"
r[n].num,r[n].name,r[n].mark1,r[n].mark3,r[n].mark3,r[n].term,r[n].sum,r[n].average);
fprintf(fp,"
fclose(fp);
cout<
if(t==0)
对不起,该学号不存在!
ark2<
r[m+1].mark2)
max=r[m+1];
r[m+1]=r[m];
r[m]=max;
}
排序完毕"
if((fp=fopen("
w"
))==NULL)
对不起,文件不能打开!
exit(0);
for(n=0;
n++){
fprintf(fp,"
对不起,未输入任何信息!
um<
r[j].sum)
max=j;
Studenttemp;
temp=r[max];
r[max]=r[i];
r[i]=temp;
排序完毕!
ark1;
summark2=summark2+r[m].mark2;
summark3=summark3+r[m].mark3;