数据结构课程设计学生成绩管理系统.docx
《数据结构课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计学生成绩管理系统
Preparedon22November2020
数据结构课程设计学生成绩管理系统
辽宁科技大学
课程设计报告
设计题目:
学生成绩管理
学院、系:
电子与信息工程学院
专业班级:
计算机11-2班
学生姓名:
赵月
指导教师:
龙艳彬
成绩:
2013年1月8日
一、需求分析------------------------------------------------3
二、概要设计------------------------------------------------3
三、详细设计------------------------------------------------5
系统流程图-----------------------------------------------------5
界面设计-------------------------------------------------------6
各功能模块的设计----------------------------------------------7
四、测试与分析---------------------------------------------9
五、总结-----------------------------------------------------15
六、附录(源代码)--------------------------------------16
1.需求分析
1.1问题描述
本系统实现了学生成绩管理的功能,具有学生成绩的输入、读取、查询、修改、插入、删除、排序,统计等功能。
1.2基本要求
(1)输入的形式和输入值的范围;
首先输入学生个数,按回车键。
按照提示选择,将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。
输入数据类型主要是char、int、float等数据类型,输入内容包括:
学期、学号、姓名、高等数学成绩,数据机构成绩,大学英语成绩总分,平均分等数据。
(2)输出的形式;
学期、学号、姓名、高等数学成绩,数据结构成绩,大学英语成绩,总分,平均分等数据。
(3)程序所能达到的功能;
1.数据输入功能,输入的数据能最终保存在文件中;
2.数据删除功能,能最终从文件中删除;
3.排序功能,根据自己设计的数据结构,设计排序算法
4.多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;
6.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)
7.其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)
2、概要设计
1.数据结构:
数组(顺序存储结构)
2.程序模块:
(1)先编入系统所需的库函数,使程序可运行
#include<>
#include<>
#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]&&r[m].term!
=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按学号及学期删除学生记录模块
用函数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>输入学生信息
输入结束后的界面:
:
选择<2>,输出了学生信息:
选择<3>,按学号及学期查询学生信息:
选择<4>,按姓名及学期查询学生信息:
选择<5>,按学号及学期修改学生信息:
:
选择<6>,插入学生信息:
:
选择<7>,按学号及学期删除学生信息:
:
选择<8>,按数据结构降序<冒泡>排序:
:
选择<9>,按总分降序<选择>排序:
:
17王万
选择<10>,统计各科成绩的总分和平均分:
选择<11>,退出:
5、总结
课程设计终于结束了感觉有很多的收获,通过课程设计我又一次巩固了所学的知识,对学习到的理论知识进行了巩固,真正的理解及体会了。
平时有很多知识都是似懂非懂,通过平时上机操作,自己也了解了一些,但在这次的课设上,之前的困惑也通过这次的课设解决了一些,虽然还是不能够全面的理解,但是有进步就很有成就感。
在课程设计中遇到不少困难,通过查阅资料,询问同学,在应用课本的前提下,拓展课外知识,完成了此次课程设计,虽然还有许多不足之处,但是从中我学到了许多东西。
我懂得了我们不能拘泥于所学知识,应对其灵活运用。
通过此次课程的设计使我认识到对知识的掌握不全面,而且感觉我们在学习专业知识的同时还需要再加强其他方面知识的学习,因为编程有时候涉及到其他方面的知识,只有了解了其他方面的知识才能收集资料,然后编程。
在编程的过程中,又重新复习了课本,从中学到了许多以前未学到的知识,感觉非常有成就感,特别当自己把程序一点点完善时,
让我对自己更加有信心,让我对数据结构这门课程也更感兴趣了,以前我一直感觉枯燥难学的数据结构,在编程的过程中我也愿意去认真研究学习了。
这次数据结构课程设计中,多亏了同学的耐心帮助。
如果没有同学的指导改错,我会花更多的时间去找错误。
在以后的学习过程中,我一定会认真负责地对待课本中的每一个知识点,进一步充实自己,提高自己。
争取在不断的练习中提高自己的层次。
也希望可以在以后的专业课当中多增加一些实践的内容,只有多动手,我们才能不断提高。
6、附录:
源程序清单
#include<>
#include<>
#include<>erm;
cout<<"请输入第"<
";
cin>>r[i].num;
if(i>=1)
{
for(n=0;n
{
if(r[n].num==r[i].num)
{
cout<<"该学号已存在!
!
"<t=1;
}
}
}
if(t==1)ame;
cout<<"请输入高等数学成绩:
";
cin>>r[i].mark1;
cout<<"请输入数据结构成绩:
";
cin>>r[i].mark2;
cout<<"请输入大学英语成绩:
";
cin>>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)
{
cout<<"文件不能打开"<exit(0);
}
for(n=0;n
{
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);
fprintf(fp,"\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<<<}
cout<<"\0\0"<}
else
cout<<"未输入任何信息!
!
"<}
um==n&&r[m].term==k)um<<<break;
}
}
if(r[m].num!
=n&&r[m].term!
=k)ame[0]==n[0])&&(r[m].term==k))um<<<break;
}
}
if(r[m].name[0]!
=n[0]&&r[m].term!
=k)um==n&&r[m].term==k)
{
intj;
cout<cout<<"------------------------->修改前的信息如下<--------------------------"<cout<<"学号"<<cout<<<cout<while(chiose=='Y'||chiose=='y')
{
cout<<"\t\t\t-------->可以修改的项目如下<-------\n"<cout<<"\t\t\t1.修改学生的高等数学成绩记录\n"<cout<<"\t\t\t2.修改学生的数据结构成绩记录\n"<cout<<"\t\t\t3.修改学生的大学英语成绩记录\n"<cout<<"请选择:
";
cin>>j;
switch(j)
{
case1:
cout<<"输入新的高等数学成绩:
";
cin>>r[m].mark1;
break;
case2:
cout<<"输入新的数据结构成绩:
";
cin>>r[m].mark2;
break;
case3:
cout<<"输入新的大学英语成绩:
";
cin>>r[m].mark3;
break;
}
t=1;
cout<<"是否要继续修改此学生的其他成绩记录(Y/N)";
fflush(stdin);f%.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);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已修改并写入"<}
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;
cout<<"请输入学号:
";
cin>>r[num].num;
cout<<"请输入姓名:
";
cin>>r[num].name;
cout<<"请输入高等数学成绩:
";
cin>>r[num].mark1;
cout<<"请输入数据结构成绩:
";
cin>>r[num].mark2;
cout<<"请输入大学英语成绩:
";
cin>>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++;
cout<<"是否继续输入(继续,输入y,否则输入其他)"<cin>>n;
}while(n=='y');
if((fp=fopen("","w+"))==NULL)
{
cout<<"文件不能打开"<exit(0);
}
for(n=0;n{
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);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<returnr;
}
um,r[o].name,&r[o].mark1,&r[o].mark2,&r[o].mark3,&r[o].term,&r[o].sum,&r[o].average);
}
intn,k,t=0;
cout<<"请输入要删除学生的学号:
";
cin>>n;
cout<<"请输入要删除成绩的学期:
";
cin>>k;
for(intm=0;mif(r[m].num==n&&r[m].term==k)
{
for(intk=m;kfprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<if(t==0)
cout<<"对不起,该学号不存在!
"<}
else
cout<<"未输入任何信息!
"<}
um,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average);
}
ark2{
max=r[m+1];
r[m+1]=r[m];
r[m]=max;
}
}
}
cout<<"排序完毕"<if((fp=fopen("","w"))==NULL)
{
cout<<"对不起,文件不能打开!
"<exit(0);
}
for(n=0;nfprintf(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);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<}
else
cout<<"对不起,未输入任何信息!
"<}
um,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average);
}
um{
max=j;
}
}
Studenttemp;
temp=r[max];
r[max]=r[i];
r[i]=temp;
}
cout<<"排序完毕!
"<if((fp=fopen("","w+"))==NULL)
{
cout<<"对不起,文件不能打开!
"<exit(0);
}
for(n=0;nfprintf(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);
fprintf(fp,"\n");
}
fclose(fp);
cout<<"文件已经写入"<}
else
cout<<"对不起,未输入任何信息!
"<}
ark1;
summark2=summark2+r[m].mark2;
summark3=summark3+r[m].mark3;
}
avemark1=summark1/num;
avemark2=summark2/num;
avemark3=summark3/num;
cout<cout<<"高等数学总分为:
"<"<cout<cout<<"数据结构总分为:
"<"<cout<cout<<"大学英语总分为:
"<"<cout<if((fp=fopen(""