学生信息管理系统程序Python
系统主界面

在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时,有两种方法,
一种是输入1,另一种是按下键盘上的↑或↓方向键进行选择。这两种方法的结果是一样的,所以使用哪种方法都可以。
(1)录入学生信息。在“请选择:”右侧光标所在位置,输入数字1,并按下<Enter>键,系统将分别提示输入学生编号、学生名字、英语成绩、Python成绩和C语言成绩,输入正确的信息后,系统会提示是否继续添加,如图2所示。输入y,系统将会再次提示用户输入用户信息,输入n,则将录入学生信息保存到文件中。

(2)查找学生信息。在功能菜单上输入功能编号2,并且按下<Enter>键,系统将要求用户选择是按学生编号查询还是按学生姓名查询,如果用户输入1,则要求用户输入学生ID,表示按学生编号查询,输入想要查询的学生编号,系统查找该学生信息,如果找到则显示,效果如图3所示,否则显示“(o@.@o) 无数据信息 (o@.@o)”,效果如图4所示。最后提示是否继续查找输入y,系统将再次提示用户选择查找方式,输入n,则退出查找学生信息功能。

(3)删除学生信息。在功能菜单上输入功能编号3,并且按下<Enter>键,系统将提示输入要删除学生的编号,输入相应的学生ID后,系统会直接从文件中删除该学生信息,并且提示是否继续删除,如图5所示。输入y,系统将会再次提示用户输入要删除的学生编号,输入n,则退出删除功能。
(4)修改学生信息。在功能菜单上输入功能编号4,并且按下<Enter>键,系统首先显示全部学生信息列表,再提示输入要修改学生的编号,输入相应的学生ID后,系统会在文件中查找该学生信息,如果找到,则提示修改相应的信息,否则不修改。最后提示是否继续修改,如图6所示。输入y,系统将会再次提示用户输入要修改的学生编号,输入n,则退出修改功能。
(5)排序。在功能菜单上输入功能编号5,并且按下<Enter>键,系统将先显示不排序的全部学生信息,然后提示选择排序方式,这里输入2,再选择降序排列“1”,将对学生信息按Python成绩降序排列并显示
(6)统计学生总人数。在功能菜单上选择“6 统计学生总人数”菜单项,并且按下<Enter>键,将自动统计出学生总人数并显示
(7)显示所有学生信息。在功能菜单上选择“7 显示所有学生信息”菜单项,并且按下<Enter>键,系统将获取并显示全部学生信息
(8)退出系统。在功能菜单上输入功能编号5,并且按下<Enter>键即可退出系统。
代码实现如下:
import re # 导入正则表达式模块
import os # 导入操作系统模块filename = "students.txt" # 定义保存学生信息的文件名def menu():# 输出菜单print('''╔———————学生信息管理系统————————╗│ ││ =============== 功能菜单 =============== ││ ││ 1 录入学生信息 ││ 2 查找学生信息 ││ 3 删除学生信息 ││ 4 修改学生信息 ││ 5 排序 ││ 6 统计学生总人数 ││ 7 显示所有学生信息 ││ 0 退出系统 ││ ========================================== ││ 说明:通过数字或↑↓方向键选择菜单 │╚———————————————————————╝''')def main():ctrl = True # 标记是否退出系统while (ctrl):menu() # 显示菜单option = input("请选择:") # 选择菜单项option_str = re.sub("\D", "", option) # 提取数字if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:option_int = int(option_str)if option_int == 0: # 退出系统print('您已退出学生成绩管理系统!')ctrl = Falseelif option_int == 1: # 录入学生成绩信息insert()elif option_int == 2: # 查找学生成绩信息search()elif option_int == 3: # 删除学生成绩信息delete()elif option_int == 4: # 修改学生成绩信息modify()elif option_int == 5: # 排序sort()elif option_int == 6: # 统计学生总数total()elif option_int == 7: # 显示所有学生信息show()'''1 录入学生信息'''def insert():stdentList = [] # 保存学生信息的列表mark = True # 是否继续添加while mark:id = input("请输入ID(如 1001):")if not id: # ID为空,跳出循环breakname = input("请输入名字:")if not name: # 名字为空,跳出循环breaktry:english = int(input("请输入英语成绩:"))python = int(input("请输入Python成绩:"))c = int(input("请输入C语言成绩:"))except:print("输入无效,不是整型数值....重新录入信息")continuestdent = {"id": id, "name": name, "english": english, "python": python, "c": c} # 将输入的学生信息保存到字典stdentList.append(stdent) # 将学生字典添加到列表中inputMark = input("是否继续添加?(y/n):")if inputMark == "y": # 继续添加mark = Trueelse: # 不继续添加mark = Falsesave(stdentList) # 将学生信息保存到文件print("学生信息录入完毕!!!")# 将学生信息保存到文件
def save(student):try:students_txt = open(filename, "a") # 以追加模式打开except Exception as e:students_txt = open(filename, "w") # 文件不存在,创建文件并打开for info in student:students_txt.write(str(info) + "\n") # 按行存储,添加换行符students_txt.close() # 关闭文件'''2 查找学生成绩信息'''def search():mark = Truestudent_query = [] # 保存查询结果的学生列表while mark:id = ""name = ""if os.path.exists(filename): # 判断文件是否存在mode = input("按ID查输入1;按姓名查输入2:")if mode == "1":id = input("请输入学生ID:")elif mode == "2":name = input("请输入学生姓名:")else:print("您的输入有误,请重新输入!")search() # 重新查询with open(filename, 'r') as file: # 打开文件student = file.readlines() # 读取全部内容for list in student:d = dict(eval(list)) # 字符串转字典if id is not "": # 判断是否按ID查if d['id'] == id:student_query.append(d) # 将找到的学生信息保存到列表中elif name is not "": # 判断是否按姓名查if d['name'] == name:student_query.append(d) # 将找到的学生信息保存到列表中show_student(student_query) # 显示查询结果student_query.clear() # 清空列表inputMark = input("是否继续查询?(y/n):")if inputMark == "y":mark = Trueelse:mark = Falseelse:print("暂未保存数据信息...")return'''3 删除学生成绩信息'''def delete():mark = True # 标记是否循环while mark:studentId = input("请输入要删除的学生ID:")if studentId is not "": # 判断要删除的学生是否存在if os.path.exists(filename): # 判断文件是否存在with open(filename, 'r') as rfile: # 打开文件student_old = rfile.readlines() # 读取全部内容else:student_old = []ifdel = False # 标记是否删除if student_old: # 如果存在学生信息with open(filename, 'w') as wfile: # 以写方式打开文件d = {} # 定义空字典for list in student_old:d = dict(eval(list)) # 字符串转字典if d['id'] != studentId:wfile.write(str(d) + "\n") # 将一条学生信息写入文件else:ifdel = True # 标记已经删除if ifdel:print("ID为 %s 的学生信息已经被删除..." % studentId)else:print("没有找到ID为 %s 的学生信息..." % studentId)else: # 不存在学生信息print("无学生信息...")break # 退出循环show() # 显示全部学生信息inputMark = input("是否继续删除?(y/n):")if inputMark == "y":mark = True # 继续删除else:mark = False # 退出删除学生信息功能'''4 修改学生成绩信息'''def modify():show() # 显示全部学生信息if os.path.exists(filename): # 判断文件是否存在with open(filename, 'r') as rfile: # 打开文件student_old = rfile.readlines() # 读取全部内容else:returnstudentid = input("请输入要修改的学生ID:")with open(filename, "w") as wfile: # 以写模式打开文件for student in student_old:d = dict(eval(student)) # 字符串转字典if d["id"] == studentid: # 是否为要修改的学生print("找到了这名学生,可以修改他的信息!")while True: # 输入要修改的信息try:d["name"] = input("请输入姓名:")d["english"] = int(input("请输入英语成绩:"))d["python"] = int(input("请输入Python成绩:"))d["c"] = int(input("请输入C语言成绩:"))except:print("您的输入有误,请重新输入。")else:break # 跳出循环student = str(d) # 将字典转换为字符串wfile.write(student + "\n") # 将修改的信息写入到文件print("修改成功!")else:wfile.write(student) # 将未修改的信息写入到文件mark = input("是否继续修改其他学生信息?(y/n):")if mark == "y":modify() # 重新执行修改操作
相关文章:
学生信息管理系统程序Python
系统主界面 在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时,有两种方法, 一种是输入1,另一种是按下键盘上的↑或↓方向键进行选择。这两种方法的结果是一样的,所以使用哪种方法都可以。 (…...
[js] for forEach for of 循环里await关键字的用法
1、for:循环中使用await的写法(生效) async function loop(){for( let i0; i<array.length; i ){let datas await getDatas()break} }2、forEach:循环中使用await的写法(不生效): array.f…...
Linux面试题(二)
目录 17、怎么使一个命令在后台运行? 18、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息? 19、哪个命令专门用来查看后台任务? 20、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令? 21、终止进程用什么命令…...
电源控制系统架构(PCSA)之系统控制处理器组件
目录 6.4 系统控制处理器 6.4.1 SCP组件 SCP处理器Core SCP处理器Core选择 SCP处理器核内存 系统计数器和通用计时器 看门狗 电压调节器控制 时钟控制 系统控制 信息接口 电源策略单元 传感器控制 外设访问 系统访问 6.4 系统控制处理器 系统控制处理器(SCP)是…...
《已解决: ImportError: Keras requires TensorFlow 2.2 or higher 问题》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
在 CentOS 7 上安装 MySQL 8
在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先,我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令: sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …...
从二极管到linux服务器
软件设计: os: 批处理系统: 轮询系统:单片机裸机开发 实时系统:ucosii,rtos,rt-thread、风和系统、liteos(主要是海思系列soc在用)等 非实时系统:linux 对os任务切换时寄存器的功能有理解。 对ipc机制有理解。 bsp: 需要对寄存器、单片机内部总线、iic、spi、uart、c…...
设计模式-16-Spring源码中的设计模式
1-Spring之观察者模式 Java、Google Guava都提供了观察者模式的实现框架。Java提供的框架比较简单,只包含java.util.Observable和java.util.Observer两个类。Google Guava提供的框架功能比较完善和强大:通过EventBus事件总线来实现观察者模式。实际上&am…...
Leetcode 2948. Make Lexicographically Smallest Array by Swapping Elements
Leetcode 2948. Make Lexicographically Smallest Array by Swapping Elements 1. 解题思路2. 代码实现 题目链接:2948. Make Lexicographically Smallest Array by Swapping Elements 1. 解题思路 这一题其实思路上就是分组排序,显然,对于…...
[计算机网络]应用层概述
0.写在前面: 该层为教学模型的最后一层,某种意义上来说是最接近各位开发者的一层,正因如此,这层中的很多定义和概念大家都有属于自己的理解, 完全按照书本反而才是异类,因此在这里我会去结合我做前端开发的一些经验,来处理和讲解一些概念,另外本层中的部分协议也不会过多阐述了…...
《已解决:TypeError: unhashable type: ‘slice‘ 问题》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...
Rust UI开发(二):iced中如何为窗口添加icon图标
注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇: Rust UI开发:使用iced构建UI时,如何在界面显示中文字符 本篇是系…...
Django(十一、auth认证模块)
文章目录 一、auth介绍auth认证相关模块及操作扩展auth_user表 一、auth介绍 Django自带一个admin路由,但是需要我们提供管理员账户和密码,如果想要使用admin后台管理,需要先创建表,然后创建管理员账户。 直接执行数据类迁移命令…...
WebSocket了解
一.什么是WebSocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 二.websocket的原理 web…...
深度学习基础概念
1. 神经网络基础 神经元(Neuron): 了解神经网络的基本组成单元。激活函数(Activation Function): 学习常见的激活函数,如Sigmoid、ReLU等,以及它们在神经网络中的作用。前馈神经网络…...
vatee万腾科技先锋之选:vatee创新力驱动着未来发展
在科技潮流的浩荡前行中,Vatee万腾崭新的科技先锋之选正以强大的创新力引领着未来的发展。Vatee万腾凭借其前瞻性的技术理念和卓越的创新实践,成为业界的引领者,为整个科技行业树立了标杆。 Vatee万腾不仅仅是一家科技公司,更是一…...
MetaObject-BeanWrapper-MetaClass-Reflector的关系
MetaObject、BeanWrapper、MetaClass、Reflector之间是通过装饰器模式逐层进行装饰的。其中MetaObject、BeanWrapper是操作对象;MetaClass、Reflector是操作Class ObjectWrapper类结构图 BaseWrapper是对BeanWrapper、MapWrapper公共方法的提取及类图的优化&#…...
【JavaEE初阶】线程安全问题及解决方法
目录 一、多线程带来的风险-线程安全 1、观察线程不安全 2、线程安全的概念 3、线程不安全的原因 4、解决之前的线程不安全问题 5、synchronized 关键字 - 监视器锁 monitor lock 5.1 synchronized 的特性 5.2 synchronized 使用示例 5.3 Java 标准库中的线程安全类…...
uniapp高德、百度、腾讯地图配置 SHA1
uniapp高德、百度、腾讯地图配置 SHA1 当winr弹出cmd弹框后输入 keytool -list -v -keystore debug.keystore 显示keytool 不是内部或外部命令,也不是可运行的程序或批处理文件。可以先看看是否有下载jdk且配置了环境变量,具体操作如下:keyto…...
[AutoSAR存储] 车载存储层次 和 常用存储芯片概述
公知及经验整理,原创保护,禁止转载。 专栏 《AutoSAR存储》 <<<< 返回总目录 <<<< 1 存储系统层次 先抛个问题, 为什么要划分存储器的层次? 速度越快,但成本越高,从经济的角度规…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
