Bootstrap

python实现学生成绩管理系统(使用面向对象的方式)

 student.py文件,用于学生属性类的定义,包的声明

import time

class Student:
    def __init__(self, id, name, gender, english, python):
        self.id = id
        self.name = name
        self.gender = gender
        self.english = english
        self.python = python
        self.total = english + python

    def __str__(self):
        return f'{self.id},{self.name},{self.gender},{self.english},{self.python},{self.total}'

main.py文件,用于函数的执行

from managerSystem import *

if __name__ == "__main__":
    student_manager = StudentManager()
    student_manager.run()

managerSystem.py,用于各种函数的实现,有成绩不能大于100以及学号不能相同的限制,对多为学生姓名相同的情况做了处理

from student import *


class StudentManager:
    def __init__(self):
        self.student_list = []

    def run(self):
        # 加载学生信息
        self.load_student()

        while True:
            # 打印菜单
            self.show_menu()

            try:
                choice = int(input("请选择:"))
            except ValueError:
                print("输入无效,请输入整数类型")
            else:
                if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
                    if choice == 0:
                        answer = input("您确定要退出系统吗(输入y结束):")
                        if answer == "y":
                            print("谢谢使用!!!")
                            break
                        else:
                            continue
                    elif choice == 1:
                        self.add_student()
                    elif choice == 2:
                        self.del_student()
                    elif choice == 3:
                        self.modify_student()
                    elif choice == 4:
                        self.search_student()
                    elif choice == 5:
                        self.sort_student()
                    elif choice == 6:
                        self.total_student()
                        time.sleep(0.2)
                    elif choice == 7:
                        self.show_student()
                        input("请输入任意键继续...")
                else:
                    print("输入错误,请重新输入")

    def add_student(self):
        global id,name,gender,english,python

        while True:
            # 输入学号
            while True:
                id = input("请输入ID:")
                if not id:
                    print("输入错误,请重新输入")
                    continue

                # 不能有相同学号的学生
                for i in self.student_list:
                    if i.id == id:
                        print("学号与其他学生重复,请重新输入")
                        break
                else:
                    break

            # 输入姓名
            while True:
                name = input("请输入姓名:")
                if not name:
                    print("输入错误,请重新输入")
                    continue
                else:
                    break

            # 输入性别
            while True:
                gender = input("请输入性别:")
                if not gender:
                    print("输入无效,请重新输入")
                    continue
                else:
                    break

            # 输入英语成绩
            while True:
                try:
                    english = int(input("请输入英语成绩:"))
                    if english > 100:
                        print("请输入100以下的英语成绩")
                        continue
                    else:
                        break
                except ValueError:
                    print("输入错误,请输入整数类型")
                    continue

            # 输入python成绩
            while True:
                try:
                    python = int(input("请输入python成绩:"))
                    if python > 100:
                        print("请输入100以下的python成绩")
                        continue
                    else:
                        break
                except ValueError:
                    print("输入错误,请输入整数类型")
                    continue

            # 创建学生对象
            student = Student(id, name, gender, english, python)

            # 将学生保存到列表中
            self.student_list.append(student)

            # 保存到文件
            self.save_student()

            print("保存成功")
            answer = input("是否继续输入(输入y继续):")
            if answer == 'y':
                continue
            else:
                break

    def del_student(self):
        # 用于存储多个学生的列表
        student_list = []

        # 与用户输入的姓名相同的学生个数
        count = 0

        # 用户选择删除的第choise个学生
        choise = 0

        # 没有任何学生的处理方法
        if len(self.student_list) == 0:
            print("无任何学生信息")
        else:
            # 用户输入需要删除学生的姓名
            while True:
                del_name = input("请输入要删除的学生姓名:")
                if del_name:
                    # 寻找是否有该学生
                    for i in self.student_list:
                        if i.name == del_name:
                            student_list.append(i)
                            count += 1

                    # 找不到该学生
                    if count == 0:
                        print("查无此人!")
                        break

                    # 与用户输入的姓名相同的学生大于等于一位时
                    elif count > 1:
                        print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
                        for i in student_list:
                            print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
                        while True:
                            try:
                                choise = int(input("请选择需要删除的学生为第几位学生:"))
                            except ValueError:
                                print("输入错误,请输入整数类型")
                                continue
                            else:
                                if count >= choise > 0:
                                    break
                                else:
                                    print("输入错误,请重新输入")
                                    continue
                    elif count == 1:
                        pass
                    # 删除该学生
                    self.student_list.remove(student_list[choise - 1])

                    # 保存到文件
                    self.save_student()

                    print("删除成功")
                    break
                else:
                    print("输入错误,请重新输入")
                    continue

    def modify_student(self):
        global name,id,gender,english,python

        # 用于存储多个学生的列表
        student_list = []

        # 与用户输入的姓名相同的学生个数
        count = 0

        # 用户选择删除的第choise个学生
        choise = 0

        # 没有任何学生的处理方法
        if len(self.student_list) == 0:
            print("无任何学生信息")
        else:
            # 用户输入需要修改学生的姓名
            while True:
                modify_name = input("请输入要修改的学生的姓名:")
                if modify_name:
                    # 寻找是否有该学生
                    for i in self.student_list:
                        if i.name == modify_name:
                            student_list.append(i)
                            count += 1

                    # 找不到该学生
                    if count == 0:
                        print("查无此人!")
                        break

                    # 与用户输入的姓名相同的学生大于等于一位时
                    elif count > 1:
                        print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
                        for i in student_list:
                            print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")
                        while True:
                            try:
                                choise = int(input("请选择需要修改的学生为第几位学生:"))
                            except ValueError:
                                print("输入错误,请输入整数类型")
                                continue
                            else:
                                if count >= choise > 0:
                                    break
                                else:
                                    print("输入错误,请重新输入")
                                    continue
                    elif count == 1:
                        pass

                    # 删除该学生
                    self.student_list.remove(student_list[choise - 1])

                    # 输入学号
                    while True:
                        id = input("请输入ID:")
                        if not id:
                            print("输入错误,请重新输入")
                            continue

                        # 查看是否有其他学生有相同的学号
                        for item in self.student_list:
                            if item.id == id:
                                print("学号与其他学生重复,请重新输入")
                                break
                        else:
                            break

                    # 输入姓名
                    while True:
                        name = input("请输入姓名:")
                        if not name:
                            print("输入错误,请重新输入")
                            continue
                        else:
                            break

                    # 输入性别
                    while True:
                        gender = input("请输入性别:")
                        if not gender:
                            print("输入错误,请重新输入")
                            continue
                        else:
                            break

                    # 输入英语成绩
                    while True:
                        try:
                            english = int(input("请输入英语成绩:"))
                            if english > 100:
                                print("请输入100以下的英语成绩")
                                continue
                            else:
                                break
                        except ValueError:
                            print("输入错误,请输入整数类型")
                            continue

                    # 输入python成绩
                    while True:
                        try:
                            python = int(input("请输入python成绩:"))
                            if python > 100:
                                print("请输入100以下的python成绩")
                                continue
                            else:
                                break
                        except ValueError:
                            print("输入错误,请输入整数类型")
                            continue

                    # 创建学生对象
                    student = Student(id, name, gender, english, python)

                    # 将学生保存到列表中
                    self.student_list.append(student)

                    # 保存到文件
                    self.save_student()

                    print("修改成功!")
                    break
                else:
                    print("输入错误,请重新输入")
                    continue

    def search_student(self):
        # 用于存储多个学生的列表
        student_list = []

        # 与用户输入的姓名相同的学生个数
        count = 0

        # 没有任何学生的处理方法
        if len(self.student_list) == 0:
            print("无任何学生信息")
        else:
            # 用户输入需要查找学生的姓名
            while True:
                search_name = input("请输入要查询的学生的姓名:")

                if search_name:
                    # 寻找该学生
                    for i in self.student_list:
                        if i.name == search_name:
                            student_list.append(i)
                            count += 1

                    # 找不到人
                    if count == 0:
                        print("查无此人")
                        break

                    # 找到了人
                    else:
                        print("学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩")
                        # 输出学生信息
                        for i in student_list:
                            print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")

                        input("请输入任意键继续...")
                        break
                else:
                    print("输入错误,请重新输入")
                    continue

    def sort_student(self):
        global sort_choise_bool,cmpfun

        # 没有任何学生的处理方法

        if len(self.student_list) == 0:
            print("无任何学生信息")

        else:
            # 选择升序或降序
            sort_choise = input("请选择(0.升序 1.降序):")
            if sort_choise == '1':
                sort_choise_bool = True
            elif sort_choise == '0':
                sort_choise_bool = False
            else:
                print("输入错误,请重新输入")
                self.sort_student()

            # 排序!!!!!!!!!!!!!!!!!!!!
            while True:
                mode = input("请选择排序方式(1.按照学号排序 2.按照姓名排序 3.按照性别排序 4.按照英语成绩排序 5.按照python成绩排序 6.按照总成绩排序):")
                try:
                    import operator
                except ImportError:
                    cmpfun = lambda x: x.count
                else:
                    if mode == '1':
                        cmpfun = operator.attrgetter("id")
                    elif mode == '2':
                        cmpfun = operator.attrgetter("name")
                    elif mode == '3':
                        cmpfun = operator.attrgetter("gender")
                    elif mode == '4':
                        cmpfun = operator.attrgetter("english")
                    elif mode == '5':
                        cmpfun = operator.attrgetter("python")
                    elif mode == '6':
                        cmpfun = operator.attrgetter("total")
                    else:
                        print("输入错误,请重新输入")
                        continue

                # 列表排序
                self.student_list.sort(key=cmpfun, reverse=sort_choise_bool)

                # 保存到文件
                self.save_student()

                # 展示结果
                self.show_student()

                input("请输入任意键继续...")
                break

    def total_student(self):
        print(len(self.student_list))

    def show_student(self):
        print('学号\t\t姓名\t\t性别\t\t英语成绩\t\tpython成绩\t\t总成绩')
        for i in self.student_list:
            print(f"{i.id}\t\t{i.name}\t\t{i.gender}\t\t{i.english}\t\t{i.python}\t\t{i.total}")

    @staticmethod
    def show_menu():
        print("====================学生信息管理系统===================")
        print("------------------------功能菜单---------------------")
        print("                     1.录入学生信息               ")
        print("                     2.删除学生信息               ")
        print("                     3.修改学生信息               ")
        print("                     4.查询学生信息               ")
        print("                     5.排序学生信息               ")
        print("                     6.统计学生人数               ")
        print("                     7.显示学生信息               ")
        print("------------------------0.退出----------------------")

    def load_student(self):
        global f

        #尝试以r打开文件,如果文件不存在则以w创建文件
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')
        else:
            data = f.read()# 类型为str

            '''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            转换数据类型为列表'''
            new_list = eval(data)# 类型为list

            #存储到学生列表中

            self.student_list = [Student(i['id'],
                                         i['name'],
                                         i['gender'],
                                         i['english'],
                                         i['python']) for i in new_list]
        finally:
            f.close()

    def save_student(self):
        with open("student.data", "w") as fp:
            '''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            写入数据不能是学生对象的内存地址,需要把学生数据类型转化为列表字典数据再储存'''
            new_list = [i.__dict__ for i in self.student_list]

            #需要转化为str类型
            fp.write(str(new_list))

初学者,见识浅陋,请多指教。

;