目录
5. 计算平均分功能 (calculate_average)
一、 代码结构优点
- 类封装合理:将学生成绩管理系统封装在
StudentGradeSystem
类中,符合面向对象设计原则 - 数据结构选择恰当:使用字典存储学生信息(学号作为键),列表存储成绩
- 功能模块完整:实现了添加、删除、修改、查询、统计等核心功能
- 错误处理机制:对成绩输入进行了异常捕获,防止无效输入
- 用户界面友好:提供了清晰的菜单导航系统
二、代码块分析
1. 类定义和初始化
class StudentGradeSystem:
def __init__(self):
self.students = {}
StudentGradeSystem
是主类,代表整个成绩管理系统__init__
是构造函数,在创建对象时自动调用self.students = {}
创建一个空字典,用于存储学生信息键(key): 学号 (student_id)
值(value): 包含学生信息的字典 (name和scores)
2. 添加学生功能 (add_student
)
def add_student(self):
student_id = input("请输入学号:")
if student_id in self.students:
print("该学号已经存在!")
return
name = input("请输入名字:")
score_input = input("请输入各科成绩(用空格分隔):")
try:
scores = list(map(float, score_input.split()))
self.students[student_id] = {"name": name, "scores": scores}
print(f"学生{name}添加成功!")
except ValueError:
print("成绩输入无效,请确保输入的是数字!")
功能流程:
输入学号,检查是否已存在
输入学生姓名
输入各科成绩(用空格分隔)
尝试将输入的成绩转换为浮点数列表
如果成功,将学生信息添加到字典
如果转换失败,提示输入错误
3. 删除学生功能 (remove_student
)
def remove_student(self):
student_id = input("请输入要删除学生的学号: ")
if student_id in self.students:
name = self.students[student_id]['name']
del self.students[student_id]
print(f"学生 {name} 已删除!")
else:
print("未找到该学号对应的学生!")
功能流程:
输入要删除的学生学号
检查该学号是否存在
如果存在,获取学生姓名并删除该学生记录
如果不存在,提示未找到
4. 修改成绩功能 (modify_scores
)
def modify_scores(self):
student_id = input("请输入要修改成绩的学号: ")
if student_id not in self.students:
print("未找到该学生!")
return
print("当前成绩:", self.students[student_id]['scores'])
new_scores = input("请输入新的成绩(用空格分隔): ")
try:
scores = list(map(float, new_scores.split()))
self.students[student_id]['scores'] = scores
print("成绩修改成功!")
except ValueError:
print("成绩输入无效,修改失败!")
功能流程:
输入要修改成绩的学生学号
检查该学号是否存在
显示当前成绩
输入新的成绩
尝试将新成绩转换为浮点数列表
如果成功,更新学生成绩
如果转换失败,提示输入错误
5. 计算平均分功能 (calculate_average
)
def calculate_average(self, scores):
if len(scores) == 0:
return 0.0
return sum(scores) / len(scores)
这是一个辅助函数:
接收一个成绩列表
如果列表为空,返回0.0
否则计算并返回平均分
在其他函数中被调用
6. 查询单个学生信息 (show_student
)
def show_student(self):
student_id = input("请输入要查询学生的学号: ")
if student_id in self.students:
student = self.students[student_id]
avg = self.calculate_average(student['scores'])
print(f"\n学号: {student_id}")
print(f"姓名: {student['name']}")
print(f"成绩: {student['scores']}")
print(f"平均分: {avg:.2f}")
else:
print("未找到该学生!")
功能流程:
输入要查询的学生学号
检查该学号是否存在
如果存在,获取学生信息并计算平均分
打印学生详细信息(学号、姓名、成绩、平均分)
如果不存在,提示未找到
7. 显示所有学生信息 (show_all
)
def show_all(self):
if not self.students:
print("没有学生记录!")
return
print("\n===== 所有学生信息 =====")
for sid, info in self.students.items():
avg = self.calculate_average(info['scores'])
print(f"学号: {sid} | 姓名: {info['name']} | 成绩: {info['scores']} | 平均分: {avg:.2f}")
print("=======================")
功能流程:
检查是否有学生记录
如果没有,提示没有记录
如果有,遍历所有学生
对每个学生计算平均分
打印所有学生信息
8. 课程统计功能 (course_statistics
)
def course_statistics(self):
if not self.students:
print("没有学生记录!")
return
# 确定课程数量(取最大成绩列表长度)
num_courses = max(len(info['scores']) for info in self.students.values())
print("\n===== 课程成绩统计 =====")
for course_idx in range(num_courses):
course_scores = []
for info in self.students.values():
if course_idx < len(info['scores']):
course_scores.append(info['scores'][course_idx])
if course_scores:
avg = sum(course_scores) / len(course_scores)
print(f"课程{course_idx+1}: 平均分={avg:.2f} | 最高分={max(course_scores)} | 最低分={min(course_scores)}")
print("=======================")
功能流程:
检查是否有学生记录
确定课程数量(取所有学生中成绩数量最多的)
对每门课程:
收集所有学生在该课程上的成绩
计算该课程的平均分
找出该课程的最高分和最低分
打印课程统计信息
9. 主运行循环 (run
)
def run(self):
"""运行系统"""
while True:
print("\n===== 学生成绩管理系统 =====")
print("1. 添加学生")
print("2. 删除学生")
print("3. 修改成绩")
print("4. 查询学生")
print("5. 显示所有")
print("6. 课程统计")
print("0. 退出系统")
choice = input("请选择操作: ")
if choice == '1':
self.add_student()
elif choice == '2':
self.remove_student()
elif choice == '3':
self.modify_scores()
elif choice == '4':
self.show_student()
elif choice == '5':
self.show_all()
elif choice == '6':
self.course_statistics()
elif choice == '0':
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入!")
这是程序的主循环:
显示菜单选项
等待用户输入选择
根据用户选择调用相应的功能函数
如果选择0,退出程序
10. 程序入口
if __name__ == "__main__":
system = StudentGradeSystem()
system.run()
这是程序的启动点
当直接运行这个Python文件时,会创建StudentGradeSystem对象
然后调用run()方法启动程序
总结
这个学生成绩管理系统实现了以下核心功能:
添加学生信息(学号、姓名、各科成绩)
删除学生记录
修改学生成绩
查询单个学生信息
显示所有学生信息
统计各科成绩(平均分、最高分、最低分)
程序使用字典来存储学生信息,以学号为键,学生信息(姓名和成绩列表)为值。所有操作都是通过命令行界面进行的,用户可以通过菜单选择不同的功能。
三、完整代码
#学生成绩管理系统
class StudentGradeSystem: # 修正类名拼写错误
def __init__(self):
self.students = {}
#添加学生信息
def add_student(self):
student_id = input("请输入学号:")
if student_id in self.students:
print("该学号已经存在!")
return # 添加返回避免继续执行
name = input("请输入名字:")
score_input = input("请输入各科成绩(用空格分隔):")
try:
scores = list(map(float, score_input.split()))
self.students[student_id] = {"name": name, "scores": scores} # 修正键名
print(f"学生{name}添加成功!") # 修正格式化字符串
except ValueError:
print("成绩输入无效,请确保输入的是数字!")
#删除学生信息
def remove_student(self):
student_id = input("请输入要删除学生的学号: ")
if student_id in self.students:
name = self.students[student_id]['name']
del self.students[student_id]
print(f"学生 {name} 已删除!")
else:
print("未找到该学号对应的学生!")
# 添加缺失的修改成绩方法
def modify_scores(self):
student_id = input("请输入要修改成绩的学号: ")
if student_id not in self.students:
print("未找到该学生!")
return
print("当前成绩:", self.students[student_id]['scores'])
new_scores = input("请输入新的成绩(用空格分隔): ")
try:
scores = list(map(float, new_scores.split()))
self.students[student_id]['scores'] = scores
print("成绩修改成功!")
except ValueError:
print("成绩输入无效,修改失败!")
#计算平均分
def calculate_average(self, scores):
if len(scores) == 0: # 修正判断条件
return 0.0
return sum(scores) / len(scores)
#显示单个学生信息
def show_student(self):
student_id = input("请输入要查询学生的学号: ")
if student_id in self.students:
student = self.students[student_id]
avg = self.calculate_average(student['scores'])
print(f"\n学号: {student_id}")
print(f"姓名: {student['name']}")
print(f"成绩: {student['scores']}")
print(f"平均分: {avg:.2f}") # 格式化输出
else:
print("未找到该学生!")
#显示所有学生信息
def show_all(self):
if not self.students:
print("没有学生记录!")
return
print("\n===== 所有学生信息 =====")
for sid, info in self.students.items():
avg = self.calculate_average(info['scores'])
print(f"学号: {sid} | 姓名: {info['name']} | 成绩: {info['scores']} | 平均分: {avg:.2f}")
print("=======================")
#统计各科成绩
def course_statistics(self):
if not self.students:
print("没有学生记录!")
return
# 确定课程数量(取最大成绩列表长度)
num_courses = max(len(info['scores']) for info in self.students.values())
print("\n===== 课程成绩统计 =====")
for course_idx in range(num_courses):
course_scores = [] # 修正变量名拼写
for info in self.students.values():
if course_idx < len(info['scores']):
course_scores.append(info['scores'][course_idx])
if course_scores:
avg = sum(course_scores) / len(course_scores)
print(f"课程{course_idx+1}: 平均分={avg:.2f} | 最高分={max(course_scores)} | 最低分={min(course_scores)}")
print("=======================")
def run(self):
"""运行系统"""
while True:
print("\n===== 学生成绩管理系统 =====")
print("1. 添加学生")
print("2. 删除学生")
print("3. 修改成绩")
print("4. 查询学生")
print("5. 显示所有")
print("6. 课程统计")
print("0. 退出系统")
choice = input("请选择操作: ")
if choice == '1':
self.add_student()
elif choice == '2':
self.remove_student()
elif choice == '3':
self.modify_scores() # 添加的方法
elif choice == '4':
self.show_student()
elif choice == '5':
self.show_all()
elif choice == '6':
self.course_statistics()
elif choice == '0':
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入!")
# 运行系统
if __name__ == "__main__":
system = StudentGradeSystem() # 修正类名
system.run()