1.实现的内容:(使用了菜单,用文件存储学生信息)
1)可以生成一个四位的验证码,可以是数字,字母或者组合。
2)学生基本信息的录入与输出。
3)可以按照学号或者姓名查询学生信息。
4)按照学号来修改学生信息并输出。
5)求所有人的平均成绩
6)删除某学生的信息
7)添加某学生的信息
8)输出成绩大于80的学生
9)根据成绩排名
2.代码实现:
1) 学生类的创建:
class Student:
# 构造函数
def __init__(self, student_id, name, score):
self.student_id = student_id
self.name = name
self.score = score
# 从对象到字典的转换方法
def to_dict(self):
return {
self.student_id:{'name':self.name,'score':self.score}
}
@classmethod
#从给定的字典student_dict中创建一个新的类实例cls
def from_dict(cls,student_dict):
student_id=list(student_dict.keys())[0]
info=student_dict[student_id]
if isinstance(info,dict):
name=info['name']
score=info['score']
elif isinstance(info,list) and len(info)==2:
name,score=info
else:
raise ValueError(f"学生信息{student_id}的格式不正确。")
return cls(student_id,name,score)
def __str__(self):
return f"id:{self.student_id},name:{self.name},score:{self.score}"
2)学生管理类的实现:
class StudentManagementSystem:
def __init__(self,filename='student.json'):
#存储学生数据的文件路径
self.filename=filename
self.students = []
self.load_students()
#从JSON文件中加载学生数据,并将其转化为Student类的实例列表
def load_students(self):
try:
with open(self.filename,'r',encoding='utf-8') as file:
student_dicts=json.load(file)
self.students=[Student.from_dict(student_dict) for student_dict in student_dicts]
except FileNotFoundError:
print("未找到相应数据,请确保文件路径正确!")
# except json.JSONDecodeError as e:
# print(f"文件格式不正确,无法解析为JSON:{e}")
# except Exception as e:
# print(f"加载学生数据时发生错误:{e}!")
#保存文件数据
def save_students(self):
data=[student.to_dict() for student in self.students]
with open(self.filename,'w',encoding='utf-8') as file:
json.dump(data,file,indent=4) #将字典列表转换为JSON格式,并写入打开的文件中
#indent=4是使输出的JSON数据具有美观的缩进。
def remove_student(self,id):
self.students=[student for student in self.students if student.student_id!=id]
self.save_students()
#随机生成4位验证码
def generate_verification_code(self):
code = ''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=4))
return code
#添加学生信息
def add_student(self):
verification_code=self.generate_verification_code()
print(f"请输入验证码以添加学生信息:{verification_code}")
code=input("请输入验证码:")
if code==verification_code:
print("请输入学生的学号,姓名,成绩:")
student_id,name,score=input().split()
if any(student_id==s.student_id for s in self.students):
print("学生信息已存在!")
else:
student = Student(student_id, name, int(score))
self.students.append(student)
print("已添加成功!")
self.save_students()
return 1
else:
print("验证码输入错误!!!")
return 0
#遍历学生信息
def display_students(self):
if len(self.students)==0:
print("无学生信息!")
else:
for student in self.students:
print(f"学号: {student.student_id}, 姓名: {student.name}, 成绩: {student.score}")
#根据学号或姓名查找学生信息
def search_student(self):
print("请输入要查询的方式:(1.姓名.2.学号.)")
num=int(input())
match num:
case 1:
name=input()
flag=True
for student in self.students:
if student.name==name:
print(f"学号: {student.student_id}, 姓名: {student.name}, 成绩: {student.score}")
flag=False
if flag==True:
print("未找到该学生信息")
return 0
else:
return 1
case 2:
student_id=input()
for student in self.students:
if student.student_id == student_id:
print(f"学号: {student.student_id}, 姓名: {student.name}, 成绩: {student.score}")
return 1
print("未找到该学生信息")
return 0
#更新学生信息
def modify_student(self):
print("请输入该学生的学号:")
student_id=input()
flag=False
for student in self.students:
if student.student_id == student_id:
flag=True
if flag==False:
print("未找到该学生信息")
else:
print("选择要修改的选项:1.姓名 2.成绩 3.姓名和成绩")
button=int(input())
match button:
case 1:
name=input("请输入新的姓名:")
for student in self.students:
if student.student_id == student_id:
student.name = name
print("学生信息已更新!")
return
case 2:
score=input("请输入新的成绩:")
for student in self.students:
if student.student_id == student_id:
student.score =int(score)
print("学生信息已更新!")
return
case 3:
name,score=input("请输入新的姓名和成绩:").split()
for student in self.students:
if student.student_id == student_id:
student.name=name
student.score=int(score)
print("学生信息已更新!")
return
#求平均分
def calculate_average_score(self):
total_score = 0
for student in self.students:
total_score += student.score
average_score = total_score / len(self.students)
return average_score
#根据学号删除学生信息
def delete_student(self):
print("请输入要删除学生的学号:")
student_id=input()
for student in self.students:
if student.student_id == student_id:
self.remove_student(student_id)
print("删除成功")
return
print("未找到该学生信息")
#找出成绩良好的学生
def display_high_achievers(self):
for student in self.students:
if student.score > 80:
print(f"学号: {student.student_id}, 姓名: {student.name}, 成绩: {student.score}")
#按照成绩降序排列学生信息
def sort_students_by_score(self):
sorted_students = sorted(self.students, key=lambda x: x.score, reverse=True)
for student in sorted_students:
print(f"学号: {student.student_id}, 姓名: {student.name}, 成绩: {student.score}")
3)主函数
# 创建学生管理系统对象
sms = StudentManagementSystem()
def main():
while 1:
print("----------------------------------------------------------------------")
print("--------------------------学生成绩管理系统菜单---------------------------------")
print(" 1.添加学生信息\n","2.显示所有学生信息\n","3.查询学生信息\n","4.修改学生信息\n","5.删除学生信息\n",
"6.计算平均成绩\n","7.输出成绩大于80的同学\n","8.成绩排名\n","9.退出系统")
print("----------------------------------------------------------------------")
button=eval(input())
match button:
case 1:
x=sms.add_student()
if x==0:
continue
case 2:
sms.display_students()
case 3:
x=sms.search_student()
if x==0:
print("请重新选择要进行的操作!")
continue
case 4:
sms.modify_student()
sms.display_students()
case 5:
sms.delete_student()
sms.display_students()
case 6:
print("平均成绩为:")
average_score = sms.calculate_average_score()
print(average_score)
case 7:
print("平均分大于80分的同学信息:")
sms.display_high_achievers()
case 8:
print("根据成绩排名:")
sms.sort_students_by_score()
case 9:
print("已退出学生成绩管理系统")
break
case _:
print("无效的选择,请重新输入!!!")
main()