系统设计
这个学生信息管理系统应该有添加学生信息、修改学生信息、删除学生信息、查找学生信息、显示所有学生信息、对学生信息进行排序、统计学生人数的功能。
先把主体框架的代码写好,再逐步把这些功能函数实现。以下是框架代码,在main()里的循环中输入0会退出循环,也就是会退出整个系统。输入1-7会进入对应的功能函数。如果输入的不是0-7,会提示输入非法!
import time
filename = 'student_info.txt' # 保存信息的文件
def main():
while True:
menu() # 打印菜单函数
choice = input('请输入你的选项:')
if choice == '0':
print('系统退出成功!')
break
elif choice == '1':
insert() # 录入信息
elif choice == '2':
research() # 查找信息
elif choice == '3':
delete() # 删除信息
elif choice == '4':
change() # 修改信息
elif choice == '5':
sort() # 排序显示信息
elif choice == '6':
statistic() # 统计人数
elif choice == '7':
show_all() # 打印所有信息
else:
print('输入非法,请重新输入!')
time.sleep(1) # 休眠1秒,防止没看到上面的打印
continue
if __name__ == '__main__':
main()
具体的函数实现
菜单函数
打印菜单。
def menu():
print('''
===========学生信息管理系统===========
----------------菜单----------------
\t1.录入学生信息
\t2.查找学生信息
\t3.删除学生信息
\t4.修改学生信息
\t5.对学生成绩进行排序
\t6.统计学生总人数
\t7.显示所有学生信息
\t0.退出系统
-----------------------------------
''')
输出结果:
录入学生信息函数
将输入的信息保存到字典,再保存到列表, 列表元素为字典,那么列表为:
[{'name': 'cc', 'id': 10001, 'python': 45.0, 'c': 98.0, 'cpp': 45.0}, {'name': 'www', 'id': 10003, 'python': 98.0, 'c': 65.0, 'cpp': 75.0}]
def insert():
while True:
name = input('请输入姓名:')
try:
stu_id = int(input('请输入学号:'))
python = float(input('请输入python成绩:'))
c = float(input('请输入C语言成绩:'))
cpp = float(input('请输入C++成绩:'))
except:
# 如果try里面的代码出现异常了(输入的数据不规范,比如学号中输入了一个a),就会执行except里面的代码
print('输入的数据不规范,请重新输入!')
time.sleep(1)
continue
break
# 循环结束后,将录入的信息保存到字典中,有利于之后数据的查找、修改、排序
d_stu = {'name': name, 'id': stu_id, 'python': python, 'c': c, 'cpp': cpp}
lst_stu = []
lst_stu.append(d_stu) # 再将字典添加到列表中
save(lst_stu) # 使用自定义的save函数保存信息到文件,参数是列表
print('学生信息已成功保存!')
为什么要添加一个save函数来保存信息,因为保存到文件的操作很频繁,所以封装成函数。函数的参数是一个列表,遍历列表得到列表元素字典,转为字符串(write函数的参数是字符串类型),再加上换行写入到文件。
那么文件中存储的信息如下所示:
{'name': 'cc', 'id': 10001, 'python': 45.0, 'c': 98.0, 'cpp': 45.0} {'name': 'www', 'id': 10003, 'python': 98.0, 'c': 65.0, 'cpp': 75.0} {'name': 'yyy', 'id': 10003, 'python': 56.0, 'c': 98.0, 'cpp': 78.0} {'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}
def save(lst): # 将列表的元素都保存到文件中
with open(filename, 'a', encoding='utf-8') as file: # 追加写方式打开文件
for item in lst:
file.write(str(item) + '\n') # 将列表元素转为字符串再加上换行写入到文件中
修改学生信息函数
先把文件的信息全部读取到列表old_lst中,列表如下所示:
["{'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}\n"]
遍历列表,列表元素是字符串如下:
"{'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}\n"
此时使用eval函数去掉两边的引号,得到字典,\n会被自动去掉。
利用字典的性质判断要修改的学生的id是否与字典中'id'的值相等,相等的话就把新的信息输入,最后保存到文件。
def change():
show_all()
old_lst = [] # 保存文件的数据
with open(filename, 'r', encoding='utf-8') as file:
old_lst = file.readlines()
stu_id = eval(input('请输入要修改的学生的id:'))
with open(filename, 'w', encoding='utf-8') as file:
for item in old_lst:
d = dict(eval(item))
if d['id'] == stu_id:
print('找到了该学生!')
while True:
try:
d['name'] = input('请输入姓名:')
d['python'] = float(input('请输入python成绩:'))
d['c'] = float(input('请输入C语言成绩:'))
d['cpp'] = float(input('请输入C++成绩:'))
except:
print('输入有误!')
time.sleep(1)
break
print('修改成功!')
# 不管是不是该学生都要把数据写入到文件
file.write(str(d) + '\n')
删除学生信息函数
def delete():
flag = False # 标记是否删除了数据
while True:
stu_id = eval(input('请输入要删除的学生的学号:'))
if bool(stu_id): # 不为空字符串
old_lst = [] # 获取之前的数据
with open(filename, 'r', encoding='utf-8') as rfile:
old_lst = rfile.readlines()
with open(filename, 'w', encoding='utf-8') as wfile:
d = {}
for item in old_lst:
d = dict(eval(item)) # 将每一行转为字典类型,方便查找学号
if d['id'] != stu_id: # 不是要删除的数据,就写入到文件
wfile.write(str(d) + '\n')
else:
# 这为要删除的数据行,不写入文件,并把是否删除标记设为True
flag = True
if flag:
print(f'成功删除了学号为{stu_id}的数据')
else:
print(f'没有找到学号为{stu_id}的学生信息')
break
else:
print('输入的学号为空,请重新输入!')
continue
显示所有学生信息函数
def show_all():
lst = []
with open(filename, 'r', encoding='utf-8') as file:
datas_lst = file.readlines() # [['{}']['{}']]
for item in datas_lst:
lst.append(eval(item)) # 存放所有的数据的列表
show_stu_lst(lst)
实现其中的show_stu_lst()函数,利用了format格式化字符串的方法。
def show_stu_lst(lst):
if len(lst) == 0: # 列表为空
print('无数据显示')
return
else:
# 定义标题显示格式
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}' # format格式化字符串
print(format_title.format('id', '姓名', 'python成绩', 'C语言成绩', 'C++成绩', '总成绩'))
# 定义内容的显示格式
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^14}\t{:^10}\t{:^10}'
for item in lst:
print(format_data.format(item.get('id'),
item.get('name'),
item.get('python'),
item.get('c'),
item.get('cpp'),
(item.get('python') + item.get('c') + item.get('cpp'))
))
查找学生信息函数
def research():
stu_lst = [] # 可能有同名的人,所以使用列表存储,可以存储多个人的信息
r_id = ''
r_name = ''
while True:
research_mode = input('1.按id查找\t2.按姓名查找,请输入:')
if research_mode == '1':
r_id = input('请输入要查找的id:')
break
elif research_mode == '2':
r_name = input('请输入要查找的姓名:')
break
else:
print('输入有误,请重新输入!')
continue
with open(filename, 'r', encoding='utf-8') as file:
datas = file.readlines()
for item in datas:
d = dict(eval(item)) # 将列表元素去掉字符串再转为字典,利用字典来查找
if r_id != '': # 按id查找
if d['id'] == int(r_id):
stu_lst.append(d)
elif r_name != '': # 按姓名查找
if d['name'] == r_name:
stu_lst.append(d)
# 显示查询结果
show_stu_lst(stu_lst)
排序学生信息函数
def sort():
show_all()
stu_lst = []
with open(filename, 'r', encoding='utf-8') as file:
datas_lst = file.readlines()
for item in datas_lst:
d = dict(eval(item))
stu_lst.append(d)
mode = '' # 选择升序还是降序
mode_bool = False
sort_mode = '' # 选择按什么数据排序
while True:
mode = input('0.降序 1.升序,请选择:')
if mode == '0':
mode_bool = True
break
elif mode == '1':
mode_bool = False
break
else:
print('输入错误,请重新输入。')
continue
while True:
sort_mode = input('1.按python成绩 2.按c语言成绩 3.按c++成绩 4.按总成绩,请选择排序方式:')
if sort_mode == '1':
stu_lst.sort(key=lambda x: x['python'], reverse=mode_bool)
break
elif sort_mode == '2':
stu_lst.sort(key=lambda x: x['c'], reverse=mode_bool)
break
elif sort_mode == '3':
stu_lst.sort(key=lambda x: x['cpp'], reverse=mode_bool)
break
elif sort_mode == '4':
stu_lst.sort(key=lambda x: x['c'] + x['cpp'] + x['python'], reverse=mode_bool)
break
else:
print('输入不合法,请重新输入')
continue
show_stu_lst(stu_lst)
统计学生人数函数
def statistic(): # 统计总共有多少人
with open(filename, 'r', encoding='utf-8') as file:
datas = file.readlines()
print(f'一个有{len(datas)}个学生')
完整代码
完整代码
import time
filename = 'student_info.txt'
def menu():
print('''
===========学生信息管理系统===========
----------------菜单----------------
\t1.录入学生信息
\t2.查找学生信息
\t3.删除学生信息
\t4.修改学生信息
\t5.对学生成绩进行排序
\t6.统计学生总人数
\t7.显示所有学生信息
\t0.退出系统
-----------------------------------
''')
def save(lst): # 将列表的元素都保存到文件中
with open(filename, 'a', encoding='utf-8') as file: # 追加写方式打开文件
for item in lst:
file.write(str(item) + '\n') # 将列表元素转为字符串再加上换行写入到文件中
def insert():
while True:
name = input('请输入姓名:')
try:
stu_id = int(input('请输入学号:'))
python = float(input('请输入python成绩:'))
c = float(input('请输入C语言成绩:'))
cpp = float(input('请输入C++成绩:'))
except:
# 如果try里面的代码出现异常了,输入的数据不规范(不是整数、浮点数),就会执行except里面的代码
print('输入的数据不规范,请重新输入!')
time.sleep(1)
continue
break
# 循环结束后,将录入的信息保存到字典中,有利于数据的查找、排序
d_stu = {'name': name, 'id': stu_id, 'python': python, 'c': c, 'cpp': cpp}
lst_stu = []
lst_stu.append(d_stu) # 再将字典添加到列表中
save(lst_stu) # 使用自定义的save函数保存信息到文件
print('学生信息已成功保存!')
def research():
stu_lst = [] # 可能有同名的人,所以使用列表存储,可以存储多个人的信息
r_id = ''
r_name = ''
while True:
research_mode = input('1.按id查找\t2.按姓名查找,请输入:')
if research_mode == '1':
r_id = input('请输入要查找的id:')
break
elif research_mode == '2':
r_name = input('请输入要查找的姓名:')
break
else:
print('输入有误,请重新输入!')
continue
with open(filename, 'r', encoding='utf-8') as file:
datas = file.readlines()
for item in datas:
d = dict(eval(item)) # 将列表元素去掉字符串再转为字典,利用字典来查找
if r_id != '': # 按id查找
if d['id'] == int(r_id):
stu_lst.append(d)
elif r_name != '': # 按姓名查找
if d['name'] == r_name:
stu_lst.append(d)
# 显示查询结果
show_stu_lst(stu_lst)
def show_stu_lst(lst):
if len(lst) == 0:
print('无数据显示')
return
else:
# 定义标题显示格式
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
print(format_title.format('id', '姓名', 'python成绩', 'C语言成绩', 'C++成绩', '总成绩'))
# 定义内容的显示格式
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^14}\t{:^10}\t{:^10}'
for item in lst:
print(format_data.format(item.get('id'),
item.get('name'),
item.get('python'),
item.get('c'),
item.get('cpp'),
(item.get('python') + item.get('c') + item.get('cpp'))
))
def delete():
flag = False # 标记是否删除了数据
while True:
stu_id = eval(input('请输入要删除的学生的学号:'))
if bool(stu_id): # 不为空字符串
old_lst = [] # 获取之前的数据
with open(filename, 'r', encoding='utf-8') as rfile:
old_lst = rfile.readlines()
with open(filename, 'w', encoding='utf-8') as wfile:
d = {}
for item in old_lst:
d = dict(eval(item)) # 将每一行转为字典类型,方便查找学号
if d['id'] != stu_id: # 不是要删除的数据,就写入到文件
wfile.write(str(d) + '\n')
else:
# 这为要删除的数据行,不写入文件,并把是否删除标记设为True
flag = True
if flag:
print(f'成功删除了学号为{stu_id}的数据')
else:
print(f'没有找到学号为{stu_id}的学生信息')
break
else:
print('输入的学号为空,请重新输入!')
continue
def change():
show_all()
old_lst = [] # 保存文件的数据
with open(filename, 'r', encoding='utf-8') as file:
old_lst = file.readlines()
stu_id = eval(input('请输入要修改的学生的id:'))
with open(filename, 'w', encoding='utf-8') as file:
for item in old_lst:
d = dict(eval(item))
if d['id'] == stu_id:
print('找到了该学生!')
while True:
try:
d['name'] = input('请输入姓名:')
d['python'] = float(input('请输入python成绩:'))
d['c'] = float(input('请输入C语言成绩:'))
d['cpp'] = float(input('请输入C++成绩:'))
except:
print('输入有误!')
time.sleep(1)
break
print('修改成功!')
# 不管是不是该学生都要把数据写入到文件
file.write(str(d) + '\n')
def sort():
show_all()
stu_lst = []
with open(filename, 'r', encoding='utf-8') as file:
datas_lst = file.readlines()
for item in datas_lst:
d = dict(eval(item))
stu_lst.append(d)
mode = '' # 选择升序还是降序
mode_bool = False
sort_mode = '' # 选择按什么数据排序
while True:
mode = input('0.降序 1.升序,请选择:')
if mode == '0':
mode_bool = True
break
elif mode == '1':
mode_bool = False
break
else:
print('输入错误,请重新输入。')
continue
while True:
sort_mode = input('1.按python成绩 2.按c语言成绩 3.按c++成绩 4.按总成绩,请选择排序方式:')
if sort_mode == '1':
stu_lst.sort(key=lambda x: x['python'], reverse=mode_bool)
break
elif sort_mode == '2':
stu_lst.sort(key=lambda x: x['c'], reverse=mode_bool)
break
elif sort_mode == '3':
stu_lst.sort(key=lambda x: x['cpp'], reverse=mode_bool)
break
elif sort_mode == '4':
stu_lst.sort(key=lambda x: x['c'] + x['cpp'] + x['python'], reverse=mode_bool)
break
else:
print('输入不合法,请重新输入')
continue
show_stu_lst(stu_lst)
def statistic(): # 统计总共有多少人
with open(filename, 'r', encoding='utf-8') as file:
datas = file.readlines()
print(f'一个有{len(datas)}个学生')
def show_all():
lst = []
with open(filename, 'r', encoding='utf-8') as file:
datas_lst = file.readlines() # [['{}']['{}']]
for item in datas_lst:
lst.append(eval(item)) # 存放所有的数据的列表
show_stu_lst(lst)
def main():
while True:
menu() # 打印菜单函数
choice = input('请输入你的选项:')
if choice == '0':
print('系统退出成功!')
break # 退出系统
elif choice == '1':
insert() # 录入
elif choice == '2':
research() # 查找
elif choice == '3':
delete() # 删除
elif choice == '4':
change() # 修改
elif choice == '5':
sort() # 排序显示
elif choice == '6':
statistic() # 统计人数
elif choice == '7':
show_all() # 打印所有信息
else:
print('输入非法,请重新输入!')
time.sleep(1) # 休眠1秒,防止没看到上面的打印
continue
if __name__ == '__main__':
main()