python编程:实现简单学生管理系统(三)

大家好!欢迎来到我的博客,今天我们将继续探讨如何用Python实现一个简单的学生管理系统。我们将继续改进之前的学生管理系统,将其重构为使用类的方式,使代码更加面向对象,便于管理和扩展。通过使用类,我们可以将相关的功能和数据封装在一起,提升代码的可读性和可维护性。

一、改进后的项目结构

我们将使用面向对象的方法重构代码。新的项目结构如下:

student_management_system/
│
├── main.py
└── datas.json

二、代码实现

以下是重构后的学生管理系统代码:
 

import json
import os

FILE_JSON = "./datas.json"


class Student:
    """学生类,表示学生的基本信息"""

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

    def to_dict(self):
        """将学生信息转换为字典形式"""
        return {
            "id": self.id,
            "name": self.name,
            "age": self.age,
            "sex": self.sex
        }


class StudentManagementSystem:
    """学生管理系统类,负责管理学生信息"""

    def __init__(self):
        self.datas = []
        self.load_datas()

    def save_datas(self):
        """将学生数据保存到JSON文件中"""

        with open(FILE_JSON, "w") as f:
            json.dump([student.to_dict() for student in self.datas], f)

    def load_datas(self):
        """从JSON文件加载学生数据"""
        if os.path.exists(FILE_JSON):
            with open(FILE_JSON, mode="r") as f:
                student_data = json.load(f)
                self.datas = [Student(student["id"], student["name"], student["age"], student["sex"]) for
                              student in
                              student_data]

    def show_menu(self):
        """显示主菜单"""
        menu = """输入数字0,退出系统
输入数字1,添加学生信息
输入数字2,查看所有学生信息
输入数字3,统计学生平均年龄
输入数字4,统计学生性别比例"""
        print(menu)

    def option_is_true(self):
        """验证用户输入的菜单选项"""
        option = input("请输入选择:")
        if option not in [f"{i}" for i in range(5)]:
            print("请输入正确选项!")
            return None
        else:
            return option

    def student_name(self):
        """输入学生姓名,并验证合法性"""
        while True:
            name = input("请输入学生姓名:")
            if 2 <= len(name) <= 4:
                return name
            else:
                print("输入不合法,姓名长度应在2-4之间")

    def student_age(self):
        """输入学生年龄,并验证合法性"""
        while True:
            age = input("请输入学生年龄:")
            if age not in [str(i) for i in range(15, 26)]:
                print("输入不合法,年龄应该在15-25之间")
            else:
                return int(age)

    def student_sex(self):
        """输入学生性别,并验证合法性"""
        while True:
            sex = input("请输入学生性别:")
            if sex not in ["男", "女"]:
                print("输入不合法,请输入男或女")
            else:
                return sex

    def yes_no(self):
        """询问用户是否继续操作"""
        while True:
            sub_option = input("是否继续:是(Y)/否(N)")
            if sub_option in ["Y", "y", "N", "n"]:
                return sub_option
            else:
                print("输入不合法,请输入正确选项Y/N")

    def add_student(self):
        """添加学生信息"""
        while True:
            sid = 101 if not self.datas else self.datas[-1].id + 1
            name = self.student_name()
            age = self.student_age()
            sex = self.student_sex()
            student = Student(sid, name, age, sex)
            self.datas.append(student)
            self.save_datas()
            print(f"现在共有学生{len(self.datas)}人")
            sub_option = self.yes_no()
            if sub_option in ["N", "n"]:
                break

    def show_all_students(self):
        """查看所有学生信息"""
        if self.datas:
            for student in self.datas:
                print(f"id:{student.id}\tname:{student.name}\t age:{student.age}\t sex:{student.sex}")
        else:
            print("没有找到学生数据,请先添加学生信息")

    def get_avg_age(self):
        """统计学生平均年龄"""
        if self.datas:
            total = sum(student.age for student in self.datas)
            avg_age = total / len(self.datas)
            print(f"学生平均年龄为:{avg_age:.2f}")
        else:
            print("没有找到学生信息,计算平均年龄需要先添加学生信息!")

    def get_sex_scale(self):
        """统计学生性别比例"""

        if self.datas:
            man_count = sum(1 for student in self.datas if student.sex == "男")
            woman_count = sum(1 for student in self.datas if student.sex == "女")
            total_count = len(self.datas)
            man_ratio = man_count / total_count * 100
            woman_ratio = woman_count / total_count * 100
            print(f"男生占比:{man_ratio:.2f}%\t女生占比:{woman_ratio:.2f}%")
        else:
            print("没有找到学生信息,统计学生性别比例需要先添加学生信息!")

    def main(self):
        """主程序入口"""
        while True:
            self.show_menu()  # 显示菜单
            option = self.option_is_true()  # 获取用户选择
            if option == "0":
                print("感谢使用学生管理系统!")
                break  # 退出系统
            elif option == "1":
                self.add_student()  # 添加学生信息
            elif option == "2":
                self.show_all_students()  # 查看所有学生信息
            elif option == "3":
                self.get_avg_age()  # 统计学生平均年龄
            elif option == "4":
                self.get_sex_scale()  # 统计学生性别比例


if __name__ == "__main__":
    sms = StudentManagementSystem()  # 创建学生管理系统实例
    sms.main()  # 运行主程序

三、代码解读

在重构后的代码中,我们使用了两个类:

1. Student类:表示学生的信息,包括学生的ID、姓名、年龄和性别。通过 ' to_dict ' 方法可以将学生对象转换为字典格式,以方便保存到JSON文件中。

2. StudentManagementSystem类:封装了学生管理系统的所有功能,包括数据的加载和保存、用户输入的处理、学生信息的添加和查询、统计功能等。

功能模块解读:

1. 数据加载与保存:
   ' load_datas() ' :从JSON文件读取学生数据并创建`Student`对象。
   ' save_datas() ' :将学生数据保存到JSON文件中。

2. 用户界面与输入处理:
   ' show_menu() ' :显示操作菜单。
   ' option_is_true() ' :验证用户输入的选项。
   ' student_name() ' ,  ' student_age() ' ,  ' student_sex() ' :分别处理用户的姓名、年龄和性别输入,并进行合法性验证。

3. 学生信息管理:
   ' add_student() ' :添加学生信息并保存。
   ' show_all_students() ' :输出所有学生信息。

4. 统计功能:
   ' get_avg_age() ' :计算并打印学生的平均年龄。
   ' get_sex_scale() ' :计算并打印男女学生的比例。

5. 主程序:
   ' main() ' :程序的入口,循环显示菜单并处理用户的选择。

四、如何运行程序

1. 确保你的计算机上已经安装了Python,推荐使用3.x版本。
2. 创建一个新的Python文件,如 `main.py`,并将上述代码复制粘贴到该文件中。
3. 在同一目录下创建一个空的 `datas.json` 文件(如果文件不存在,程序会自动创建,可以不自己手动创建)。
4. 在命令行中运行程序,或者在PyCharm等编辑软件里直接运行:

 python main.py

5. 按照屏幕上的提示输入选项,进行相应的操作。

五、总结

通过使用类的方式重构学生管理系统,我们的代码变得更加模块化和易于维护。面向对象的设计使得每个功能都封装在相应的类中,提升了代码的可读性和可扩展性。

未来,你可以继续拓展此系统的功能,例如添加学生成绩管理、课程选择、搜索和删除学生信息等功能,进一步提升系统的实用性。

希望这篇博文对你有所帮助。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值