学生成绩管理系统(采用面向对象方法,Python实现)

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()

3.运行结果:

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值