函数式编程实现 - 学员管理系统 - 03
函数式编程实现 - 学员管理系统 - 031. 需求描述开发一个函数版的学生管理系统功能包括1.1 添加学员信息学员信息要求包括学号、姓名、性别、年龄、联系方式等其中学号不可重复姓名和联系方式也不能重复。1.2 删除学员信息根据学员的学号删除某一学员1.3 修改学员信息修改学员信息要求学号和姓名不能更改可以修改年龄和联系方式。1.4 查询学员姓名根据学号、姓名、联系方式查询1.5 显示所有学员信息列表显示所有的学员信息 学号、姓名、性别、年龄、联系方式1.6退出系统输入“q”触发退出操作同时要二次确认。 dataclass while True match/case importsysfromdataclassesimportdataclass# ---------- 数据模型 ----------dataclassclassStudent:学员信息数据类stu_id:str# 学号唯一name:str# 姓名唯一gender:str# 性别男/女age:int# 年龄 5contact:str# 联系方式唯一def__post_init__(self):数据校验ifself.gendernotin(男,女):raiseValueError(性别只能是男或女)ifself.age5:raiseValueError(年龄必须大于5)# ---------- 全局存储 ----------students:list[Student][]# ---------- 辅助函数 ----------defis_stu_id_unique(stu_id:str,exclude_index:int-1)-bool:检查学号是否唯一排除自身索引fori,sinenumerate(students):ifi!exclude_indexands.stu_idstu_id:returnFalsereturnTruedefis_name_unique(name:str,exclude_index:int-1)-bool:检查姓名是否唯一fori,sinenumerate(students):ifi!exclude_indexands.namename:returnFalsereturnTruedefis_contact_unique(contact:str,exclude_index:int-1)-bool:检查联系方式是否唯一fori,sinenumerate(students):ifi!exclude_indexands.contactcontact:returnFalsereturnTruedeffind_student_by_id(stu_id:str):根据学号查找学员返回学员对象和索引fori,sinenumerate(students):ifs.stu_idstu_id:returns,ireturnNone,-1deffind_students_by_name_or_contact(keyword:str):根据姓名或联系方式精确查找返回学员列表result[]forsinstudents:ifs.namekeywordors.contactkeyword:result.append(s)returnresultdefdisplay_students(student_listNone):显示学员列表默认全部ifstudent_listisNone:student_liststudentsifnotstudent_list:print(暂无学员信息。)returnprint(\n*70)print(f{学号:12}{姓名:8}{性别:4}{年龄:4}{联系方式:15})print(-*70)forsinstudent_list:print(f{s.stu_id:12}{s.name:8}{s.gender:4}{s.age:4}{s.contact:15})print(*70\n)# ---------- 业务功能 ----------defadd_student():添加学员print(\n--- 添加学员 ---)try:# 学号whileTrue:stu_idinput(学号: ).strip()ifnotstu_id:print(学号不能为空请重新输入。)continueifnotis_stu_id_unique(stu_id):print(学号已存在请重新输入。)continuebreak# 姓名whileTrue:nameinput(姓名: ).strip()ifnotname:print(姓名不能为空请重新输入。)continueifnotis_name_unique(name):print(姓名已存在请重新输入。)continuebreak# 性别whileTrue:genderinput(性别(男/女): ).strip()ifgendernotin(男,女):print(性别只能为男或女请重新输入。)continuebreak# 年龄whileTrue:age_strinput(年龄: ).strip()try:ageint(age_str)ifage5:print(年龄必须大于5请重新输入。)continuebreakexceptValueError:print(年龄必须是整数请重新输入。)# 联系方式whileTrue:contactinput(联系方式: ).strip()ifnotcontact:print(联系方式不能为空请重新输入。)continueifnotis_contact_unique(contact):print(联系方式已存在请重新输入。)continuebreakstudentStudent(stu_id,name,gender,age,contact)students.append(student)print(f学员{name}添加成功)exceptValueErrorase:print(f数据校验失败:{e})defdelete_student():根据学号删除学员带确认print(\n--- 删除学员 ---)stu_idinput(请输入要删除的学员学号: ).strip()student,idxfind_student_by_id(stu_id)ifnotstudent:print(学号不存在删除失败。)returnconfirminput(f确认删除学员{student.name}(学号:{stu_id})? (y/n): ).strip().lower()ifconfirmy:students.pop(idx)print(删除成功。)else:print(取消删除。)defmodify_student():修改学员信息只能修改年龄和联系方式其余不可改print(\n--- 修改学员信息 ---)stu_idinput(请输入要修改的学员学号: ).strip()student,idxfind_student_by_id(stu_id)ifnotstudent:print(学号不存在修改失败。)returnprint(f当前信息: 学号{student.stu_id}, 姓名{student.name}, 性别{student.gender}, 年龄{student.age}, 联系方式{student.contact})print(注意学号、姓名、性别不可修改。)print(1. 修改年龄)print(2. 修改联系方式)print(0. 返回)choiceinput(请选择: ).strip()ifchoice1:# 修改年龄whileTrue:age_strinput(请输入新年龄: ).strip()try:new_ageint(age_str)ifnew_age5:print(年龄必须大于5请重新输入。)continuebreakexceptValueError:print(年龄必须是整数请重新输入。)student.agenew_ageprint(年龄修改成功。)elifchoice2:# 修改联系方式需检查唯一性排除自身new_contactinput(请输入新联系方式: ).strip()ifnotnew_contact:print(联系方式不能为空修改失败。)returnifnotis_contact_unique(new_contact,exclude_indexidx):print(联系方式已存在修改失败。)returnstudent.contactnew_contactprint(联系方式修改成功。)else:print(未做任何修改。)defquery_student():查询学员print(\n--- 查询学员 ---)print(1. 按学号查询)print(2. 按姓名或联系方式查询)print(0. 返回)choiceinput(请选择: ).strip()ifchoice1:stu_idinput(请输入学号: ).strip()s,_find_student_by_id(stu_id)ifs:display_students([s])else:print(未找到该学号学员。)elifchoice2:keywordinput(请输入姓名或联系方式: ).strip()resultfind_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. 退出系统)choiceinput(请选择操作: ).strip().lower()matchchoice:caseq:confirminput(确认退出系统吗(y/n): ).strip().lower()ifconfirmy:print(系统已退出。)sys.exit(0)else:print(取消退出。)case1:add_student()case2:delete_student()case3:modify_student()case4:query_student()case5:show_all()case_:print(无效输入请重新选择。)if__name____main__:main()功能说明添加学员学号、姓名、联系方式需全局唯一。年龄必须为整数且 5性别限定为“男”或“女”。使用dataclass__post_init__进行基础校验。删除学员根据学号查找删除前二次确认。修改学员学号、姓名、性别不可修改。可修改年龄需满足 5或联系方式需保持唯一排除自身。查询学员按学号精确查询。按姓名或联系方式精确查询返回所有匹配项。显示所有学员以表格形式列出学员信息。退出输入q后需二次确认。所有数据存储在内存列表students中程序运行期间有效退出即丢失。若需持久化可扩展为文件或数据库存储。