对于学生管理系统,也是在前两天完成并且通过了验收。虽然每次验收时都有自己遗忘的点。但是这也是对我的一次锻炼的历程。
在学生管理系统中,主要的功能就是增、删、改、查。
①增
def add_student(self):
while True:
while True:
name = input('请输入您的姓名:')
if not re.match(r'^[\u4e00-\u9fff]+$', name):
print('姓名只能包含中文字符,请重新输入。')
continue # 如果姓名无效,则重新进入循环
else:
break
while True:
gender = input('请输入您的性别:')
if gender not in ['男', '女']:
print('输入无效,请重新输入。')
continue # 如果性别无效,则重新进入循环
else:
break
while True:
tel = input('请输入您的手机号:')
if not (tel.isdigit() and len(tel) == 11 and not any(student.tel == tel for student in self.student_list)):
print('手机号必须为11位数字且不能重复且不能有字母,请重新输入。')
continue # 如果手机号无效或重复,则重新进入循环
else:
break
while True:
studentid = input('请输入您的学号:')
if not (studentid.isdigit() and len(studentid) == 12 and not any(student.studentid == studentid for student in self.student_list)):
print('学号必须为12位数字且不能重复且不能有字母,请重新输入。')
continue # 如果学号无效或重复,则重新进入循环
else:
break
while True:
try:
confirm = input('您确认要添加这个学生吗?(yes/no):').strip().lower()
if confirm == 'no':
print('添加取消')
break # 如果用户选择不添加,则重新开始
elif confirm == 'yes':
student = Student(name, gender, tel, studentid)
# 将该学员添加到列表
self.student_list.append(student)
print(student)
break # 添加成功后退出循环
except ValueError:
continue
break
self.save_student()
- 循环结构:
- 使用了一个外部的
while True
循环,但实际上这个循环只会在用户成功添加学生信息或遇到无法处理的错误时才会通过break
语句退出
- 使用了一个外部的
- 信息输入与验证:
- 姓名:使用正则表达式
^[\u4e00-\u9fff]+$
验证姓名是否只包含中文字符。如果不是,则提示重新输入。 - 性别:验证性别是否为“男”或“女”。如果不是,则提示重新输入。
- 手机号:验证手机号是否为11位数字,并且确保在
student_list
中没有重复。如果不是或重复,则提示重新输入。 - 学号:验证学号是否为12位数字,并且确保在
student_list
中没有重复。如果不是或重复,则提示重新输入。
- 姓名:使用正则表达式
- 确认添加:
- 在所有信息都验证通过后,询问用户是否确认添加这个学生。如果用户输入“yes”(不区分大小写),则创建一个
Student
对象,并将其添加到student_list
中,然后打印出这个学生的信息。如果用户输入“no”,则提示“添加取消”并重新开始输入过程。
- 在所有信息都验证通过后,询问用户是否确认添加这个学生。如果用户输入“yes”(不区分大小写),则创建一个
- 异常处理:
- 在确认添加的循环中,有一个
try-except
结构来捕获可能的ValueError
异常(尽管在这个上下文中,ValueError
似乎不太可能直接由input
函数引发,除非有其他未展示的代码或上下文)。然而,由于异常处理只是简单地继续循环,这个结构在当前的代码实现中并没有实际的作用。
- 在确认添加的循环中,有一个
- 保存学生信息:
- 在成功添加学生后,调 用
self.save_student()
方法
- 在成功添加学生后,调 用
②删
def del_student(self):
# 要删除的学生的学号
del_studentid = input('请输入要删除的学员学号:')
# 初始化一个变量,用于标记是否找到了对应学号的学生
found = False
# 遍历学生列表
for i in self.student_list:
# 如果当前遍历到的学生的学号与要删除的学号相匹配
if i.studentid == del_studentid:
# 从学生列表中获取该学生的信息
student_info = f"姓名: {i.name}, 学号: {i.studentid}" # 假设学生对象有name和studentid属性
# 询问用户是否确认删除
while True:
try:
confirm = input(
f"确认删除学生吗?学生信息: {student_info} (请输入yes确认删除,或输入NO取消删除):").strip().lower()
if confirm == 'yes':
# 从学生列表中移除该学生
self.student_list.remove(i)
# 打印删除成功的消息
print('删除成功')
# 将变量设置为True,表示找到了对应的学生
found = True
# 找到后退出循环
self.save_student()
break # 退出内部while循环
elif confirm == 'no':
# 如果用户选择不删除,打印取消删除的消息
print('已取消删除')
found = True # 设置为True以避免后续打印“查无此人”
break # 退出内部while循环
else:
# 对于其他非预期输入,提示用户重新输入
print('输入无效,请输入yes或NO进行确认。')
except Exception as e:
# 在这里捕获任何可能的异常(虽然在这个特定情况下不太可能发生)
print(f"发生了一个错误: {e}")
# 可以选择退出循环或继续询问用户
break
# 退出内部for循环
break # 退出外部for循环
# 如果循环结束后变量仍为False,表示没有找到对应学号的学生
if not found:
# 打印查无此人的消息
print('查无此人!')
- 功能描述:
- 首先提示用户输入要删除的学生的学号。
- 然后,它遍历学生列表,查找与输入学号相匹配的学生。
- 如果找到匹配的学生,方法会显示该学生的信息,并询问用户是否确认删除。
- 根据用户的确认(
yes
)或取消(no
)输入,方法将相应地删除学生或打印取消删除的消息。 - 如果遍历完整个学生列表都没有找到匹配的学生,方法会打印“查无此人!”的消息。
- 变量和逻辑:
del_studentid
:存储用户输入的学号。found
:一个布尔变量,用于标记是否找到了对应学号的学生。student_info
:一个字符串,包含找到的学生的姓名和学号信息。confirm
:存储用户对于是否删除学生的确认输入。
- 异常处理:
- 在确认删除的循环中,有一个
try-except
结构来捕获任何可能发生的异常。然而,在这个特定的上下文中,由于input
函数通常不会引发Exception
(除非有外部因素干扰),这个异常处理结构可能显得有些多余。不过,它提供了一种处理未知错误的方式。
- 在确认删除的循环中,有一个
- 循环和条件:
- 方法使用了一个
for
循环来遍历学生列表。 - 一旦找到匹配的学生,方法会使用一个内部的
while True
循环来处理用户的确认输入。 - 根据用户的输入,内部的
while
循环会通过break
语句退出。 - 如果在
for
循环结束时没有找到匹配的学生,found
变量将保持为False
,并打印“查无此人!”的消息。
- 方法使用了一个
③改
def modify_student(self):
while True:
try:
search_studentid = input('请输入要修改的学员的学号或输入0退出修改:').strip()
if search_studentid == '0':
print('已取消修改!')
break # 直接退出循环
student_found = None
for student in self.student_list:
if student.studentid == search_studentid:
student_found = student
break
if student_found:
print("请选择要修改的信息类型:")
print("1. 姓名")
print("2. 性别")
print("3. 手机号")
print("4. 学号")
print("0. 取消对本学生的修改")
choice = input("请输入选项编号(0-4,或输入0退出当前学生的修改):").strip()
if choice == '0':
print('已取消对学生的修改!')
continue # 退出当前学生的修改循环,但可以继续修改其他学生
elif choice in ['1', '2', '3', '4']:
if choice == '1':
new_name = input('请输入新的姓名(或直接回车保持原样):').strip() or student_found.name
if re.match(r'^[\u4e00-\u9fff]+$', new_name):
confirm = input(f'确认将姓名修改为“{new_name}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.name = new_name
print('姓名修改成功!')
self.save_student()
else:
print('已取消姓名修改。')
else:
print('姓名只能包含中文字符,请重新输入(但此处已忽略或直接保持原样)。')
elif choice == '2':
new_gender = input(
'请输入新的性别(男/女,或直接回车保持原样):').strip() or student_found.gender
if new_gender in ['男', '女']:
confirm = input(f'确认将性别修改为“{new_gender}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.gender = new_gender
print('性别修改成功!')
self.save_student()
else:
print('已取消性别修改。')
else:
print('输入无效,性别应为男或女,已保持原样。')
elif choice == '3':
new_tel = input('请输入新的手机号(或直接回车保持原样):').strip() or student_found.tel
if re.match(r'^\d{11}$', new_tel) and not any(
s.tel == new_tel for s in self.student_list if s != student_found):
confirm = input(f'确认将手机号修改为“{new_tel}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.tel = new_tel
print('手机号修改成功!')
self.save_student()
else:
print('已取消手机号修改。')
else:
print('手机号必须为11位数字且不能重复(除非是当前学生的原手机号),已保持原样。')
elif choice == '4':
new_studentid = input(
'请输入新的学号(或直接回车保持原样):').strip() or student_found.studentid
if new_studentid != student_found.studentid and any(
s.studentid == new_studentid for s in self.student_list):
print('新学号已存在,请重新输入。')
else:
confirm = input(f'确认将学号修改为“{new_studentid}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.studentid = new_studentid
print('学号修改成功!')
self.save_student()
else:
print('已取消学号修改。')
else:
print('无效选项,请重新选择。')
else:
print('查无此人!')
except Exception as e:
print(f'发生了一个错误: {e}')
1.功能描述
- 方法允许用户通过输入学号来查找并修改特定学生的信息。
- 用户可以选择修改学生的姓名、性别、手机号或学号。
- 用户还可以选择取消对当前学生的修改或退出整个修改过程。
- 修改完成后,方法会保存更改。
2.变量和逻辑
search_studentid
:存储用户输入的学号,用于查找学生。student_found
:存储找到的学生对象,如果找不到则为None
。choice
:存储用户对于要修改的信息类型的选择。new_name
、new_gender
、new_tel
、new_studentid
:分别存储用户输入的新姓名、性别、手机号和学号。confirm
:存储用户对于是否确认修改的输入。
3.用户交互
- 方法首先提示用户输入要修改的学生的学号或输入
0
退出修改。 - 如果找到了对应学号的学生,方法会显示一个菜单,让用户选择要修改的信息类型。
- 根据用户的选择,方法会提示用户输入新的信息值,并询问是否确认修改。
- 如果用户确认修改,方法会更新学生对象的相关信息,并调用
self.save_student()
方法保存更改。 - 如果用户选择取消修改或退出当前学生的修改,方法会相应地打印消息并继续或退出循环。
- 如果找不到对应学号的学生,方法会打印“查无此人!”的消息。
4.异常处理
- 方法使用了一个
try-except
结构来捕获并处理可能发生的异常。 - 这有助于确保即使发生错误,程序也不会崩溃,并能向用户显示错误信息
④查
def search_student(self):
while True:
try:
# 用户选择查询方式
search_type = input('请输入查询方式(0:退出 1:按学号查询,2:按名字查询):')
if search_type == '0':
print('退出成功')
break
if search_type == '1':
# 用户输入目标学员学号
search_studentid = input('请输入要查询的学员的学号:')
# 存储所有匹配的学生信息
matching_students = []
for student in self.student_list:
if search_studentid.lower() in student.studentid.lower(): # 使用lower()进行不区分大小写的匹配
matching_students.append(
f'姓名{student.name}, 性别{student.gender}, 手机号{student.tel}, 学号{student.studentid}')
# 打印所有匹配的学生信息,如果没有则提示
if matching_students:
for student_info in matching_students:
print(student_info)
else:
print('查无此人!')
elif search_type == '2':
# 用户输入目标学员姓名
search_name = input('请输入要查询的学员的姓名:')
# 存储所有匹配的学生信息
matching_students = []
for student in self.student_list:
if search_name.lower() in student.name.lower(): # 不区分大小写的匹配
matching_students.append(
f'姓名{student.name}, 性别{student.gender}, 手机号{student.tel}, 学号{student.studentid}')
# 打印所有匹配的学生信息,如果没有则提示
if matching_students:
for student_info in matching_students:
print(student_info)
else:
print('查无此人!')
else:
print("无效的查询方式,请重新输入。")
except ValueError:
print('输入无效')
功能解析
- 用户选择查询方式:
- 用户通过输入
0
、1
或2
来选择退出查询、按学号查询或按名字查询。
- 用户通过输入
- 按学号查询:
- 用户输入学号后,程序遍历
self.student_list
,使用lower()
方法将输入的学号与每个学生的学号转换为小写后进行匹配。 - 匹配到的学生信息被添加到
matching_students
列表中。 - 如果找到匹配的学生,则打印这些学生的信息;否则,打印“查无此人!”。
- 用户输入学号后,程序遍历
- 按名字查询:
- 类似地,用户输入名字后,程序遍历
self.student_list
,将输入的名字与每个学生的名字转换为小写后进行匹配。 - 匹配到的学生信息被添加到
matching_students
列表中,并根据匹配结果打印相应的信息。
- 类似地,用户输入名字后,程序遍历
- 错误处理:
- 使用
try-except
块来捕获ValueError
异常,虽然在这个特定的代码段中,ValueError
可能不会被触发。但考虑到用户可能输入非预期的内容,保留这种异常处理是一个好习惯。
- 使用
上面就是对学生管理系统功能的介绍,最后就是学生管理系统的完整代码。
import re
class Student:
def __init__(self, name, gender, tel, studentid):
self.name = name
self.gender = gender
self.tel = tel
self.studentid = studentid
def __str__(self):
return f'{self.name}, {self.gender}, {self.tel}, {self.studentid}'
class StudentManager:
def __init__(self):
# 存储数据的列表
self.student_list = []
# 显示功能菜单
@staticmethod
def show_menu():
print('-----------------请选择如下功能-----------------')
print('1:添加学员')
print('2:删除学员')
print('3:修改学员信息')
print('4:查询学员信息')
print('5:显示所有学员信息')
print('6:退出系统')
# 添加学员
def add_student(self):
while True:
while True:
name = input('请输入您的姓名:')
if not re.match(r'^[\u4e00-\u9fff]+$', name):
print('姓名只能包含中文字符,请重新输入。')
continue # 如果姓名无效,则重新进入循环
else:
break
while True:
gender = input('请输入您的性别:')
if gender not in ['男', '女']:
print('输入无效,请重新输入。')
continue # 如果性别无效,则重新进入循环
else:
break
while True:
tel = input('请输入您的手机号:')
if not (tel.isdigit() and len(tel) == 11 and not any(student.tel == tel for student in self.student_list)):
print('手机号必须为11位数字且不能重复且不能有字母,请重新输入。')
continue # 如果手机号无效或重复,则重新进入循环
else:
break
while True:
studentid = input('请输入您的学号:')
if not (studentid.isdigit() and len(studentid) == 12 and not any(student.studentid == studentid for student in self.student_list)):
print('学号必须为12位数字且不能重复且不能有字母,请重新输入。')
continue # 如果学号无效或重复,则重新进入循环
else:
break
while True:
try:
confirm = input('您确认要添加这个学生吗?(yes/no):').strip().lower()
if confirm == 'no':
print('添加取消')
break # 如果用户选择不添加,则重新开始
elif confirm == 'yes':
student = Student(name, gender, tel, studentid)
# 将该学员添加到列表
self.student_list.append(student)
print(student)
break # 添加成功后退出循环
except ValueError:
continue
break
self.save_student()
# 删除学员
def del_student(self):
# 要删除的学生的学号
del_studentid = input('请输入要删除的学员学号:')
# 初始化一个变量,用于标记是否找到了对应学号的学生
found = False
# 遍历学生列表
for i in self.student_list:
# 如果当前遍历到的学生的学号与要删除的学号相匹配
if i.studentid == del_studentid:
# 从学生列表中获取该学生的信息
student_info = f"姓名: {i.name}, 学号: {i.studentid}" # 假设学生对象有name和studentid属性
# 询问用户是否确认删除
while True:
try:
confirm = input(
f"确认删除学生吗?学生信息: {student_info} (请输入yes确认删除,或输入NO取消删除):").strip().lower()
if confirm == 'yes':
# 从学生列表中移除该学生
self.student_list.remove(i)
# 打印删除成功的消息
print('删除成功')
# 将变量设置为True,表示找到了对应的学生
found = True
# 找到后退出循环
self.save_student()
break # 退出内部while循环
elif confirm == 'no':
# 如果用户选择不删除,打印取消删除的消息
print('已取消删除')
found = True # 设置为True以避免后续打印“查无此人”
break # 退出内部while循环
else:
# 对于其他非预期输入,提示用户重新输入
print('输入无效,请输入yes或NO进行确认。')
except Exception as e:
# 在这里捕获任何可能的异常(虽然在这个特定情况下不太可能发生)
print(f"发生了一个错误: {e}")
# 可以选择退出循环或继续询问用户
break
# 退出内部for循环
break # 退出外部for循环
# 如果循环结束后变量仍为False,表示没有找到对应学号的学生
if not found:
# 打印查无此人的消息
print('查无此人!')
# 修改学员信息
def modify_student(self):
while True:
try:
search_studentid = input('请输入要修改的学员的学号或输入0退出修改:').strip()
if search_studentid == '0':
print('已取消修改!')
break # 直接退出循环
student_found = None
for student in self.student_list:
if student.studentid == search_studentid:
student_found = student
break
if student_found:
print("请选择要修改的信息类型:")
print("1. 姓名")
print("2. 性别")
print("3. 手机号")
print("4. 学号")
print("0. 取消对本学生的修改")
choice = input("请输入选项编号(0-4,或输入0退出当前学生的修改):").strip()
if choice == '0':
print('已取消对学生的修改!')
continue # 退出当前学生的修改循环,但可以继续修改其他学生
elif choice in ['1', '2', '3', '4']:
if choice == '1':
new_name = input('请输入新的姓名(或直接回车保持原样):').strip() or student_found.name
if re.match(r'^[\u4e00-\u9fff]+$', new_name):
confirm = input(f'确认将姓名修改为“{new_name}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.name = new_name
print('姓名修改成功!')
self.save_student()
else:
print('已取消姓名修改。')
else:
print('姓名只能包含中文字符,请重新输入(但此处已忽略或直接保持原样)。')
elif choice == '2':
new_gender = input(
'请输入新的性别(男/女,或直接回车保持原样):').strip() or student_found.gender
if new_gender in ['男', '女']:
confirm = input(f'确认将性别修改为“{new_gender}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.gender = new_gender
print('性别修改成功!')
self.save_student()
else:
print('已取消性别修改。')
else:
print('输入无效,性别应为男或女,已保持原样。')
elif choice == '3':
new_tel = input('请输入新的手机号(或直接回车保持原样):').strip() or student_found.tel
if re.match(r'^\d{11}$', new_tel) and not any(
s.tel == new_tel for s in self.student_list if s != student_found):
confirm = input(f'确认将手机号修改为“{new_tel}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.tel = new_tel
print('手机号修改成功!')
self.save_student()
else:
print('已取消手机号修改。')
else:
print('手机号必须为11位数字且不能重复(除非是当前学生的原手机号),已保持原样。')
elif choice == '4':
new_studentid = input(
'请输入新的学号(或直接回车保持原样):').strip() or student_found.studentid
if new_studentid != student_found.studentid and any(
s.studentid == new_studentid for s in self.student_list):
print('新学号已存在,请重新输入。')
else:
confirm = input(f'确认将学号修改为“{new_studentid}”吗?(yes/no):').strip().lower()
if confirm == 'yes':
student_found.studentid = new_studentid
print('学号修改成功!')
self.save_student()
else:
print('已取消学号修改。')
else:
print('无效选项,请重新选择。')
else:
print('查无此人!')
except Exception as e:
print(f'发生了一个错误: {e}')
# 查询学员信息
def search_student(self):
while True:
try:
# 用户选择查询方式
search_type = input('请输入查询方式(0:退出 1:按学号查询,2:按名字查询):')
if search_type == '0':
print('退出成功')
break
if search_type == '1':
# 用户输入目标学员学号
search_studentid = input('请输入要查询的学员的学号:')
# 存储所有匹配的学生信息
matching_students = []
for student in self.student_list:
if search_studentid.lower() in student.studentid.lower(): # 使用lower()进行不区分大小写的匹配
matching_students.append(
f'姓名{student.name}, 性别{student.gender}, 手机号{student.tel}, 学号{student.studentid}')
# 打印所有匹配的学生信息,如果没有则提示
if matching_students:
for student_info in matching_students:
print(student_info)
else:
print('查无此人!')
elif search_type == '2':
# 用户输入目标学员姓名
search_name = input('请输入要查询的学员的姓名:')
# 存储所有匹配的学生信息
matching_students = []
for student in self.student_list:
if search_name.lower() in student.name.lower(): # 不区分大小写的匹配
matching_students.append(
f'姓名{student.name}, 性别{student.gender}, 手机号{student.tel}, 学号{student.studentid}')
# 打印所有匹配的学生信息,如果没有则提示
if matching_students:
for student_info in matching_students:
print(student_info)
else:
print('查无此人!')
else:
print("无效的查询方式,请重新输入。")
except ValueError:
print('输入无效')
#显示所有学员信息
def show_student(self):
print(' 姓名\t 性别\t ⼿机号 \t 学号')
for i in self.student_list:
print(f'{i.name}\t {i.gender}\t {i.tel}\t {i.studentid}')
# 保存学员信息
def save_student(self):
# 打开⽂件
f = open('student.data', 'w')
# ⽂件写⼊学员数据
new_list = [i.__dict__ for i in self.student_list]
# [{'name': 'aa', 'gender': 'nv', 'tel': '111'}]
f.write(str(new_list))
#关闭⽂件
f.close()
# 加载学员信息
def load_student(self):
# 以"r"模式打开数据⽂件
try:
a= open('student.data', 'r')
# 以"w"模式打开数据⽂件
except:
a= open('student.data', 'w')
else:
# 读取数据
data = a.read()
new_list = eval(data)
self.student_list = [Student(i['name'], i['gender'], i['tel'], i['studentid']) for i in new_list]
finally:
# 关闭⽂件
a.close()
def run(self):
# 加载学员信息
self.load_student()
while True: # 循环,直到用户选择退出
self.show_menu()
try:
# ⽤户输⼊功能序号
menu_num = int(input('请输⼊您需要的功能序号:'))
# 根据⽤户输⼊的功能序号执⾏不同的功能
if menu_num == 1:
# 添加学员
self.add_student()
elif menu_num == 2:
self.del_student()
elif menu_num == 3:
# 修改学员信息
self.modify_student()
elif menu_num == 4:
# 查询学员信息
self.search_student()
elif menu_num == 5:
# 显示所有学员信息
self.show_student()
elif menu_num == 6:
# 退出系统
break
else:
print("无效的功能序号,请重新输入。")
except ValueError:
# 捕获ValueError异常,当输入不是整数时
print("输入无效,请输入一个整数。")