使用面向对象编写学生管理系统(Python实现)

简介

在本篇博客中,我们将使用Python语言,利用面向对象的编程思想,实现一个简单的学生管理系统。该系统可以实现添加学生信息、查看所有学生信息、统计学生平均年龄以及统计学生性别比例等功能。同时,我们将使用持久化存储技术,使用pickle模块将数据保存到文件中,以实现数据的长期存储和管理。

功能列表

添加学生信息:输入学生的姓名、年龄和性别,系统会自动分配学生ID,并将学生信息保存到系统中。
查看所有学生信息:显示当前系统中所有学生的详细信息。
统计学生平均年龄:计算系统中所有学生的平均年龄并输出。
统计学生性别比例:统计系统中男女学生的比例,并输出。

实现步骤

1. 定义学生类

首先,我们定义一个Student类,用来表示学生对象,包括学生的ID、姓名、年龄和性别等属性。

class Student:
    def __init__(self, sid, name, age, sex):
        self.sid = sid
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        return f"id:{self.sid}, name:{self.name}, age:{self.age}, sex:{self.sex}"
2. 学生管理类

接下来,定义一个StudentManage类,用于管理学生对象,包括添加学生、查看所有学生、计算平均年龄和统计性别比例等功能。同时,实现数据的加载和保存功能,利用pickle模块实现持久化存储。

import pickle

class StudentManage:
    def __init__(self):
        self.student = []
        self.load_data()

    # 其他方法定义(详见完整代码)

    def load_data(self):
        try:
            with open('./student_data.txt', 'rb') as f:
                self.student = pickle.load(f)
        except (FileNotFoundError, EOFError):
            self.student = []

    def save_data(self):
        with open('./student_data.txt', 'wb') as f:
            pickle.dump(self.student, f)
3. 系统管理类

最后,定义一个SysManage类作为系统的主控制类,实现系统菜单的显示和用户选项的响应。

class SysManage:
    def __init__(self):
        self.sm = StudentManage()

    def show_main_menu(self):
        menu = """输入数字1,添加学生信息(id名字,年纪,性别)
输入数字2,查看所有学生信息
输入数字3,统计学生平均年纪
输入数字4,统计学生性别比例
输入数字0,退出系统"""
        return menu

    def run(self):
        while True:
            print(self.show_main_menu())
            option = input("请根据列表输入选项:")
            if option == "0":
                break
            elif option == "1":
                while True:
                    self.sm.add_student()
                    # 添加学生信息后的逻辑判断,是否继续添加学生信息
            elif option == "2":
                self.sm.show_all_student()
            elif option == "3":
                self.sm.get_avg_age()
            elif option == "4":
                self.sm.get_sex_percent()
4. 系统运行

最后,在主程序中实例化SysManage类,并调用其run方法,启动学生管理系统。

if __name__ == '__main__':
    system_manage = SysManage()
    system_manage.run()

总代码

# 1.使用面向对象编写 学生管理,持久化存储
# 输入数字1,添加学生信息(id名字,年纪,性别)
# 输入数字2,查看所有学生信息
# 输入数字3,统计学生平均年纪
# 输入数字4,统计学生性别比例
# 输入数字0,退出系统
import pickle


class Student:
    def __init__(self, sid, name, age, sex):
        self.sid = sid
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        return f"id:{self.sid}, name:{self.name}, age:{self.age}, sex:{self.sex}"


class StudentManage:
    def __init__(self):
        self.student = []
        self.load_data()

    def get_student_name(self):
        while True:
            name = input("请输入姓名:")
            if 2 <= len(name) <= 4:
                return name
            else:
                print("名字长度限制在2-4,请重新输入!")

    def get_student_age(self):
        while True:
            age = int(input("请输入本人年龄:"))
            if 15 <= age <= 28:
                return age
            else:
                print("年龄要求在15-28岁之间,请重新输入!")

    def get_student_sex(self):
        while True:
            sex = input("请输入本人性别:")
            if sex in ["男", "女"]:
                return sex
            else:
                print("只能输入男/女,请重新输入!")

    def show_all_student(self):
        if len(self.student):
            for s in self.student:
                print(s)
        else:
            print("列表中没有数据,请添加。")

    def get_avg_age(self):
        total = 0
        for s in self.student:
            total += s.age
        print(f"学生的平均年纪为{total / len(self.student)}")

    def get_sex_percent(self):
        result = {}
        for s in self.student:
            if s.sex not in result:
                result[s.sex] = 1
            else:
                result[s.sex] += 1

        for k, v in result.items():
            print(f"性别:{k},占比:{v / len(self.student)}")

    def add_student(self):
        sid = 101 if not self.student else self.student[-1].sid + 1
        student_name = self.get_student_name()
        student_age = self.get_student_age()
        student_sex = self.get_student_sex()
        s = Student(sid, student_name, student_age, student_sex)
        self.student.append(s)
        self.save_data()

    def load_data(self):
        try:
            with open('./student_data.txt', 'rb') as f:
                self.student = pickle.load(f)
        except (FileNotFoundError, EOFError):
            self.student = []

    def save_data(self):
        with open('./student_data.txt', 'wb') as f:
            pickle.dump(self.student, f)


class SysManage:
    def __init__(self):
        self.sm = StudentManage()

    def show_main_menu(self):
        menu = """输入数字1,添加学生信息(id名字,年纪,性别)
输入数字2,查看所有学生信息
输入数字3,统计学生平均年纪
输入数字4,统计学生性别比例
输入数字0,退出系统"""
        return menu

    def run(self):
        while True:
            print(self.show_main_menu())
            option = input("请根据列表输入选项:")
            if option == "0":
                break
            elif option == "1":
                while True:
                    self.sm.add_student()
                    while True:
                        options = input("是否继续添加,继续(Y)退出(N)")
                        if options not in ["Y", "N", "y", "n"]:
                            print("输入不合法,只能输入Y/N")
                        elif options in ["Y", "y"]:
                            break
                        else:
                            break
                    if options == "Y" or options == "y":
                        pass
                    else:
                        break
            elif option == "2":
                self.sm.show_all_student()
            elif option == "3":
                self.sm.get_avg_age()
            elif option == "4":
                self.sm.get_sex_percent()


if __name__ == '__main__':
    system_manage = SysManage()
    system_manage.run()

总结

通过以上步骤,我们实现了一个简单的学生管理系统,包括面向对象的设计、持久化存储的实现以及用户交互的设计。这种设计不仅能提高代码的复用性和可维护性,还能有效地管理和操作大量的学生信息。

如果您对具体实现或者Python编程有疑问或建议,欢迎在评论区留言交流!

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 Python 面向对象编写学生管理系统的示例代码: ```python class Student: def __init__(self, name, id, grade): self.name = name self.id = id self.grade = grade class StudentDatabase: def __init__(self): self.students = [] def add_student(self, name, id, grade): student = Student(name, id, grade) self.students.append(student) def remove_student(self, id): for student in self.students: if student.id == id: self.students.remove(student) def update_student(self, id, name=None, grade=None): for student in self.students: if student.id == id: if name: student.name = name if grade: student.grade = grade def get_student(self, id): for student in self.students: if student.id == id: return student def get_all_students(self): return self.students class StudentManager: def __init__(self): self.database = StudentDatabase() def add_student(self, name, id, grade): self.database.add_student(name, id, grade) def remove_student(self, id): self.database.remove_student(id) def update_student(self, id, name=None, grade=None): self.database.update_student(id, name, grade) def get_student(self, id): return self.database.get_student(id) def get_all_students(self): return self.database.get_all_students() if __name__ == '__main__': manager = StudentManager() manager.add_student('Tom', '001', 90) manager.add_student('Jerry', '002', 80) print('All students:', manager.get_all_students()) manager.update_student('001', name='Tim', grade=95) print('Tom\'s new name:', manager.get_student('001').name) manager.remove_student('002') print('All students after removing Jerry:', manager.get_all_students()) ``` 在这个示例中,我们定义了 `Student` 类来表示学生,包含姓名、学号和成绩三个属性。我们还定义了 `StudentDatabase` 类来管理学生信息,包含添加、删除、更新、查询和获取所有学生信息的方法。 然后,我们定义了 `StudentManager` 类来管理 `StudentDatabase` 对象,并提供更方便的接口来操作学生信息。最后,我们在主函数中创建了 `StudentManager` 对象并测试了它的方法。 这个示例只是一个简单的示例,实际的学生管理系统可能需要更多的功能和复杂的实现。但是这个示例可以帮助你了解如何使用面向对象的思想来编写一个学生管理系统,并且将数据存储在内存中的 `StudentDatabase` 实现可以很容易地扩展成使用数据库或其他数据存储方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值