一、题目(题目有点长,希望没有吓到大家)
(一)学校现状分析
1、某学校有本科生和研究生两类学生,学生信息包括基本资料数据和成绩数据两部分。
A.本科生:基本资料数据包括学号、姓名、性别、专业、班级,学号自动生成,其他全部是输入项;成绩数据包括高数成绩、英语成绩、C语言成绩、总成绩、班级排名、校级排名,其中:高数成绩、英语成绩、C语言成绩为输入项,总成绩、班级排名、校级排名是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。
B.研究生:基本资料数据包括学号、姓名、性别、专业、班级、研究方向、导师,学号自动生成,其他全部是输入项;成绩数据包括课程综合成绩、论文成绩、总成绩、班级排名、校级排名,其中:课程综合成绩、论文成绩为输入项,总成绩、班级排名、校级排名是计算项,班级排名是总成绩在班内的名次,校级排名是总成绩在校内的名次。
2、现在需要开发一个学生成绩管理系统对学生成绩进行有效管理。
(二)系统的功能要求
数据维护管理:要求对学生的基本资料数据和成绩数据分开管理。基本资料数据的维护管理功能包括添加(批量、单个)、修改、删除、查询等;成绩数据的维护管理功能包括输入(批量、单个)、修改、删除、查询等。
A. 基本资料数据的维护管理
(1).添加:(批量、单个)添加学生基本资料数据。本科生的基本资料数据包括学号、姓名、性别、专业、班级,学号自动生成,其他全部是输入项。研究生的基本资料数据包括学号、姓名、性别、专业、班级、研究方向、导师,学号自动生成,其他全部是输入项
(2).修改:根据学号来修改任意学生的除学号外的其他基本资料数据。
(3).删除:根据学号删除一个学生。
(4).查询:根据学号查询一个学生的基本资料数据。
B. 成绩数据的维护管理
(1).输入:(批量、单个)输入学生成绩数据。成绩数据根据学生类型的不同而有区别,输入的相关数据也应不同。注意:总成绩、班级排名、校级排名是计算项,不能输入。
(2).修改:根据学号来修改任意学生的相关成绩数据(注意:不同类别学生相关数据不同)。
(3).删除:根据学号删除一个学生(不能删除,只需将相关数据项设置成-1)。
(4).查询:根据学号查询一个学生的成绩数据。
(5).计算:批量计算所有学生的总成绩、班级排名、校级排名。注意,只有各项数据都为有效数据时(-1为无效数据),才能计算。
排名功能
A:班级排名:分本科生和研究生两类学生,计算每个学生总成绩在班级中的名次。
B:校级排名:分本科生和研究生两类学生,计算每个学生总成绩在全校中的名次。
排序功能:分本科生和研究生两类人员,实现下列排序功能。
- 所有学生信息按总成绩从高到低排序并显示。
- 某个班学生信息按总成绩从高到低排序并显示。
查询功能
分本科生和研究生两类人员,实现下列查询功能。
- 分页显示全部学生的信息。分页功能:每页显示10条学生的信息,有上一页、下一页、首页和最后一页的功能。
- 能够按班级显示本班全部学生信息。注意:无需分页显示。
- 能够根据学号或者姓名查询学生信息。
- 能够在某个班级中查询某门课成绩不及格学生信息。注意:无需分页显示。
统计功能
分本科生和研究生两类人员,实现下列统计功能。
- 统计并显示某门课每个班的平均成绩。如果学生该门课没有成绩,则统计时忽略该生。
- 在某个班中统计并显示某门课程不同等级的学生人数。等级标准:优—成绩大于等于90;良—成绩大于等于80且小于90;中:成绩大于等于70且小于80;及格:成绩大于等于60且小于70;不及格:成绩小于60。
(三)系统的实现技术要求
- 学生用结构体表示,本科生和研究生分别用两个链表来存储表示。
- 必须用文件来存储学生信息。
A.建立本科生和研究生两个文件,分别存放两类学生的信息。
B. 开始运行程序时,从文件中读取学生信息链入到两个不同的链表。
C. 退出程序时将学生信息保存到不同的文件。
D. 主菜单有一个菜单项能够将学生信息保存到文件。
数据约束:
- 学号:整型、不能重复、从1开始依次递增、由软件自动计算产生,不能修改。
- 性别:男和女,必须使用枚举类型。
- 各种成绩:整型,取值范围为0-100。-1表示未有此项成绩。
- 其他:至少有两层菜单。
二、运行结果视频
视频中展示了程序的一部分功能
C语言大作业:2000+行代码的学生信息管理系统
三、作者写代码过程中的一点小感悟
一开始写代码时,我是纯纯地自己敲。敲出来的代码虽然没有语法错误,可就是得不到正确的运行结果。后来才发觉,我的代码写出来有问题,是因为文件的知识没有过关,于是我先去敲了六个与文件有关的程序设计题,也就是我前几天发在CSDN上的那几个题。回头再敲这个大作业,果然熟练多了,代码也能得到正确的运行结果了。
后来听同学说书上有代码的一小部分片段,我就看了书,我的代码和书上的一对比,我发现我写的代码很不专业,不能够很好地处理用户输入的非法数据。于是我模仿书上的代码改进了自己的代码,使其更健壮,更有逻辑性。所以说,不要脱离课本,要多看看专业的、有权威性的代码,不要完全根据自己的“一厢情愿”去敲。
后来敲完了所有代码之后,我开始在主函数中测试我之前编写的自定义函数是否正确,这是一个漫长而且有点痛苦的过程,还好我用的是多文件代码,模块化处理,不然的话调试会花费更长时间。但这也给了我一个教训,以后写有很多个自定义函数的代码时,要写一个函数测试一个函数,如果敲完所有代码再进行测试,那工程量可就大了。
整个程序敲完,我用了2445行代码,但是后来上高数课(没错,不是C语言课)的时候,我灵光乍现,想到了一个排名函数的优化算法,时间复杂度和空间复杂度都能得到优化。于是上完高数课,我就冲回宿舍改代码,改完之后是2319行,但是包含了空行和注释行,净行数会比2319行少一些。
这个程序的成功运行给了我极大的成就感和自信心,在敲代码的过程中也学到了一些经验,可以为后续的学习铺平道路。
四、想要完整源代码的小伙伴请私聊我!!!