函数式编程实现 - 学员管理系统 - 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()