实验9 综合设计性实验:学生成绩管理系统
本实验为综合设计性实验。要求学生综合运用结构体、数组、文件、菜单与循环等知识,设计并实现一个基于文本菜单的学生成绩管理系统,管理对象为(学号、姓名、语文成绩、数学成绩、英语成绩、总分、平均分)七项信息,并完成下述全部 7 项功能。本实验不提供完整参考代码,需自行设计与实现。
一、实验目的
- 掌握结构体(struct)的定义与使用,能用结构体数组组织多条学生记录。
- 掌握菜单驱动程序的设计方法:用循环不断显示菜单,用 switch 分发不同功能。
- 综合运用排序(按总分降序)、查找(按学号或姓名)、增删改等算法。
- 掌握文本文件的读写:程序启动时读入历史数据,退出时保存全部数据。
二、功能要求
系统以文本菜单方式运行,至少实现以下 7 项功能:
- 录入:批量或单条录入学生信息(学号、姓名、语文、数学、英语),自动计算总分与平均分。
- 浏览:以表格形式浏览全部学生,按总分从高到低降序排列。
- 查询:支持按学号查询,也支持按姓名查询,输出该生完整信息。
- 修改:按学号定位学生,修改其语文、数学、英语成绩,并重算总分与平均分。
- 删除:按学号定位学生,将其从记录中删除(后续记录前移)。
- 统计:计算各科平均分、最高总分及对应学生,并输出分数段人数分布(如 [90,100]、[80,90)、[70,80)、[60,70)、[0,60))。
- 文件存取:程序启动时从数据文件(如 students.txt)读入已有记录;退出系统时将所有记录写回文件。
三、数据结构与菜单设计
- 数据结构:定义学生结构体,包含学号(字符串)、姓名(字符串)、语文/数学/英语(实型)、总分(实型)、平均分(实型)共 7 个成员;用结构体数组作为主存储,并用一个整型变量记录当前人数。
- 主菜单:程序进入一个循环,每次清屏(或换行分隔)后打印功能编号与名称,提示用户输入选项;输入 1~7 执行对应功能,输入 0(或其他约定的退出项)则先保存再退出。使用 switch 语句将选项分发到各功能函数。
- 持久化:约定数据文件为
students.txt,每行保存一名学生的 7 个字段,字段间以空格或逗号分隔。启动时若文件存在则逐行读入,不存在则建立空记录集并给出提示。
说明:以下 7 个“实验内容”分别对应上述 7 项功能,每个功能给出功能说明、输入/输出格式、实现要点与示例,供设计时参考。
实验内容1 录入功能
功能说明
向系统中新增学生记录。每录入一名学生,需依次输入学号、姓名、语文、数学、英语,程序自动计算:
- 总分 = 语文 + 数学 + 英语
- 平均分 = 总分 ÷ 3
并将该记录追加到结构体数组末尾,当前人数加 1。需判断人数是否已达上限。
输入格式
菜单选择“录入”后,按提示依次输入:
- 一行:学号(字符串,不含空格)
- 一行:姓名(字符串,不含空格)
- 一行:三个实数,分别为语文、数学、英语成绩(用空格分隔,取值 0~100)
可连续录入多名,直到用户选择结束录入。
输出格式
每成功录入一名,提示“录入成功”,并显示当前总人数;若超过容量上限,提示“容量已满”。
实现要点
- 用循环读取,直到用户主动结束或达到上限。
- 录入后立即计算总分与平均分并存入结构体成员。
- 注意成绩取值范围校验(可选)。
示例
输入:
1
2023001
张三
88 92 79
0
输出:
录入成功!当前共 1 名学生。
实验内容2 浏览功能(按总分降序)
功能说明
以表格形式列出全部学生,并按总分从高到低排序后显示(仅改变显示顺序,不破坏原存储顺序,或排序后写回均可,需在设计中说明)。
输入格式
菜单选择“浏览”即可,无需额外输入。
输出格式
输出表头与每行记录,建议格式如下(总分、平均分保留 2 位小数):
学号 姓名 语文 数学 英语 总分 平均
2023003 王五 95 90 88 273.00 91.00
2023001 张三 88 92 79 259.00 86.33
2023002 李四 70 65 80 215.00 71.67
实现要点
- 按总分降序可使用冒泡排序或选择排序,比较时使用总分成员。
- 若仅改变显示顺序,可复制索引数组排序后按索引输出,避免移动原数据。
示例
输入:
2
输出:
学号 姓名 语文 数学 英语 总分 平均
2023003 王五 95 90 88 273.00 91.00
2023001 张三 88 92 79 259.00 86.33
2023002 李四 70 65 80 215.00 71.67
实验内容3 查询功能(学号 / 姓名)
功能说明
支持两种查询方式:按学号精确查询,或按姓名查询(允许同名时输出多条)。
输入格式
菜单选择“查询”后,先选择查询方式:
- 输入 1 表示按学号查询,随后输入一个学号;
- 输入 2 表示按姓名查询,随后输入一个姓名。
输出格式
命中则输出该生完整信息(学号、姓名、三科成绩、总分、平均分,数值保留 2 位小数);未命中则提示“未找到”。
实现要点
- 按学号:遍历数组,字符串比较相等即命中。
- 按姓名:遍历数组,字符串比较相等即输出,可命中多条。
- 注意区分大小写或约定统一大小写(设计中说明)。
示例
输入:
3
1
2023001
输出:
学号:2023001 姓名:张三 语文:88.00 数学:92.00 英语:79.00 总分:259.00 平均:86.33
实验内容4 修改功能
功能说明
按学号定位学生,重新输入其语文、数学、英语成绩,并重算总分与平均分。
输入格式
菜单选择“修改”后:
- 一行:目标学号
- 一行:三个实数,分别为新的语文、数学、英语成绩
输出格式
修改成功则回显该生更新后的完整信息;若学号不存在则提示“未找到,修改失败”。
实现要点
- 先查找学号,找到后覆盖三科成绩成员,重新计算总分与平均分。
- 未找到时不做任何修改。
示例
输入:
4
2023001
90 90 90
输出:
修改成功!
学号:2023001 姓名:张三 语文:90.00 数学:90.00 英语:90.00 总分:270.00 平均:90.00
实验内容5 删除功能
功能说明
按学号定位学生,将其从记录中删除,后续记录依次前移,当前人数减 1。
输入格式
菜单选择“删除”后,一行输入目标学号。
输出格式
删除成功则提示“已删除”并显示剩余人数;若学号不存在则提示“未找到,删除失败”。
实现要点
- 找到目标下标 i 后,将 i+1 到末尾的元素整体向前拷贝一格(覆盖式移动)。
- 人数减 1;注意边界(删除最后一名时只需人数减 1)。
示例
输入:
5
2023001
输出:
删除成功!当前共 2 名学生。
实验内容6 统计功能
功能说明
对当前全部记录进行统计:计算语文、数学、英语三科各自的平均分;找出最高总分及其对应学生(姓名/学号);统计分数段人数分布。
输入格式
菜单选择“统计”即可,无需额外输入。
输出格式
依次输出:
- 各科平均分(保留 2 位小数)
- 最高总分及对应学生
- 分数段人数分布,建议分为五段:
- [90,100] 段:x 人
- [80,90) 段:y 人
- [70,80) 段:z 人
- [60,70) 段:w 人
- [0,60) 段:v 人
(分数段按“平均分”或“总分”划分均可,设计中需说明依据。)
实现要点
- 用累加变量求各科总分再除以人数得平均分。
- 最高总分用一次遍历记录最大值与下标。
- 分数段用五个计数器,按平均分(或总分)落入区间递增。
示例
输入:
6
输出:
语文平均:84.33 数学平均:82.33 英语平均:82.33
最高总分:273.00(学号 2023003 姓名 王五)
分数段分布:
[90,100] 段:1 人
[80,90) 段:1 人
[70,80) 段:1 人
[60,70) 段:0 人
[0,60) 段:0 人
实验内容7 文件存取功能
功能说明
实现数据的持久化:程序启动时从数据文件读入已有记录;退出系统时将所有记录写回文件,使下次运行可继续管理。
输入格式
- 启动阶段:尝试打开
students.txt,若存在则逐行读入;不存在则建立空记录集并提示。 - 退出阶段:菜单选择“退出”或输入 0 时,自动将所有记录写入
students.txt。
输出格式
- 启动时输出读入结果,如“已从 students.txt 读入 N 条记录。”或“未找到 students.txt,已创建空记录集。”
- 退出时输出保存结果,如“已保存 N 条记录到 students.txt。”
实现要点
- 读写使用文本方式:每行保存一名学生的 7 个字段,可用空格分隔;读入时按相同格式解析。
- 写入顺序:先打开文件,再循环写出每条记录,最后关闭。
- 启动时若文件为空或不存在,应正确初始化人数变量为 0。
- 注意文件打开失败(如路径不可写)时的健壮性处理。
示例
启动输出:
已从 students.txt 读入 3 条记录。
退出输出:
已保存 3 条记录到 students.txt。