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

news2024/9/9 6:24:47

简介

在本篇博客中,我们将使用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编程有疑问或建议,欢迎在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 HTTP/3?HTTP/3 为何席卷全球?HTTP/3 中有什么新内容?为什么需要它?

超文本传输​​协议 ( HTTP ) 是互联网的基石&#xff0c;有助于加载网页、流式传输视频以及为您最喜爱的应用程序获取数据。 去年 &#xff0c;负责定义互联网技术的组织 互联网工程任务组 ( IETF )对该协议的新版本 HTTP/3 进行了标准化。自那时起&#xff0c;HTTP/3 和相关…

KubeSphere 部署向量数据库 Milvus 实战指南

作者&#xff1a;运维有术星主 Milvus 是一个为通用人工智能&#xff08;GenAI&#xff09;应用而构建的开源向量数据库。它以卓越的性能和灵活性&#xff0c;提供了一个强大的平台&#xff0c;用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索&#xff0c;并以…

纷享销客北方战区游学营举行 五大专项助力伙伴业务“倍速增长”

首届纷享销客北方战区渠道核心伙伴游学营日前在山东济南登场&#xff0c;此次游学营一共设置了五大模块&#xff0c;包括财务专项、组织建设专项、团队成长专项、开源专项、续费及增购专项&#xff0c;旨在帮助纷享销客渠道伙伴夯实高质量增长基础&#xff0c;全方位提升企业经…

上海亚商投顾:沪指震荡收跌 地产、芯片股逆势走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场昨日探底回升&#xff0c;三大股指小幅下跌&#xff0c;黄白二线分化明显。 商业航天概念继续走强&#…

hive 中编写生成连续月sql

记录一下 sql 编写生成从一个确定的起始月份到当前月份的连续月份序列 SELECT substr(add_months(table1.start_dt,table2.pos),1,4) AS INDICT_YEAR,substr(add_months(table1.start_dt,table2.pos),1,7) AS INDICT_MON FROM (SELECT 2024-01-01 AS start_dt,substr(CURRE…

wpf基础

快速换行的快捷键 vs 工具->选项->文本编辑器->XAML->Formatting(格式化)->spacing(间距)-> 选择第三个 &#xff0c;将各个属性分行放置。 然后按CtrlKD 如何快速生成下面的代码 鼠标放在Slider_ValueChanged上面然后FnF12 就可以快速生成 wpf中的绑定 在…

Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入|删除段落|删除标签

本教程主要实现【Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入|删除段落|删除标签】。 本文源码&#xff1a;https://gitee.com/songfayuan/go-zero-demo 教程源码分支&#xff1a;master 分支&#xff08;_examples/word-template/fill-word-template.go&…

ZFIU001 批导会计凭证报错,通过监控点和消息类来定位触发的位置

在创建会计凭证的时候&#xff0c;发送错误&#xff0c;通过打消息类和消息号的条件断点/监控点才解决 文章目录 报错消息号&#xff1a;F5846 创建监控点创建条件断点 报错原因非常注意 报错 消息号&#xff1a;F5846 创建监控点 创建条件断点 报错原因 非常注意

Java8新特性之Stream-Map

Map一些新方法的具体使用案例 1、getOrDefault:default V getOrDefault(Object key, V defaultValue) package com.qbb.threadpool;import java.util.HashMap; import java.util.Map;/*** author QiuQiu&LL (个人博客:https://www.cnblogs.com/qbbit)* version 1.0* date…

力扣高频SQL 50题(基础版)第三十四题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十四题1978.上级经理已离职的公司员工题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十四题 1978.上级经理已离职的公司员工 题目说明 表: Employees -------…

论文阅读:基于生物神经元的模拟游戏世界感知与学习

论文内容概述 AI要90分钟学会的游戏&#xff0c;人脑细胞竟在5分钟搞定了。Cell在2022年的研究中&#xff0c;使用80万体外神经元细胞(DishBrain)竟然学会玩70年代经典街机游戏Pong&#xff01; 论文链接&#xff1a;In vitro neurons learn and exhibit sentience when emb…

HCIA总结

一、情景再现&#xff1a;ISP网络为学校提供了DNS服务&#xff0c;所以&#xff0c;DNS服务器驻留在ISP网络内&#xff0c;而不再学校网络内。DHCP服务器运行在学校网络的路由器上 小明拿了一台电脑&#xff0c;通过网线&#xff0c;接入到校园网内部。其目的是为了访问谷歌网站…

ctfshow 权限维持 web670--web679

web670 <?php// 题目说明&#xff1a; // 想办法维持权限&#xff0c;确定无误后提交check&#xff0c;通过check后&#xff0c;才会生成flag&#xff0c;此前flag不存在error_reporting(0); highlight_file(__FILE__);$a$_GET[action];switch($a){case cmd:eval($_POST[c…

2024年技校云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算已成为推动数字化转型的关键力量。技校作为培养技能型人才的摇篮&#xff0c;建设云计算实验室并配套完善的实训平台&#xff0c;对于提升学生的专业技能、增强就业竞争力具有重要意义。本文旨在提出2024年技校云计算实验室建设及云计…

列表内容过多卡顿?有索引栏如何实现滚动加载?

&#x1f453;写在前面 很多小伙伴可能在开发业务中会遇到这种问题&#xff0c;数据列表过多&#xff0c;造成dom一次性渲染卡顿&#xff0c;本文主要介绍滚动加载&#xff0c;实现在有索引栏的列表中使用滚动加载的方法。 本文技术栈使用的是vue2vant2&#xff0c;其他框架组…

letcode - string

翻转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/reverse-string/ class Solution { public:void reverseString(vector<char>& s) {reverse(s.begin(),s.end());//直接上逆置接口} }; 函数签名: void reverseStr…

CVPR 2024 录用数据出炉!这些方向是大趋势!

一年一度的计算机视觉和模式识别会议&#xff08;CVPR&#xff09;一直是 CV 界前沿研究的灯塔。 CVPR 2024 录用结果显示&#xff0c;今年共有 2719 篇论文被接收&#xff0c;录用率 23.6%。 那么大模型时代&#xff0c;今年的研究主题有哪些变化&#xff1f; 最近&#xf…

【Python】 ValueError: too many values to unpack 解决方案

【Python】 ValueError: too many values to unpack 解决方案 在Python编程中&#xff0c;ValueError: too many values to unpack是一个常见的错误&#xff0c;通常出现在使用解包操作时。本文将深入探讨这个错误的原因、解决思路、解决方法&#xff0c;并通过具体案例帮助大…

【Python学习手册(第四版)】学习笔记09.3-Python对象类型-分类、引用VS拷贝VS深拷贝、比较、相等、真假值等详解

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 这部分稍杂&#xff0c;视需要选择目录读取。 主要讲的是对之前的所有对象类型作复习&#xff0c;以通俗易懂、由浅入深的方式进行介绍&#xff0c;所有对象类型…

『康之泉活水馆』手游:打造夏日梦幻水世界

设计背景 夏日的热浪与城市的喧嚣困扰着忙碌奔波的人群&#xff0c;康之泉活水馆&#xff0c;作为多功能的室内水上乐园&#xff0c;以其独特的魅力&#xff0c;成为夏日避暑的理想之地&#xff0c;让身心得以彻底放松。 设计理念 优联前端以康之泉品牌IP形象“康康”为灵感&a…