完整版学生成绩管理系统毕业课程设计报告.docx
- 文档编号:3481698
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:31
- 大小:72.69KB
完整版学生成绩管理系统毕业课程设计报告.docx
《完整版学生成绩管理系统毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《完整版学生成绩管理系统毕业课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
完整版学生成绩管理系统毕业课程设计报告
引言1
一、系统概述2
二、需求分析2
1、系统需求
2、开发环境
三、详细设计6
四、所遇到的问题和分析解决--15
五、系统特色及关键技术
六、结论及心得体会--16
七、附录(源代码)--17
参考文献
引言
通过本课程设计,使自己更加系统地理解和掌握数据结构的基本概念;能自如地根据实际要求,设计相应的数据结构,并运用C或C++语言实现所设计的算法,编写较大型的程序,分析和解决实际应用问题,进一步加深、巩固所学专业课程的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。
掌握C语言或C++语言独立的编写、调试应用程序和进行其它相关设计的技能。
此项目主要是考察我们对结构体、数组、文件等具体操作,以及对C语言语法的掌握,所以做成此项目要求比较高的设计要求,对整体有很熟悉的概括,同时调试过程也是很重要的,对程序界面的要求也比较高,要设计的合理同时也要美观一点,能够人性化的描述清楚你的各个功能,一目了然,对其他用户使用本程序简单易懂,这才能成本程序或本系统是成功的。
对于学生成绩管理系统,此项目每年都有学生去做,但是能够在其他项目中脱颖而出,还要有自己的设计特色,用简单的语言详细描述系统的功能,这才是关键。
这个设计能够练习我们的理解和运用结构化程序设计的思想和方法,掌握开发一个小型实用系统的基本方法,学会调试一个比较长的程序的基本方法,同时掌握书写程序设计开发文档的能力。
1
1、系统概述
1、课程设计应完成的工作
(1)编写算法
(2)算法测试,并有具体的测试结果和结果分析
(3)撰写课程报告,内容包括:
封面
课程设计报告正文
使用说明
参考文献
2、总体设计工作(包含几大功能模块)
(1)输入学生信息并保存到文件
(2)读取文件并输出学生信息
(3)按学号及学期查询
(4)按姓名及学期查询
(5)按学号及学期修改信息
(6)插入信息
(7)按学号及学期删除信息
(8)按数据结构降序(冒泡)排序
(9)按总分降序(选择)排序
(10)统计各科成绩的总分和平均分
(11)退出
2、需求分析
1、系统需求
(1)问题描述:
该系统实现对若干个大学生的学习成绩进行管理。
至少包括以下信息:
学号、姓名、科目、成绩,学期。
学期取值范围可为1-8。
2
(2)功能要求:
1.使用中文菜单,界面设计和用户输入输出要人性化些;
2.将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。
3.具有数据输入功能,输入的数据能最终保存在文件中;
4.具有数据删除功能,能最终从文件中删除;
5.排序功能,根据自己设计的数据结构,设计排序算法
6.具有多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;
7.其它功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程所有学生的平均分等等)
8.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩)
(3)说明:
功能各方面越完善越好
自定义的数据结构可以使用数组,链表,树等,然后根据不同的数据结构,设计不同的排序,查找算法。
其中,排序算法至少有两种,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
若用数组,必须动态分配空间(文本文件中最好有一行表示学生人数)
(4)、输入输出的形式
本系统是一个学生成绩管理系统,采用VC++6.0编译器作为开发环境,这个环境是我们在学习C++的平台。
输入数据类型主要是char、int、float等数据类型,输入内容包括:
学期、学号、姓名、高等数学成绩,数据机构成绩,组成原理成绩,总分,平均分等数据。
用户在输入学生数据时要保证输入数据格式的正确性,系统不会自动检测输入的数据是否正确,输出形式与输入形式类似,根据需要可以选择显示输入的各项内容,还可以选择显示计算好平均分后并排序后的记录,显示内容包括:
学期、学号、姓名、高等数学成绩,数据机构成绩,组成原理成绩,总分,平均分等数据。
3
2、开发环境
VisualC++不仅仅是是一个C++编译器,而是一个基于Windows操作系统的可视化集成开发环境IDE,这种环境开发出来的软件稳定性好、可移植性强,可以编制各种各样的Windows应用程序。
三、详细设计
1、系统流程图
2、界面设计
主界面:
在此界面用户可以选择要操作的选项,回车之后即可进入相关的页面进行操作(例如:
选择1,即可进入输入学生数据页面)
在本界面里用户可以输入学生相关的信息数据,按照提示进行操作即可,例如:
所有操作均有提示语,比较人性化的管理,易懂,简单。
3、大概设计模块
(1)先编入系统所需的库函数,从而使程序可运行。
#include
#include
#include
#include
#include
(2)Main()函数的设计
在main()函数中主要运用do-while循环语句和switch()-case选择判断语句来调用相关
功能模块。
系统的运行是在一个永真的循环里进行的,只有在主界面并选择“退出”时,才会跳出永真循环,并退出程序。
(3)主界面的设计
在主界面中包括“
输入学生信息并保存到文件
读取文件并输出学生信息
按学号及学期查询
按姓名及学期查询
按学号及学期修改信息
插入信息
按学号及学期删除信息
按数据结构降序(冒泡)排序
按总分降序(选择)排序
统计各科成绩的总分和平均分
退出”等全部的功能,之所以设计这麽一个主界面,一是因为能使用户对程序操作的流程更加清晰简明,二是保证了用户同时只能对一个文件进行操作系统的要求,保证了系统不会打开文件紊乱或者出现致命的错误。
每个函数体如下:
Voidmain();//主函数
voidinput(Student*r);//输入学生信息及数据
voidoutput(Student*r);//输出学生信息及数据
voidsearchnum(Student*r);//按学号及学期查找学生信息
voidsearchname(Student*r);//按姓名及学期查找学生信息
voidchange(Student*r);//按学号及学期修改学生信息
Student*insert(Student*r);//插入学生信息
voidshanchu(Student*r);//按学号及学期删除循声信息
voidmaopao(Student*r);//按数据结构降序(冒泡)排序
voidxuanze(Student*r);//按总分降序(选择)排序
voidtongji(Student*r);//统计各科总分和平均分信息
4、详细设计思想
(1)确定语言算法
由于之前都没有做过类似的设计,所以一时间不能够确定到底使用何种语言来设计本系统,所以在网上看了一些其他人设计的程序,链表的、数组的,C++的,各种各样的,也不知如何选择,但是仔细地看了其中的设计思想,最终还是用C++和指针数组的来做,一是觉得本人对链表掌握的不是很熟练,那么在设计过程中容易产生不能理解的错误,耽误时间,二是想运用C++,可以巩固一下所学的数据结构的知识,之前做实验的时候一直用C来做,都没怎么用所学的知识,这时候想练练。
就这样确定了整体的结构算法。
(2)确定程序主要功能模块
这个就比较简单了,主要是根据系统设计的说明及要求来设计,从而设计了十大功能模块,有文件操作,有系统维护功能,排序和统计功能,有输入输出等基本功能,比较人性化,添加了较多的提示语。
这个程序的主要功能时输入学生的学号,姓名,学期和三科成绩来对其进行存储,在存储后可以对学生的成绩按学号及学期或姓名及学期来进行查询,同时输出此同学的平均分及总分,之后可以对某个同学的成绩进行各种操作,例如修改,删除等,同时还可以对学生们的成绩按照总分或单科成绩排序,在整个过程中所做的操作都会保存到"student.txt"文件中并显示。
(3)系统结构体的设计
structStudent//结构体
{
intterm;//学期
intnum;//学号
charname[12];//姓名
floatmark1;//成绩
floatmark2;
floatmark3;
floatsum;//总分
floataverage;//平均分
};
Student结构体说明表
名称
属性
说明
term
数据成员
说明学生学期
num
数据成员
说明学生学号
name
数据成员
说明学生名字
mark1
数据成员
说明学生高等数学成绩
mark2
数据成员
说明学生数据结构成绩
mark3
数据成员
说明学生组成原理成绩
sum
数据成员
说明学生总成绩
average
数据成员
说明学生平均成绩
(4)各功能模块的设计
******主函数模块
用函数voidmain()来实现
主要是来显示主菜单,使用户选择操作。
首先定义一个指针数组(全局使用)Student*p=(Student*)newStudent[num];在此处num是指学生个数,并不是学号,之前有定义的(不要弄混了),在这里应用了do-while和switch-case语句来进行选择,是个比较简单实现的模块。
最后若选择“11”则是保存记录并退出永真循环。
******输入学生记录模块
用函数voidinput(Student*r);来实现
主要功能用来对学生的成绩进行收集和输入。
首先会有个提示“输入最初要求的学生数”,之后跳出主菜单,选择"1",进入输入模块输入所需学生个数的学生信息,比如学期,学号,姓名,成绩等。
输完之后会自动跳出主菜单,根据主菜单来在此基础上进行操作。
期间会有一些提示语,按此操作即可。
根据if和for语句来判定期间是否有重复学号输入,在本操作中,允许有重复学生姓名出现。
在此模块中,用到了文件操作的指针FILE*fp;同时也用到了一个控制变量t,它是用来判定的条件变量,t=1表示找到了与之重复的学号,t=0表示未出现重复学号。
在此期间会根据语句算出总分和平均分,并默认按学号排序保存到文件中去。
之后返回主菜单。
写文件操作代码:
if((fp=fopen("student.txt","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<<"文件已经写入"< ******显示学生记录模块 用函数voidoutput(Student*r);来实现 主要功能是用来显示学生的信息进行输出。 在系统已经录入了学生资料的前提下,只用该功能可以显示学生的信息资料等等。 同时也会自动跳出主菜单进行后续操作。 主要的程序代码就是从文件的读操作和界面显示操作。 其中stew()指的是两字节之间的间隔,在括号中填入该有的数字就会有相应的间隔,从而使输出有一定的美感。 读文件操作代码: if((fp=fopen("student.txt","r"))==NULL){ cout<<"文件不能打开"< exit(0); } for(intn=0;n fscanf(fp,"%d%s%f%f%f%d%f%f",&r[n].num,r[n].name,&r[n].mark1,&r[n].mark2,&r[n].mark3,&r[n].term,&r[n].sum,&r[n].average); } fclose(fp); cout<<"文件已经读入"< ******插入学生资料模块 用函数Student*insert(Student*r);来实现 主要功能是用来添加学生资料,成绩。 若显示时没有此学生的信息,就可以使用本模块来进行添加。 在此模块代码中定义了另一个指针数组: Student*y=(Student*)newStudent[num+1];用来存放新添加的学生记录。 再利用for循环进行输入新学生记录,for(m=0;m (继续,输入y,否则输入其他)"< ******按学号及学期来查找学生记录模块 用函数voidsearchnum(Student*r);来实现 主要功能时用来查找学生记录。 首先会有提示输入学号及学期,再用for循环语句和if判断语句来进行查找,if(r[m].num[0]==n[0]&&r[m].term==k)若找到则显示学生记录并跳出循环;if(r[m].num[0]! =n[0]&&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)若没有则提示 "该姓名不存在,或没有这个学期的成绩! "。 ******-查找输出语句实现的代码如下: cout<<"学号"< cout< ******修改学生记录模块 用函数voidchange(Student*r)来实现 主要功能是用来修改学生记录。 首先也要有个判断语句,来看看要修给的学生是否存在,这个是通过学号及学期来判断的(学号是不会有重复的),这里会有提示输入学号及学期,之后是for和if语句,if(r[m].num==n&&r[m].term==k)若存在则先输出修改之前的信息,查看是否正确。 若正确,则修改此学生记录,这里有个while循环语句,和switch-case选择语句,用来选择修改哪科成绩,和是否进行再修改记录(通过选择Y或y来实现)。 最后将修改过后的记录保存到文件中去,并输出提示"文件已修改并写入"。 ******按学号及学期删除学生记录 用函数voidshanchu(Student*r)来实现 主要功能是用来删除学生记录。 首先有个度文件的操作,之后会有判断语句,根据所输入的学号及学期,来显示删除前的信息记录,添加for循环语句,循环把后一位的信息提前一位,整体数量减一,来进行全局变量的修改,之后再把修改过后的信息记录保存到文件中去。 在现实中会有由于某些原因而不在学校的同学的记录,这时候就要对其记录进行删除操作,这样可以使系统及时更新并得到优化。 ******按数据结构成绩(冒泡)降序排序模块 用函数voidmaopao(Student*r)来实现 主要功能时是用来对学生的记录来按单科成绩进行排序。 这样方便对某科成绩有个大致的了解。 首先会有一个读文件操作,为排序做基础。 本排序使用冒泡排序。 它有两个优点: 一是“编程复杂度”很低,很容易写出代码;二是具有稳定性,这里的稳定性是指原序列中相同两元素的相对顺序仍然保持到排序后的序列。 冒泡排序时进过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大(则升序,小则降序。 本程序一律采用降序)则交换两数。 本程序中冒泡排序代码如下: for(intk=0;k for(intm=0;m Studentmax; if(r[m].mark2 max=r[m+1]; r[m+1]=r[m]; r[m]=max; } } } cout<<"排序完毕"< 排序之后,将排序之后的结果写入文件,再打开文件的时候,里面显示的就是按单科成绩排序后的结果。 ******按总分(选择)降序排序 用函数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趟直接选择排序得到有序结果。 本程序中选择排序代码如下: for(inti=0;i intmax=i; for(intj=i;j if(r[max].sum max=j; } } Studenttemp; temp=r[max]; r[max]=r[i]; r[i]=temp; } cout<<"排序完毕"< 排序之后,将排序之后的结果写入文件,再打开文件的时候,里面显示的就是按单科成绩排序后的结果。 ******统计各科总分及平均分模块 用函数voidtongji(Student*r)来实现 主要功能是计算总分和各科平均分。 代码比较容易实现,计算完之后将总分保存到文件中即可。 *****以上就是本程序的详细设计及基本思想***** 4、所遇到的问题和分析解决 1、存在的不足 本学生成绩管理系统由十大模块组成,每个模块相互联系又相互独立。 这个学生成绩管理系统存在着很多不足之处,由于自己本身编程能力的问题,这个系统可以实现的功能非常有限。 只能实现学生管理系统最基本的功能,可以进行简单的输入、输出学生资料,查询和修改学生信息,能直接从文件中读入数据,能对系统所作的修改、操作进行保存等。 而且在每个模块也有不足的地方,比如在输入学生资料时,对每个信息项没有严格的规定,可以输入任何的字符。 这有待以后努力,更详尽的实现模块的功能。 2、do-while语句的位置问题 在修改学生记录此模块中,若循环语句的位置不对那么这个循环就会自动跳出,或变为乱码,不能实现原有的功能。 所以要想清楚到底是在哪安放,按照逻辑思路找到相应的语句正确添加就行了。 3、指针数组的使用 就是在插入学生记录模块中,另一个指针数组的定义,之前做的时候没有注意到这点,结果所做的修改不能够保存到文件,之后操作的时候也没有显示所做修改的记录,之后找了资料看了之后才知道,是变量的问题,所以最后作了修改,加了一个另外的指针数组。 4、system('cls')的使用问题 刚开始时对菜单的切换不是很了解,编写的程序运行的时候是一竖行向下的,很影响使用者的视觉范围,通过查询一些资料得知了system('cls')的作用,能够把一些暂时不用或不相关的信息通过清屏来处理。 5、细节方面 其实在有些细节方面还是要特别注意啊,比如分号的添加,<<与>>的方向问题,函数的返回值等问题,虽然容易改掉,但是很容易养成不好的习惯,而且还会浪费时间,所以在一开始写的时候就要很仔细,这样才能保证程序编的精细,同时若出现很多这样的错误的话,在编写程序的时候也会心里烦的,所以在编程的时候要认真仔细。 6、文件的写入与读出 刚开始时对文件的操作不是很明白,一直不能很好的操作文件,直到最后验收的时候,仍旧出现了严重的问题,就是对已经存在的文件读取问题,通过"读取文件并输出学生信息",将数据从文件中读取,但是不能够正常的读出,最后把读文件的操作语句进行仔细检查后,发现语句的顺序有点问题,把fscanf()语句进行再修改后就能够正常的读取文件了。 7、内存的分配问题 对于初学者的话对内存的分配和释放问题是比较抽象的和模糊的问题,在排序是之前就出现了交换数据困难的问题,以及内存分配空间繁琐释放空间不及时的问题,造成空间的浪费,使得程序运行时效率较低,因此最后采用了顺序存储记录的方式,这就能改变前面所出现的问题。 8、较小的问题方面 其余的就没什么比较大的问题了,基本上只要细心一点的话就可以正确调试了。 5、系统特色及关键技术 其实在本程序的设计过程当中,没有很吸引人的关键技术,因为本人的C语言或C++语言都不是学的很好,所以当初设计的时候就只是想把功能都实现就好了,尽可能的把所要求的功能都编进程序,这样就觉得很满足了。 所以都是设计的比较简单易懂的语言,这样自己能够更明白一些,所以就没有时间去细细地去设计自己的程序。 本程序要说有什么值得说的,那就只有人性化这点了,在设计成学的时候,因为自己怕弄混了,所以添加了很详尽的提示,这样在编程的过程中或调试的时候都能够比较快的运行。 还有就是尽可能的应用了do-while语句和switch-case语句,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 学生 成绩管理系统 毕业 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)