一个简单的学生成绩管理系统可以包含以下功能:
- 添加学生信息
- 删除学生信息
- 更新学生信息
- 查看所有学生信息
- 按成绩排序
- 退出时能够保留学生信息
在这个版本里面:
- 学生成绩被存储为一个包含学科名称和成绩的字典。
- 用户可以输入多个学科的成绩。
- 可以按特定学科的成绩对学生进行排序。
学生信息在添加、删除或更新后会自动保存到students.json
文件中。
程序启动时会从students.json
文件中加载学生信息。
学生类包含to_dict
和from_dict
方法,用于将学生对象转换为字典格式和从字典格式创建学生对象。
当用户选择按学科成绩排序后,系统会立即显示按所选学科排序后的学生信息。这样用户可以清楚地看到排序结果。
import json
class Student:
def __init__(self, student_id, name, grades):
self.student_id = student_id
self.name = name
self.grades = grades # A dictionary to hold subject: grade pairs
def to_dict(self):
return {
"student_id": self.student_id,
"name": self.name,
"grades": self.grades
}
@classmethod
def from_dict(cls, data):
return cls(data['student_id'], data['name'], data['grades'])
class StudentManagementSystem:
def __init__(self, filename='students.json'):
self.filename = filename
self.students = self.load_students()
def add_student(self, student):
self.students.append(student)
self.save_students()
def delete_student(self, student_id):
self.students = [s for s in self.students if s.student_id != student_id]
self.save_students()
def update_student(self, student_id, name=None, grades=None):
for student in self.students:
if student.student_id == student_id:
if name:
student.name = name
if grades:
student.grades.update(grades)
self.save_students()
def view_students(self):
return self.students
def sort_students_by_subject_grade(self, subject):
self.students.sort(key=lambda x: x.grades.get(subject, 0), reverse=True)
def save_students(self):
with open(self.filename, 'w') as f:
json.dump([s.to_dict() for s in self.students], f, indent=4)
def load_students(self):
try:
with open(self.filename, 'r') as f:
return [Student.from_dict(data) for data in json.load(f)]
except FileNotFoundError:
return []
def main():
sms = StudentManagementSystem()
print('--------------------------------')
print(' 欢迎来到学生成绩管理系统 ')
print('-------------------------------')
while True:
print("\n1. 添加学生")
print("2. 删除学生")
print("3. 更新学生")
print("4. 查看学生")
print("5. 按学科成绩排序学生")
print("6. 退出")
choice = input("请输入你的选择: ")
if choice == '1':
student_id = int(input("请输入学生ID: "))
name = input("请输入学生姓名: ")
grades = {}
while True:
subject = input("请输入学科名 (输入 'done' 完成): ")
if subject.lower() == 'done':
break
grade = float(input(f"请输入 {subject} 的成绩: "))
grades[subject] = grade
sms.add_student(Student(student_id, name, grades))
elif choice == '2':
student_id = int(input("请输入要删除的学生ID: "))
sms.delete_student(student_id)
elif choice == '3':
student_id = int(input("请输入要更新的学生ID: "))
name = input("请输入新的学生姓名 (留空则不更新): ")
grades = {}
while True:
subject = input("请输入要更新的学科名 (输入 'done' 完成): ")
if subject.lower() == 'done':
break
grade = input(f"请输入 {subject} 的新成绩 (留空则不更新): ")
if grade:
grades[subject] = float(grade)
sms.update_student(student_id, name if name else None, grades)
elif choice == '4':
students = sms.view_students()
for student in students:
grades_str = ", ".join([f"{subject}: {grade}" for subject, grade in student.grades.items()])
print(f"ID: {student.student_id}, Name: {student.name}, Grades: {grades_str}")
elif choice == '5':
subject = input("请输入要按成绩排序的学科: ")
sms.sort_students_by_subject_grade(subject)
print(f"学生已按 {subject} 成绩排序。")
students = sms.view_students()
for student in students:
grades_str = ", ".join([f"{subject}: {grade}" for subject, grade in student.grades.items()])
print(f"ID: {student.student_id}, Name: {student.name}, Grades: {grades_str}")
elif choice == '6':
break
else:
print("无效的选择,请重新输入。")
if __name__ == "__main__":
main()