当前位置: 首页 > news >正文

函数式编程实现 - 学员管理系统 - 01

函数式编程实现 - 学员管理系统 - 01


1. 需求描述

开发一个函数版的学生管理系统,功能包括:

1.1 添加学员信息

学员信息,要求包括学号、姓名、性别、年龄、联系方式等,其中学号不可重复,姓名和联系方式也不能重复。

1.2 删除学员信息

根据学员的学号,删除某一学员

1.3 修改学员信息

修改学员信息,要求学号和姓名不能更改,可以修改年龄和联系方式。

1.4 查询学员姓名

根据学号、姓名、联系方式查询

1.5 显示所有学员信息

列表显示所有的学员信息: 学号、姓名、性别、年龄、联系方式

1.6退出系统

输入“q”,触发退出操作,同时要二次确认。


2. 代码实现

""" 1. @dataclass 2. while True """importsysfromdataclassesimportdataclassfromtypingimportList,Optional# ---------- 数据模型 ----------@dataclassclassStudent:"""学员信息数据类"""stu_id:str# 学号(唯一)name:str# 姓名(唯一)gender:str# 性别(男/女)age:str# 年龄( > 5 岁)contact:str# 联系方式(唯一)def__post_init__(self):"""简单校验"""ifself.gendernotin('M','F'):raiseValueError("性别只能是'M(男)'或'F(女)'")ifint(self.age)<5:raiseValueError("年龄不能小于5岁哇")# ---------- 全局存储 ----------students:List[Student]=[]# ---------- 辅助函数 ----------defis_student_id_unique(stu_id:str,exclude_index:int=-1)->bool:"""检查学号是否唯一(排除自身)"""fori,sinenumerate(students):ifi!=exclude_indexands.stu_id==stu_id:returnFalsereturnTruedefis_name_unique(name:str,exclude_index:int=-1)->bool:"""检查姓名是否唯一"""fori,sinenumerate(students):ifi!=exclude_indexands.name==name:returnFalsereturnTruedefis_contact_unique(contact:str,exclude_index:int=-1)->bool:"""检查联系方式是否唯一"""fori,sinenumerate(students):ifi!=exclude_indexands.contact==contact:returnFalsereturnTruedeffind_student_by_id(stu_id:str)->Optional[Student]:"""根据学号查找学员(返回第一个匹配)"""forsinstudents:ifs.stu_id==stu_id:returnsreturnNonedeffind_students_by_name_or_contact(keyword:str)->List[Student]:"""根据姓名或联系方式查找(精确匹配)"""result=[]forsinstudents:ifs.name==keywordors.contact==keyword:result.append(s)returnresultdefdisplay_students(student_list:List[Student]=None):"""显示学员信息(默认显示全部)"""ifstudent_listisNone:student_list=studentsifnotstudent_list:print("暂无学员信息。")returnprint("\n"+"="*60)print(f"{'学号':>12}{'姓名':>8}{'性别':>4}{'年龄':>4}{'联系方式':>15}")print("-"*60)forsinstudent_list:print(f"{s.stu_id:>12}{s.name:>8}{s.gender:>4}{s.age:>4}{s.contact:>15}")print("="*60+"\n")# ---------- 业务功能函数 ----------defadd_student():"""添加学员"""print("\n--- 添加学员 ---")whileTrue:stu_id=input("学号: ").strip()ifnotstu_id:print("学号不能为空,请重新输入。")continueifnotis_student_id_unique(stu_id):print("学号已存在,请重新输入。")continuebreakwhileTrue:name=input("姓名: ").strip()ifnotname:print("姓名不能为空,请重新输入。")continueifnotis_name_unique(name):print("姓名已存在,请重新输入。")continuebreakwhileTrue:gender=input("性别(男/女): ").strip()ifgendernotin('M','F'):print("性别只能为'M(男)'或'F(女)',请重新输入哈。")continuebreakwhileTrue:age_input=input("年龄(>5): ").strip()ifnotage_input:print("年龄不能为空,请重新输入。")continuetry:age=int(age_input)exceptValueError:print("请输入有效的整数年龄。")continueifage<=5:print("年龄必须大于5,请重新输入。")else:breakwhileTrue:contact=input("联系方式: ").strip()ifnotcontact:print("联系方式不能为空,请重新输入。")continueifnotis_contact_unique(contact):print("联系方式已存在,请重新输入。")continuebreaktry:new_student=Student(stu_id,name,gender,age_input,contact)students.append(new_student)print(f"学员{name}添加成功!")exceptValueErrorase:print(f"添加失败:{e}")defdelete_student():"""根据学号删除学员"""print("\n--- 删除学员 ---")stu_id=input("请输入要删除的学员学号: ").strip()student=find_student_by_id(stu_id)ifnotstudent:print("学号不存在,删除失败。")return# 确认删除confirm=input(f"确认删除学员{student.name}(学号:{stu_id})? (y/n): ").strip().lower()ifconfirm=='y':students.remove(student)print("删除成功。")else:print("取消删除。")defmodify_student():"""修改学员信息(只能修改性别和联系方式,学号和姓名不可更改)"""print("\n--- 修改学员信息 ---")stu_id=input("请输入要修改的学员学号: ").strip()student=find_student_by_id(stu_id)ifnotstudent:print("学号不存在,修改失败。")returnprint(f"当前信息: 学号={student.stu_id}, 姓名={student.name}, 性别={student.gender}, 联系方式={student.contact}")print("注意:学号和姓名、性别不可修改。")print("1. 修改年龄")print("2. 修改联系方式")print("0. 返回")choice=input("请选择: ").strip()ifchoice=='1':new_age_input=input("请输入修改后的年龄: ").strip()try:new_age=int(new_age_input)exceptValueError:print("请输入有效的整数年龄。")returnifnew_age<5:print("年龄要大于5岁哇")returnstudent.age=new_age_inputprint("性别修改成功。")elifchoice=='2':new_contact=input("请输入新联系方式: ").strip()ifnotnew_contact:print("联系方式不能为空,修改失败。")return# 检查新联系方式是否唯一(排除当前学员)idx=students.index(student)ifnotis_contact_unique(new_contact,exclude_index=idx):print("联系方式已存在,修改失败。")returnstudent.contact=new_contactprint("联系方式修改成功。")else:print("未做任何修改。")defquery_student():"""查询学员"""print("\n--- 查询学员 ---")print("1. 按学号查询")print("2. 按姓名或联系方式查询")print("0. 返回")choice=input("请选择: ").strip()ifchoice=='1':stu_id=input("请输入学号: ").strip()s=find_student_by_id(stu_id)ifs:display_students([s])else:print("未找到该学号的学员。")elifchoice=='2':keyword=input("请输入姓名或联系方式: ").strip()result=find_students_by_name_or_contact(keyword)ifresult:display_students(result)else:print("未找到匹配的学员。")else:returndefshow_all():"""显示所有学员"""display_students()# ---------- 主菜单 ----------defmain():whileTrue:print("\n"+"="*30)print(" 学生管理系统")print("="*30)print("1. 添加学员")print("2. 删除学员")print("3. 修改学员信息")print("4. 查询学员")print("5. 显示所有学员")print("q. 退出系统")choice=input("请选择操作: ").strip().lower()ifchoice=='q':confirm=input("确认退出系统吗?(y/n): ").strip().lower()ifconfirm=='y':print("系统已退出。")sys.exit(0)else:print("取消退出,继续运行。")elifchoice=='1':add_student()elifchoice=='2':delete_student()elifchoice=='3':modify_student()elifchoice=='4':query_student()elifchoice=='5':show_all()else:print("无效输入,请重新选择。")if__name__=="__main__":main()
http://www.jsqmd.com/news/763690/

相关文章:

  • 永辉超市卡回收不踩坑!5种高效方法盘点,闲置卡快速变现超省心 - 京回收小程序
  • Modbus主站设备(Master)编程实战:用Python+pymodbus搞定128个从站轮询与避坑指南
  • 别再只抓HTTP了!用Wireshark过滤出纯‘以太网帧’,深入理解网络底层通信
  • MDB Tools终极指南:在Linux和macOS上高效处理Access数据库的完整解决方案
  • FITC标记的ROR1 Fc嵌合蛋白在肿瘤靶向治疗研究中的应用
  • 实测分享:真正免费且去水印效果好的软件,亲测好用无套路 - 爱上科技热点
  • Synology群晖歌词插件终极指南:5分钟为Audio Station添加QQ音乐智能歌词
  • 2026年江苏面粉加工设备采购指南:源头厂家直供方案与B端选型避坑手册 - 年度推荐企业名录
  • 不只是换皮肤:给你的Keil MDK换上仿VSCode主题,并深度定制字体与高亮
  • 5分钟掌握Reloaded-II:终极.NET Core游戏Mod加载器完整指南
  • 告别环境混乱:用Anaconda和PyCharm彻底解决Python包依赖冲突(以pandas为例)
  • 别再烧芯片了!用CH374/CH375做USB主机,必须知道的U盘热插拔保护电路设计
  • 智能图片去重工具AntiDupl.NET:3步高效清理重复图片,释放存储空间
  • 从IPPO到MAPPO:手把手教你用PyTorch实现多智能体协作(附Light-MAPPO代码实战)
  • 终极解决方案:如何修复TranslucentTB的Windows UI框架依赖问题
  • 2026 免费去水印软件盘点,效果好又免费,手机电脑都能用 - 爱上科技热点
  • 保姆级教程:用CUT模型搞定自制数据集风格迁移,从环境配置到避坑全记录
  • 游戏汉化技术实战:从逆向工程到补丁制作的全流程解析
  • 告别手动抢购:用Node.js京东自动下单工具解放你的购物时间
  • 终极指南:使用tiny11builder构建精简版Windows 11系统的完整解决方案
  • 告别x264卡顿?手把手教你用OpenH264在Android上实现高效竖屏视频编码
  • 实测对比:YOLOv8缝合DWR/MSCA/LSK注意力模块后,在无人机航拍数据集上效果如何?
  • 降AI率工具真的有用吗?2026实测6款主流降AI工具数据汇总!
  • 2026 年 5 月国内外差压变送器十大品牌排名 - 仪表人小余
  • 在快马平台用qclaw快速构建量子纠缠态原型:十分钟搞定贝尔态模拟
  • 别再手动写DDR接口了!Vivado里IDDR/ODDR原语实战指南(附仿真代码)
  • 浙江移动魔百盒HM201上Armbian系统网络问题深度解析与解决方案
  • 实战指南:用快马打造可商用的hiclaw合同智能比对系统
  • 虚幻引擎高保真声学仿真框架SonoTraceUE解析
  • 终极免费音乐解锁工具:3分钟解决各大平台加密音乐限制