大作业:班级成绩数据管理系统
**背景**:假设你是数学老师,需要管理班级学生的多门数学相关成绩(如单元测验、期中、期末成绩,均为整数)。本作业要求实现成绩的录入、查询、修改、删除及统计分析
一、核心数据结构
用**字典列表**存储学生信息,所有数据均为整数(无字符串),初始预设3-5条数据,示例:
```python
学生数据格式:id为唯一整数标识,scores为整数列表(存储多门成绩)
students = [
{"id": 1, "scores": [85, 90, 88]}, # id=1的学生,3门成绩分别为85、90、88
{"id": 2, "scores": [79, 82, 91]},
{"id": 3, "scores": [95, 89, 92]}
]
```
二、必做功能需求(共7项)
- 菜单交互框架
程序启动后,通过`print`显示固定菜单(菜单文字为字符串常量,不涉及字符串方法),用户输入1-6的整数选择功能,执行后返回菜单(选6则退出)。菜单格式:
```
班级成绩管理系统
-
查看所有学生成绩
-
添加新学生
-
修改学生成绩
-
删除学生
-
成绩统计分析
-
退出系统
请输入功能编号(1-6):
```
- 查看所有学生成绩
遍历`students`列表,按固定格式打印每个学生的id和成绩(用`print`直接输出整数和列表,不拼接字符串)。示例输出:
```
所有学生成绩:
id: 1 成绩: [85, 90, 88]
id: 2 成绩: [79, 82, 91]
id: 3 成绩: [95, 89, 92]
```
- 添加新学生
步骤(全程用整数输入,不处理字符串):
-
提示用户输入"新学生id(整数)";
-
遍历`students`列表,检查该id是否已存在(对比字典的`"id"`键值):
-
若存在:打印"id已存在,添加失败";
-
若不存在:提示用户输入"成绩数量(整数,至少1)",再逐个输入对应数量的成绩(每个成绩为整数),组成`scores`列表,最后创建新字典`{"id": 输入id, "scores": 成绩列表}`并添加到`students`,打印"添加成功"。
- 修改学生成绩
步骤:
-
提示用户输入"要修改的学生id(整数)";
-
遍历`students`列表,检查id是否存在:
-
若不存在:打印"未找到该学生,修改失败";
-
若存在:提示用户输入"新的成绩数量(整数)",再逐个输入新成绩(整数),替换该学生字典的`"scores"`值,打印"修改成功"。
- 删除学生
步骤:
-
提示用户输入"要删除的学生id(整数)";
-
遍历`students`列表,检查id是否存在:
-
若不存在:打印"未找到该学生,删除失败";
-
若存在:用`remove()`方法从`students`中删除该学生字典,打印"删除成功"。
- 成绩统计分析
计算并打印4项结果(均为数值运算,无字符串处理):
-
**班级总人数**:直接用`len(students)`获取;
-
**平均总分**:
-
先遍历每个学生,计算其`scores`列表的总和(`sum(学生["scores"])`),存到"总分列表";
-
用"总分列表的总和 ÷ 总人数",结果保留1位小数(用`round()`函数);
- **最高分学生**:
-
从"总分列表"中找最大值(`max(总分列表)`);
-
遍历学生列表,找出所有总分等于该最大值的学生,打印其id和总分;
- **按总分排名**:
-
创建"(id, 总分)"元组列表(如`[(1, 263), (2, 252), ...]`);
-
用`sorted()`按"总分从高到低"排序(`key=lambda x: x[1]`,`reverse=True`);
-
按"排名X:id=X,总分=X"格式打印(用`print`直接输出整数)。
示例输出:
```
成绩统计分析:
-
班级总人数:3
-
平均总分:261.7
-
最高分学生(总分276):
id=3,总分=276
- 按总分排名:
排名1:id=3,总分=276
排名2:id=1,总分=263
排名3:id=2,总分=252
```
- 退出系统
用户输入6时,打印"系统退出,再见!",用`break`终止程序。
三、进阶功能(选做,加分项)
-
**按科目查平均分**:提示用户输入"科目序号(从1开始,如1表示第一门成绩)",遍历所有学生的`scores`列表,提取对应序号的成绩,计算平均分(保留1位小数);
-
**成绩去重**:在"添加"和"修改"功能中,对输入的成绩列表去重(如输入`90, 85, 90`,处理后为`[90, 85]`),用集合实现(`list(set(成绩列表))`,再按输入顺序调整);
-
**批量添加学生**:提示用户先输入"要添加的学生数量(整数n)",再依次输入n个学生的id和成绩(每个学生先输id,再输成绩数量和逐个成绩),批量添加(id存在则跳过)。
四、提交要求
-
**代码注释**:关键逻辑(如查id、统计总分、排序)需加注释,说明操作目的;
-
**无字符串方法**:代码中不得出现任何字符串对象的方法(如`split()`、`len("abc")`、`"a" + "b"`等,允许用`print`输出字符串常量);
-
**知识点说明**:在代码末尾用注释列出用到的知识点(如"列表的append/remove、字典的键值访问、for/while循环、if条件判断、sum/len/max/sorted函数、算术运算符、比较运算符"等)。
设计思路提示
-
**输入处理**:所有用户输入均用`int(input())`直接转为整数,避免对输入的字符串做任何处理(如用户输入"3",直接用`int(input())`得到3);
-
**功能拆分**:将每个功能写成函数(如`show_students()`、`add_student()`),菜单选择时调用,减少重复代码;
-
**查id复用**:写一个辅助函数`get_student(target_id)`,遍历`students`返回对应学生字典(或`None`),供添加、修改、删除功能复用;
-
**排名实现**:用`sorted()`对"id-总分"元组列表排序,通过`enumerate()`获取排名序号(从1开始)。
python
students=[
{'id':1,'scores':[85,90,88]},
{'id':2,'scores':[79,82,90]},
{'id':3,'scores':[95,90,88]}
]
while True:
print('''===班级成绩管理系统===
1.查看所有学生成绩
2.添加新学生
3.修改学生成绩
4.删除学生
5.成绩统计分析
6.退出系统
请输入编号(1-6):''')
choice=int(input())
if choice==1:
print('所有学生成绩:')
for student in students:
print('id:',student['id'],'成绩:',student['scores'])
elif choice==2:
new_id=int(input('请输入新学生ID:'))
is_exits=False
for student in students:
if student['id']==new_id:
is_exits=True
break
if is_exits:
print('id存在,添加失败')
else:
num=int(input('请输入成绩:'))
scores=[]
for i in range(num):
score=int(input(f'请输入第{i+1}个成绩'))
scores.append(score)
students.append({'id':new_id,'scores':scores})
print('添加成功')
elif choice==3:
target_id=int(input('请输入要修改学生的id:'))
found_student=None
for student in students:
if student['id']==target_id:
found_student=student
break
if found_student is None:
print('未找到该学生,修改失败')
else:
num=int(input('请输入新的成绩:'))
new_scores=[]
for i in range(num):
score=int(input(f'请输入第{i+1}个新成绩:'))
new_scores.append(score)
found_student['scores']=new_scores
print('修改成功')
elif choice==4:
target_id=int(input('请输入要删除学生的id:'))
found_student=None
for student in students:
if student['id']==target_id:
found_student=student
break
if found_student is None:
print('未找到该学生,删除失败')
else:
students.remove(found_student)
print('删除成功')
elif choice==5:
if len(students)==0:
print('暂无学生数据,无法统计')
else:
total_num=len(students)
print('成绩统计分析')
print('1.班级总人数:',total_num)
total_scores=[]
for student in students:
total=sum(student['scores'])
total_scores.append(total)
avg_total=sum(total_scores)/total_num
print('2.平均分:',round(avg_total,1))
max_total=max(total_scores)
print(f'3.最高分学生(总分{max_total}):')
for i in range(total_num):
if total_scores[i]==max_total:
print('id=',students[i]['id'],',总分',max_total,sep='')
id_total=[]
for i in range(total_num):
id_total.append((students[i]['id'],total_scores[i]))
sorted_id_total=sorted(id_total,key=lambda x:x[1],reverse=True)
print('4.按总分排名:')
for rank in range(len(sorted_id_total)):
sid=sorted_id_total[rank][0]
tscore = sorted_id_total[rank][1]
print(f'排名{rank + 1}:id={sid},总分={tscore}')
elif choice==6:
print('系统退出')
break
else:
print('输入错误,请输入(1-6)之间的数')
结果:
主界面

1.查看所有成绩

2.添加新学生

3.修改学生成绩

4.删除学生

5.成绩统计分析

6.退出系统
