# 基于QT实现的学生成绩管理系统
# 1.系统需求分析
学生成绩管理系统记录了学生大一的各科成绩及每门课程的成绩,它包括:学
期、姓名、班级(汉字)、学号、科目、学分、分数,试设计学生成绩管理系统,使之能提供以下功能:
- **录入、修改学生的各科的成绩信息**:从键盘输入数据(提示:为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:学期 姓名 班级 学号 科目 学分 分数。每行一条记录。并在输入不合法记录时报错。若该信息已存在则覆盖原信息。系统根据分数得到该信息对应的评级、学分绩及是否挂科。
- 例如:大一上学期 王世杰 无七六 2016010539 工程制图 2 87
- 此时系统得到该信息评级为 B+,学分绩为 3.3,未挂科
- **查询某个学生某学期或整个学年各门课的成绩**:按照分数降序排列,相同的课程按学分降序排列,并提供该课程的评级和学分绩。同时给出该时间段平均学分绩
- **统计某课程所有学生总成绩情况**,按照分数(总学分绩)降序排列,相同的按学号升序排列
- **查询某课程所有学生成绩**,按照分数(总学分绩)降序排列,相同的按学号升序排列
- **统计学生挂科数并按降序排列**,相同的按姓名升序排列
- **系统以菜单方式工作**。(所谓菜单指用户可以自由选择所要执行的功能。学生可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便)
# 2.总体设计
大一学生成绩管理系统包含五个大的功能,分别是:录入、修改学生成绩,查询某学生成绩,查询某课程所有学生成绩,查询所有学生总成绩情况,查询挂科情况。每个功能对应一个界面,每个界面均有操作提示,并可返回之前的界面。学生的成绩信息主要包含学期、姓名、班级(汉字)、学号、科目、学分、分数,以及根据分数转换得到的学分绩、评级和是否挂科。信息存储基于文件操作。
打开系统首先是进入欢迎界面,打出欢迎使用的字样。在欢迎界面,系统会自动根据存储信息的文件统计文件中的信息条数,创建录入信息类对象数组来存放最新版本的信息并将其写入文件。同时制作所有学生的 studentGrade 类对象数组。
紧接着进入主界面,有 6 个选项,分别是进入对应 5 个功能的界面及结束界面。
在录入、修改学生成绩界面(page1),根据系统提示一次性输完一整条信息。若输入信息有误,如学期不正确(不为大一上学期或大一下学期),则报错,提示重新输入。系统根据信息的学期、姓名、科目信息判断是否为新信息,若为新信息则覆盖原信息。在退出该界面时,更新文件并统计文件中的信息数,创建录入信息类对象数组来存放最新版本的信息。同时制作所有学生的 studentGrade 类对象数组。
在查询某学生成绩界面(page2),用户首先输入要修改的学生学号,再选择要查询的学期。如果系统中没有该学生的相关信息,则系统会给相关提示。如果系统中有该学生的相关信息则按照分数降序排列,相同的课程按学分降序排列,并提供该课程的评级和学分绩。
在查询某课程所有学生成绩情况界面(page3),用户先输入要查询的学期和课程名,系统检索判断是否存在该课程。若不存在则提示系统中无此课程。若存在显示该课程所有学生成绩,按分数降序排列,分数相同则按学号升序排列。
在查询所有学生总成绩情况界面(page4),用户先根据提示选择查询的学期。显示该学期所有学生成绩,按平均学分绩降序排列,相同则按学号升序排列。
在查询挂科情况界面(page5),用户先根据提示选择查询的学期。显示该学期所有出现挂科情况的同学的挂科学分和挂科数目,按挂科数降序排列。相同按挂科学分降序排列。再相同按学号升序排列。
在结束界面(page6),系统会自动清空所有动态内存、关闭文件,同时打出感谢使用本系统的字样,希望给用户最好的体验。
大一学生成绩管理系统中功能模块图:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/ac01a331e67d943f128b69f4dd26e74e.writebug)
# 3.详细设计
大一学生成绩管理系统中**五个类的类层次图**为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/eb1989b89e6a024239550a7e1de16d3d.writebug)
大一学生成绩管理系统中各功能模块的实现:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/1a5f0e0e7ba0785862c6adf43a3f7308.writebug)
**界面 1:录入、修改学生的成绩 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/9b28ca13b97efd5aea1b0d8dcf08b97b.writebug)
**界面 2:查询某学生成绩 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/86e97d912a03f62eb8e19a0d823c988e.writebug)
**界面 3:查询某课程所有学生成绩 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/bddb1e32a9c9913c2f0d18e3ee4e5a4e.writebug)
**界面 4:查询所有学生总成绩 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/09fe8f386b5c546ba7dd6054abbe2ab0.writebug)
**界面 5:查询挂科情况 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/4d52505821867b5190c89eaa97ff1bce.writebug)
**欢迎界面 **
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b3c8d94369a9f36876c840a981feaaee.writebug)
**结束界面**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/960fafb4006b8f18d5ed37d88bb39347.writebug)
大一学生成绩管理系统中**五个类的 UML 图**为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/60e7e420201fa729fbb6925f1ae514eb.writebug)
# 4.系统调试
程序编写完成后,我进行了调试。调试过程中,出现了以下三个主要问题:
- 以姓名为关键词不能对重名现象进行很好的结局。编 一开始我才去以姓名为关键字进行搜索,在室友的提醒下,我将程序改为用学号为关键词进行搜索,解决了这一问题
- 系统应对错误输入的能力严重不足。最初版本的程序对输入没有任何检测,经常会出现原本应输入汉字或汉字的地方我输入一堆字母,系统没有任何提示,并将错误输入写入了文件中,导致在检索、排序的时候以及显示所有学生成绩的时候,出现重大问题。于是我在所有需要输入的地方加入了检测功能,一旦输入不合要求就出现提示并重新回到输入界面
- 系统应对大量误操作时会崩溃。作为开发者我对程序较为了解,输入等操作比较合法,也比较舒缓。当我把系统交给我室友检测时,他在短时间内随便按下键盘,这就导致在主界面短时间内出现大量误操作。当时我将 update 部分放在了进入主界面时执行,而主界面出现误操作后会重新进入主界面,这就意味着如果主界面短时间出现大量误操作,就需要短时间内执行多次 update,而 update 部分需要执行扫描整个文件、排序、 重新写入文件、建立 studentGrade 对象动态数组等多个步骤,执行需要时间相对较长。 这导致系统无法在短时间内处理多次 update,所以系统会崩溃。由于 update 函数无法更 改,我就尝试从其他角度解决这个问题。我想到 update 函数负责更新,而只有在信息发 生变化的时