学生管理系统(Python实现)

news2025/1/18 10:48:02

文章目录

  • 学生管理系统介绍
  • 学生管理系统效果展示
  • 代码实现
    • 入口函数
    • 打印菜单
    • 新增学生信息
    • 显示学生信息
    • 查找学生信息
    • 删除学生信息
    • 实现存档读档
    • 打包成exe程序

学生管理系统介绍

学生管理系统是为了对学校学生信息进行管理而开发的一款软件,下面我们来实现一个命令行版本的学生管理系统,该学生管理系统包括如下几个功能:

  • 新增学生信息
  • 显示学生信息
  • 查找学生信息
  • 删除学生信息
  • 学生信息存档

学生管理系统效果展示

在这里插入图片描述

代码实现

入口函数

在程序与用户进行交互之前,先调用load函数进行读档,将学生信息加载到程序中来,然后通过menu函数与用户进行交互。

  • 如果用户输入的数字为1,则进行新增学生信息操作。
  • 如果用户输入的数字为2,则进行显示学生信息操作。
  • 如果用户输入的数字为3,则进行查找学生信息操作。
  • 如果用户输入的数字为4,则进行删除学生信息操作。
  • 如果用户输入的数字为5,则进行学生信息存档操作。
  • 如果用户输入的数字为0,则退出学生信息管理系统。

如果用户的输入不包含在上述情况中,则提示用户输入有误,本次交互结束,进入下一次交互。

代码如下:

# 入口函数
def main():
    load()  # 先进行读档
    while True:
        # 打印菜单
        choice = menu()
        if choice == '1':
            # 新增学生信息
            insert()
        elif choice == '2':
            # 显示学生信息
            show()
        elif choice == '3':
            # 查找学生信息
            find()
        elif choice == '4':
            # 删除学生信息
            delete()
        elif choice == '5':
            # 学生信息存档
            save()
        elif choice == '0':
            # 退出程序
            print('goodbye!')
            sys.exit(0)
        else:
            print('您的输入有误!')

        x = input('按下任意按键继续操作...')
        os.system('cls')  # 清空控制台输出

说明一下:

  • 每次交互前可以将上次的交互信息清空,为了避免清空太快导致用户没来得及读取信息,可以提示用户按下任意键后再进入下一次交互。
  • system是os模块中的一个函数,该函数可以将字符串转换成命令在服务器上运行,而清空控制台输出的命令便是cls
  • exit是sys模块中的一个函数,该函数的作用是直接让当前程序退出,其参数代表的是程序退出时的退出码。

打印菜单

打印菜单函数将学生管理系统提供的服务进行输出,以供用户选择,并把用户的选择结果返回。

代码如下:

# 打印菜单
def menu():
    print('         >>欢迎来到学生管理系统<<         ')
    print('         |   1.新增学生信息   |         ')
    print('         |   2.显示学生信息   |         ')
    print('         |   3.查找学生信息   |         ')
    print('         |   4.删除学生信息   |         ')
    print('         |   5.学生信息存档   |         ')
    print('         |   0.退出管理系统   |         ')
    choice = input('请输入你的选择: ')
    return choice

新增学生信息

管理学生信息

我们当前实现的这个学生管理系统使用一个字典来管理所有学生的信息,该字典中的键key是学生的学号,字典中每个键对应的值value就是该学生的各项信息,包括学生的姓名、性别和班级。

比如:

students = {
    '202021150201': {'name': '张三', 
                     'gender': '男', 
                     'className': '2'},
    '202021150304': {'name': '李四',
                     'gender': '女',
                     'className': '3'},
}

因此在程序中需要先定义一个空字典,后续对学生信息进行的增删查操作本质上就是对这个字典的增删查操作。

# 使用字典来管理所有的学生信息
students = {}

新增学生信息

新增学生信息函数的作用是将学生信息添加到学生管理系统中,该函数要求用户输入一个学生的信息,并判断输入信息的合法性,如果合法则将该学生的信息插入到全局字典students中。

代码如下:

# 新增
def insert():
    print('[新增学生] 开始!')
    studentId = input('请输入学生的学号: ')
    name = input('请输入学生的姓名: ')
    gender = input('请输入学生的性别: ')
    if gender not in ('男', '女'):
        print('性别输入有误,新增失败!')
        return
    className = input('请输入学生的班级: ')
    # 使用字典将上述信息聚合起来
    studentInfo = {
        'name': name,
        'gender': gender,
        'className': className
    }
    if studentId in students:
        choice = input('已存在该学号的同学,是否对其信息进行覆盖(是/否): ')
        if choice == '否':
            return
    # 将该学生信息插入到students中
    students[studentId] = studentInfo
    print('[新增学生] 完毕!')

说明一下:

  • 由于全局字典students是以学号作为键值的,因此在新增学生信息之前,需要先判断待新增学生的学号是否已经存在于字典中。
  • 如果已经待新增学生的学号已经存在,则提示用户是否对其信息进行覆盖,如果是则修改该学号对应的学生信息,否则停止本次新增操作。

显示学生信息

显示学生信息

显示学生信息函数要做的就是遍历全局字典students,将字典中各个学生的信息进行打印输出即可。

代码如下:

# 显示
def show():
    print('[显示学生] 开始!')
    # 遍历全局字典students,把所有学生的信息打印出来
    for sId in students:
        sInfo = students[sId]  # 学号为sId的同学的信息
        print(f"{sId}\t{sInfo['name']}\t{sInfo['gender']}\t{sInfo['className']}")
    print(f'[显示学生] 完毕! 共显示了 {len(students)} 条数据!')

查找学生信息

查找学生信息

查找学生信息函数的作用是根据学号查找对应学生的信息,该函数要求用户输入待查找学生的学号,然后在全局字典students中进行查找,如果找到了则将该学生的信息进行输出。

代码如下:

# 查找
def find():
    print('[查找学生] 开始!')
    studentId = input('请输入要查找的同学学号: ')
    flag = False  # 记录是否找到该学号的同学
    for sId in students:
        if sId == studentId:
            sInfo = students[sId]  # 学号为sId的同学的信息
            print(f"[{sId}\t{sInfo['name']}\t{sInfo['gender']}\t{sInfo['className']}]")
            flag = True  # 找到了
            break
    if not flag:
        print('没有找到该学号的同学!')
    print(f'[查找学生] 完毕!')

删除学生信息

删除学生信息

删除学生信息函数的作用是根据学号删除对应学生的信息,该函数要求用户输入待删除学生的学号,然后遍历全局字典students将该学号的学生从字典中删除即可。

代码如下:

# 删除
def delete():
    print('[删除学生] 开始!')
    studentId = input('请输入要删除的学生学号: ')
    for sId in list(students.keys()):
        if sId == studentId:
            sInfo = students[sId]  # 学号为sId的同学的信息
            print(f"删除 {sInfo['name']} 同学的信息!")
            students.pop(sId)  # 将该学生信息从students中删除
    print('[删除学生] 完毕!')

说明一下:

  • 在使用for循环遍历字典的过程中,不能对字典进行插入或删除操作,因为在迭代过程中修改字典结构会导致迭代器失效。
  • 因此上述代码没有选择直接对字典进行迭代,而是先通过字典的keys方法获取到字典中所有key组成的列表(该列表的类型是dict_keys),然后将该列表强制类型转换成list类型后,对该list列表进行的迭代操作。

实现存档读档

约定存档读档格式

在编写存档读档函数之前,需要先约定一下存档的格式,保证存档和读档的方式是一致的。

这里做出如下约定:

  • 存档文件命名为record.txt,与Python程序存储在同级目录下。
  • 存档文件以行文本的方式保存学生信息,即每一行表示一个学生的信息。
  • 每个学生的各项信息之间使用制表符\t进行分隔。

存档

存档时遍历全局字典students中的各个键值对,将每个学生的各项信息使用制表符\t分隔后再写入存档文件中。

代码如下:

# 存档
def save():
    with open('record.txt', 'w', encoding='utf8') as f:
        for sId in students:
            sInfo = students[sId]  # 学号为sId的同学的信息
            f.write(f"{sId}\t{sInfo['name']}\t{sInfo['gender']}\t{sInfo['className']}\n")
        print(f'[存档完毕] 共存储了 {len(students)} 条记录!')

读档

读档的步骤如下:

  • 先将全局字典students中的数据清空,以供读档使用。
  • 按行对存档文件进行遍历,依次获取到每个学生的信息。
  • 将各个同学的信息依次插入到全局字典students中。

其中,对于读取到的每行数据的处理步骤如下:

  • 先通过字符串的strip方法去掉字符串首尾的空白符(包括\n\r\t)。
  • 然后通过字符串的split方法将字符串以\t作为分隔符进行分隔,得到该行同学对应的各项信息。
  • 接着将该同学的姓名、性别和班级聚合到一个字典中。
  • 最后以该同学的学号作为键值key,以这个聚合出来的字典作为值value,插入到全局字典students中。

代码如下:

# 读档
def load():
    # 如果存档文件不存在则直接跳过读档流程(避免导致异常)
    if not os.path.exists('record.txt'):
        return
    # 读档之前把旧的数据清理干净
    global students
    students = {}
    with open('record.txt', 'r', encoding='utf8') as f:
        for line in f:
            line = line.strip()  # 去掉字符串首位的空白符(\n,\r,\t)
            tokens = line.split('\t')  # 对每一行数据进行切分,以\t作为分隔符
            if len(tokens) != 4:
                print(f'当前行格式存在问题! line = {line}')
                continue
            studentId = tokens[0]
            studentInfo = {
                'name': tokens[1],
                'gender': tokens[2],
                'className': tokens[3]
            }
            # 将该行学生信息插入到students中
            students[studentId] = studentInfo
        print(f'[读档完毕] 共读取了 {len(students)} 条记录!')

打包成exe程序

打包成exe程序

执行以下命令即可将刚才编写的Python程序打包成exe程序。

pyinstaller -F -i logo.ico 学生管理系统.py

说明一下:

  • 生成后的exe程序的图标将会被修改为logo.ico,这个图标文件需要与Python程序放在同级目录下。

此时在学生管理系统.py的同级目录下会生成一个dict目录,生成的exe程序就在该目录中。如下:

在这里插入图片描述

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

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

相关文章

【UE4 第一人称射击游戏】12-全自动步枪并显示剩余弹药量

上一篇&#xff1a; 【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效 本篇效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加一个整数类型&#xff0c;名为“Ammo”的变量&#xff0c;用来表示弹药量。编译后默认值设为30 再添加一个浮点…

操作系统~Linux~线程控制,POSIX线程库的使用

1.POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”开头的要使用线程库中的函数&#xff0c;要通过引入头文件<pthread.h>链接这些线程函数库时要使用编译器命令的“-lpthread”选项2.创建线程-pthread_create() 功…

在HTML页面中引用Markdown编辑器(Editor.md)

目录 1、下载Ediotor.md 2、引入Ediotor.md 3、确定Ediotor.md在哪里显示 最近写博客项目&#xff0c;用到了Markdown编辑器&#xff0c;这里介绍一款国内好用的Markdown编辑器&#xff1a;Editor.md&#xff0c;下面介绍一下该编辑器以及如果在页面中引用。 1、下载Edioto…

【TypeScript】类型兼容性与相关类型讲解

目录 类型兼容性 对象类型兼容性 接口类型兼容性 函数类型兼容性 索引签名类型 映射类型 索引查询类型 交叉类型 类型兼容性 在TS中&#xff0c;类型采用的是结构化类型系统&#xff0c;也叫做 duck typing&#xff08;鸭子类型&#xff09;&#xff0c;类型检查关注的…

电脑c盘备份怎么操作?备份C盘的6个步骤

电脑出现问题&#xff0c;想要修复又不知该怎么操作。可能你会想要重装电脑的系统&#xff0c;但是在操作之前&#xff0c;一定要对电脑重要的数据做好备份。尤其是电脑C盘里面存储着我们很多重要的数据&#xff0c;电脑c盘备份怎么进行&#xff1f;跟着下面6个操作步骤进行&am…

<Linux线程池、线程安全(单例模式、STL、智能指针)、读者写者问题及线程扩展与总结>——《Linux》

目录 1.线程池 1.1 线程池: 1.2 线程池的应用场景&#xff1a; 1.3 线程池的种类&#xff1a; 1.4 线程池示例&#xff1a; 1.5 线程池编程模拟实现&#xff1a; 2. 线程安全的单例模式 2.1 什么是单例模式 2.2 什么是设计模式 2.3 单例模式的特点 2.3.1 饿汉实现方…

驱动相关基础

1.程序分类 1.1 裸机程序&#xff1a;直接运行在对应硬件的的程序 1.2 应用程序&#xff1a;只能运行在对应操作系统上的程序 2. 计算机系统的层次结构 2.1 无操作系统的简单的两层结构 2.2 有操作系统的四层层次结构 3. 操作系统 狭义&#xff1a;给应用程序提供运行环…

Python图像处理【7】采样、卷积与离散傅里叶变换

采样、卷积与离散傅里叶变换0. 前言1. 图像傅里叶变换1.1 傅里叶变换基础1.2 傅里叶变换应用1.3 逆傅里叶变换应用2. 利用采样改变图像分辨率2.1 上采样2.2 下采样小结系列链接0. 前言 采样 (Sampling) 是用于选择/丢弃图像像素的空间操作&#xff0c;通常用于增加/减小图像大…

(byte)1658385462>>16=-40,怎么算的?

正文 在 Github 项目mongo-java-driver有一个类ObjectId.java&#xff0c;它的作用是生成唯一 id 的&#xff0c;它的核心实现是下面这样一段代码 [1]&#xff1a; public void putToByteBuffer(final ByteBuffer buffer) {notNull("buffer", buffer);isTrueArgume…

【数据结构Java版】树与二叉树的相关知识全解

目录 一、树型结构 &#xff08;1&#xff09;树的定义 &#xff08;2&#xff09;树的基本术语 &#xff08;3&#xff09;树的存储结构 二、二叉树 &#xff08;1&#xff09;二叉树的定义 &#xff08;2&#xff09;两种特殊二叉树 1.满二叉树 2.完全二叉树 &…

CSS中你可能不知道的Selectors特性

CSS中你可能不知道的Selectors特性本文作者为奇舞团前端开发工程师引言最近看了2022年全球CSS调查报告&#xff0c;发现了一些不常见的伪类和伪元素。伪类:has()html<div><h1>H1</h1><h2>H2</h2><p>h1{margin: 0 0 0.25rem 0}</p> &…

设置访问SSH为密钥访问

1.制作密钥对 ssh-keygen输入会问两个问题 设置公私钥名称&#xff08;可以留白&#xff0c;直接回车&#xff09;设置公私钥密码&#xff08;可以留白&#xff0c;直接回车&#xff09; 第一次输入第二次确认 留空确认的话&#xff0c;生成公私钥。共有两个文件 # 私钥 id…

Rxjava源码分析实践(三)【RxJava基本原理分析之订阅流】

本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。 为了本文原理分析环节,可以被更多的人理解、学习,所以小编从初学者的角度,从使用入手,一点点的分析了其中的源码细节、思想,建议大家随着本文…

NCMMSC论文介绍 | 探索语音自监督模型的高效融合算法

本文介绍了清华大学语音与音频技术实验室&#xff08;SATLab&#xff09;与上海交通大学跨媒体语言智能实验室&#xff08;X-LANCE&#xff09;合作的NCMMSC录用论文&#xff1a;Exploring Effective Fusion Algorithms for Speech Based Self-Supervised Learning Models。该论…

动态列合并更新

【问题】 I have one query, would be great if anyone can help me out on this. In SQL, I have two tables with same column names. Want to query if there is any difference in the column values and if yes will update the values(in the first table) else if the…

【工具类】后台Mock工具类

目录一、介绍二、使用方法1. Controller层定义接口2. 编写json文件3. 开启AOP4. 调用接口验证三、源码一、介绍 Controller层定义完接口后&#xff0c;不需要写业务逻辑。编写Json文件&#xff0c;调用接口时返回json文件的数据。 优点&#xff1a; 设计阶段即可定义好接口&…

Centos 图形化yum管理工具 - yum Extender

文章目录背景安装开启yum-GUI工具 - yumexyum list installed列出软件包的依赖yum cleam背景 作为一个yum工程师&#xff0c;长期备受yum 命令的煎熬。 难道yum就乜有一个GUI管理界面吗&#xff1f; yum Extender (简称 yumex ) , 是 yum 的图形化操作界面。可以通过 yumex 方…

ActiveMQ高级特性和大厂面试常考重点

目录 一、引入消息队列之后该如何保证其高可用性 二、异步投递Async Sends 三、延迟投递和定时投递 四、ActiveMQ消费重试机制 五、死信队列 六、如何保证消息不被重复消费呢?幂等性问题你谈谈 一、引入消息队列之后该如何保证其高可用性 ActiveMQ集群模式_zoeil的博客-…

【机器学习】KNN 算法介绍

文章目录一、KNN 简介二、KNN 核心思想实例分析&#xff1a;K 值的影响三、KNN 的关键1. 距离计算1. 闵可夫斯基距离2. 曼哈顿距离3. 欧氏距离4. 切比雪夫距离5. 余弦距离总结2. K值选择四、KNN 的改进&#xff1a;KDTree五、KNN 回归算法参考链接一、KNN 简介 KNN 算法&#…

想在微信上使用chatGPT?小程序?公众号?企业微信,最终还是选择了企业微信版本的chatgpt

chatgpt的接口现在都可以正常用了&#xff0c;但是怎么把这个功能放在手机上随用随开呢&#xff1f;微信个人聊天版本小程序版本公众号版本企业微信版本逻辑实现方式微信个人聊天版本 网上很多微信机器人版本的&#xff0c;但是原理是网页版微信&#xff0c;很多账号都不能登陆…