Python练手项目:学生信息管理系统(上篇)
一,需求分析
当前情况:小明是班主任,他想统计学生的 英 语 、 P y t h o n 语 言 、 C 语 言 \color{red}{英语、Python语言、C语言} 英语、Python语言、C语言的成绩,并且知道不同科目分数高低的 排 序 \color{red}{排序} 排序情况。现在我们要为小明写一个控制台程序,最后生成 可 执 行 文 件 ( e x e 文 件 ) \color{red}{可执行文件(exe文件)} 可执行文件(exe文件)供小明使用!
学生信息管理系统应有的功能:
- 添加学生及成绩信息(必须)
- 将学生信息保存到文件中(必须)
- 修改和删除学生信息(必须)
- 查询学生信息(必须)
- 根据学生成绩进行排序(必须)
- 统计学生的总分(可不要)
二,系统功能设计及用户操作流程
根据上面的需求分析,作为编写程序的一方,大致将系统的功能结构分为以下三大大块进行设计
作为用户,在功能稳定的情况下,软件越简单使用越好
三,程序设计
1,菜单函数
'''主菜单'''
def menu():
#输出菜单
print('''
┏------------------学生信息管理系统-------------------┓
| ================== 功能菜单 ================ |
| 1 录入学生成绩信息 |
| 2 查找学生成绩信息 |
| 3 删除学生成绩信息 |
| 4 修改学生成绩信息 |
| 5 学生成绩排序 |
| 6 学生数量 |
| 7 显示所有学生成绩信息 |
| 0 退出系统 |
┗---------------------------------------------------┛
''')
2,主函数
def main():
ctrl = True#控制是否退出系统
while (ctrl):
menu()#显示菜单
option = input("请选择功能(输入:1或2或3...):")#提示输入数字
option_str = re.sub("\D","",option)#提取数字
if option_str in ['0','1','2','3','4','5','6','7']:#判断数字是否在0~7内
option_int = int(option_str)#转换成整型变量
if option_int == 0:
ctrl = False
print("您已退出学生信息管理系统")
elif option_int == 1:#录入学生成绩信息
insert()
pass
elif option_int == 2:#查找学生成绩信息
search()
pass
elif option_int == 3:#删除学生成绩信息
delete()
pass
elif option_int == 4:#修改学生成绩信息
modify()
pass
elif option_int == 5:#排序
sort()
pass
elif option_int == 6:#统计学生总数
total()
pass
elif option_int == 7:#显示所有学生信息
show()
pass
3,录入信息函数
'''1 录入学生信息函数 '''
def insert():
studentList = []#保存学生信息的列表
mark = True#是否进入循环
while mark:
s_id = input("请输入ID(学号):")
if not s_id :#ID 为空,跳出循环
break
name = input("请输入名字:")
if not name:
break
try:
english = int(input("请输入英语成绩:"))
python = int(input("请输入Python成绩:"))
c = int(input("请输入C成绩:"))
except:
print("输入无效,不是整形数值........请重新录入信息")
continue
#将输入的学生信息保存到字典
student = {"id":s_id,"name":name,"english":english,"python":python,"c":c}
studentList.append(student)#将学生字典添加到列表中
inputMark = input("是否继续添加?(y/n):")
if inputMark == "y" :
mark = True
else:
mark = False
save(studentList)#将列表保存在指定的文件中
print("学生信息录入完毕")
''' 保存学生信息函数 '''
def save(student):
try:
students_txt = open(filename,'a')#以追加模式打开
except Exception as e:
students_txt = open(filename,'w')#文件不存在,创建文件并打开
for info in student:
students_txt.write(str(info) + '\n')#按行储存,添加换行符
students_txt.close()
4,查找学生信息函数
'''2 查找学生信息 '''
def search():
mark = True#判断是否继续查找
student_query = []#保存查询结果的学生列表
while mark:
id = ""
name = ""
if os.path.exists(filename) :
mode = input("按ID查找请输入1;按姓名查找请输入2;")
if mode == '1' :
id = input("请输入学生ID:")
elif mode == '2' :
name = input("请输入学生姓名:")
else:
print("您的输入有误,请重新输入!")
#search()#重新查询
continue#重新查新
with open(filename,'r') as file:#只读形式打开文件
student = file.readlines()#列表形式多行读取
for list in student :#按行进行遍历列表
d = dict(eval(list))#将列表转换成字典
if id is not "" :
if d["id"] == id :
student_query.append(d)#将找到的信息添加到准备好的列表中
elif name is not "" :
if d['name'] == name :
student_query.append(d)
show_student(student_query)#显示学生信息
student_query.clear()#清除学生列表
inputMark = input("是否继续查询?(y/n):")
if inputMark == "y" :
mark = True
else:
mark = False
else:
print("暂未保存信息....")
return
'''显示保存在列表中的信息'''
def show_student(studentList):
if not studentList:
print("(╯‵□′)╯︵┻━┻没有数据信息\n")
return
#定义标题显示格式
format_title = "{:^6}{:^12}\t{:8}\t{:^10}\t{:^10}\t{:^10}"
print(format_title.format("ID","名字","英语成绩","Python成绩","C语言成绩","总成绩"))
#定义具体内容显示格式
format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
for info in studentList:
print(format_data.format(info.get("id"),
info.get("name"),
str(info.get("english")),
str(info.get("python")),
str(info.get("c")),
str(info.get("english") + info.get("python") + info.get("c")).center(12)))
5,删除学生信息函数
'''3 删除学生信息'''
def delete():
show()
mark = True # 标记是否循环
while mark:
studentId = input("请输入要删除的学生ID:")
if studentId is not "": # 判断要删除的学生是否存在
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r') as rfile: # 打开文件
student_old = rfile.readlines() # 读取全部内容
else:
student_old = []
ifdel = False # 标记是否删除
if student_old: # 如果存在学生信息
with open(filename, 'w') as wfile: # 以写方式打开文件
d = {} # 定义空字典
for list in student_old:
d = dict(eval(list)) # 字符串转字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") # 将一条学生信息写入文件
else:
ifdel = True # 标记已经删除
if ifdel:
print("ID为 %s 的学生信息已经被删除..." % studentId)
else:
print("没有找到ID为 %s 的学生信息..." % studentId)
else: # 不存在学生信息
print("无学生信息...")
break # 退出循环
show() # 显示全部学生信息
inputMark = input("是否继续删除?(y/n):")
if inputMark == "y":
mark = True # 继续删除
else:
mark = False # 退出删除学生信息功能
6,修改学生信息函数
'''4 修改学生信息 '''
def modify():
show()
if os.path.exists(filename) :
with open(filename,'r') as rfile:#打开文件
student_old = rfile.readlines()#按行读取
else:
print("暂未保存数据...")
return
studentid = input("请输入要修改的学生ID:")
with open(filename,"w") as wfile:
for student in student_old :
d = dict(eval(student))
if d['id'] == studentid :
print("找到了这名学生,可以修改他的信息")
while True:
try:
d['name'] = input("请输入姓名:")
d['english'] = int(input("请输入英语成绩:"))
d['python'] = int(input("请输入Python成绩:"))
d['c'] = int(input("请输入C语言成绩:"))
except:
print("您的输入有误,请从新输入!")
else:
break
student = str(d)
wfile.write(student + '\n')
print("修改成功!")
else:
wfile.write(student)
mark = input("是否继续修改其他学生信息?(y/n):")
if mark == 'y' :
modify()
7,排序函数
'''5 排序'''
def sort():
show()#显示全部学生信息
if os.path.exists(filename) :
with open(filename,'r') as file:
student_old = file.readlines()
student_new = []
for list in student_old:
d = dict(eval(list))
student_new.append(d)
else:
return
ascORdesc = input("请选择(0:升序;1:降序)")
if ascORdesc == "0" :
ascORdescBool =False
elif ascORdesc == "1" :
ascORdescBool = True
else:
print("您的输入有误,请重新输入!")
sort()
mode = input('''请选择排序方式
(1:按英语成绩排序;
2:按python成绩排序;
3:按C语言成绩排序;
0:按总成绩排序):''')
if mode == "1" :
student_new.sort(key = lambda x:x['english'],reverse = ascORdescBool)
elif mode == "2" :
student_new.sort(key = lambda x:x['python'],reverse = ascORdescBool)
elif mode == "3" :
student_new.sort(key = lambda x:x['c'],reverse = ascORdescBool)
elif mode == "0" :
student_new.sort(key = lambda x:x['english'] + x['python'] + x['c'],reverse = ascORdescBool)
else:
print("您的输入有误,请重新输入!")
sort()
show_student(student_new)
8,统计学生总数函数
'''6 统计学生总数'''
def total():
if os.path.exists(filename) :
with open(filename,'r') as rfile:#只读形式
student_old = rfile.readlines()
if student_old :
print("一共有 %d 名学生!" % len(student_old))
else:
print("还没有录入学生信息!")
else:
print("暂未保存数据信息...")
9,显示所有学生信息函数
'''7 显示所有学生信息'''
def show():
student_new = []
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r') as rfile: # 打开文件
student_old = rfile.readlines() # 读取全部内容
for list in student_old:
student_new.append(eval(list)) # 将找到的学生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("暂未保存数据信息...")
完整代码
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 16 10:07:30 2020
@author: HPN
"""
import re # 导入正则表达式模块
import os # 导入操作系统模块
filename = "students.txt" # 定义保存学生信息的文件名
'''主菜单'''
def menu():
#输出菜单
print('''
┏------------------学生信息管理系统-------------------┓
| ================== 功能菜单 ================ |
| 1 录入学生成绩信息 |
| 2 查找学生成绩信息 |
| 3 删除学生成绩信息 |
| 4 修改学生成绩信息 |
| 5 学生成绩排序 |
| 6 学生数量 |
| 7 显示所有学生成绩信息 |
| 0 退出系统 |
┗---------------------------------------------------┛
''')
'''主函数'''
def main():
ctrl = True#控制是否退出系统
while (ctrl):
menu()#显示菜单
option = input("请选择功能(输入:1或2或3...):")#提示输入数字
option_str = re.sub("\D","",option)#提取数字
if option_str in ['0','1','2','3','4','5','6','7']:#判断数字是否在0~7内
option_int = int(option_str)#转换成整型变量
if option_int == 0:
ctrl = False
print("您已退出学生信息管理系统")
elif option_int == 1:#录入学生成绩信息
insert()
pass
elif option_int == 2:#查找学生成绩信息
search()
pass
elif option_int == 3:#删除学生成绩信息
delete()
pass
elif option_int == 4:#修改学生成绩信息
modify()
pass
elif option_int == 5:#排序
sort()
pass
elif option_int == 6:#统计学生总数
total()
pass
elif option_int == 7:#显示所有学生信息
show()
pass
''' 保存学生信息函数 '''
def save(student):
try:
students_txt = open(filename,'a')#以追加模式打开
except Exception as e:
students_txt = open(filename,'w')#文件不存在,创建文件并打开
for info in student:
students_txt.write(str(info) + '\n')#按行储存,添加换行符
students_txt.close()
'''1 录入学生信息函数 '''
def insert():
studentList = []#保存学生信息的列表
mark = True#是否进入循环
while mark:
s_id = input("请输入ID(学号):")#输入学号
if not s_id :#ID 为空,跳出循环
break
name = input("请输入名字:")#输入名字
if not name:
break
try:
english = int(input("请输入英语成绩:"))
python = int(input("请输入Python成绩:"))
c = int(input("请输入C成绩:"))
except:
print("输入无效,不是整形数值........请重新录入信息")
continue
#将输入的学生信息保存到字典
student = {"id":s_id,"name":name,"english":english,"python":python,"c":c}#将获得的信息变成字典的形式
studentList.append(student)#将学生字典添加到列表中
inputMark = input("是否继续添加?(y/n):")#判断是否继续添加
if inputMark == "y" :
mark = True
else:
mark = False
save(studentList)#将列表保存在指定的文件中
print("学生信息录入完毕")
'''2 查找学生信息 '''
def search():
mark = True#判断是否继续查找
student_query = []#保存查询结果的学生列表
while mark:
id = ""
name = ""
if os.path.exists(filename) :
mode = input("按ID查找请输入1;按姓名查找请输入2;")
if mode == '1' :
id = input("请输入学生ID:")
elif mode == '2' :
name = input("请输入学生姓名:")
else:
print("您的输入有误,请重新输入!")
#search()#重新查询
continue#重新查新
with open(filename,'r') as file:#只读形式打开文件
student = file.readlines()#列表形式多行读取
for list in student :#按行进行遍历列表
d = dict(eval(list))#将列表转换成字典
if id is not "" :
if d["id"] == id :
student_query.append(d)#将找到的信息添加到准备好的列表中
elif name is not "" :
if d['name'] == name :
student_query.append(d)
show_student(student_query)#显示学生信息
student_query.clear()#清除学生列表
inputMark = input("是否继续查询?(y/n):")
if inputMark == "y" :
mark = True
else:
mark = False
else:
print("暂未保存信息....")
return
'''显示保存在列表中的信息'''
def show_student(studentList):
if not studentList:
print("(╯‵□′)╯︵┻━┻没有数据信息\n")
return
#定义标题显示格式
format_title = "{:^6}{:^12}\t{:8}\t{:^10}\t{:^10}\t{:^10}"
print(format_title.format("ID","名字","英语成绩","Python成绩","C语言成绩","总成绩"))
#定义具体内容显示格式
format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
for info in studentList:
print(format_data.format(info.get("id"),
info.get("name"),
str(info.get("english")),
str(info.get("python")),
str(info.get("c")),
str(info.get("english") + info.get("python") + info.get("c")).center(12)))
'''3 删除学生信息'''
def delete():
show()
mark = True # 标记是否循环
while mark:
studentId = input("请输入要删除的学生ID:")
if studentId is not "": # 判断要删除的学生是否存在
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r') as rfile: # 打开文件
student_old = rfile.readlines() # 读取全部内容
else:
student_old = []
ifdel = False # 标记是否删除
if student_old: # 如果存在学生信息
with open(filename, 'w') as wfile: # 以写方式打开文件
d = {} # 定义空字典
for list in student_old:
d = dict(eval(list)) # 字符串转字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") # 将一条学生信息写入文件
else:
ifdel = True # 标记已经删除
if ifdel:
print("ID为 %s 的学生信息已经被删除..." % studentId)
else:
print("没有找到ID为 %s 的学生信息..." % studentId)
else: # 不存在学生信息
print("无学生信息...")
break # 退出循环
show() # 显示全部学生信息
inputMark = input("是否继续删除?(y/n):")
if inputMark == "y":
mark = True # 继续删除
else:
mark = False # 退出删除学生信息功能
'''4 修改学生信息 '''
def modify():
show()
if os.path.exists(filename) :
with open(filename,'r') as rfile:#打开文件
student_old = rfile.readlines()#按行读取
else:
print("暂未保存数据...")
return
studentid = input("请输入要修改的学生ID:")
with open(filename,"w") as wfile:
for student in student_old :
d = dict(eval(student))
if d['id'] == studentid :
print("找到了这名学生,可以修改他的信息")
while True:
try:
d['name'] = input("请输入姓名:")
d['english'] = int(input("请输入英语成绩:"))
d['python'] = int(input("请输入Python成绩:"))
d['c'] = int(input("请输入C语言成绩:"))
except:
print("您的输入有误,请从新输入!")
else:
break
student = str(d)
wfile.write(student + '\n')
print("修改成功!")
else:
wfile.write(student)
mark = input("是否继续修改其他学生信息?(y/n):")
if mark == 'y' :
modify()
'''5 排序'''
def sort():
show()#显示全部学生信息
if os.path.exists(filename) :
with open(filename,'r') as file:
student_old = file.readlines()
student_new = []
for list in student_old:
d = dict(eval(list))
student_new.append(d)
else:
return
ascORdesc = input("请选择(0:升序;1:降序)")
if ascORdesc == "0" :
ascORdescBool =False
elif ascORdesc == "1" :
ascORdescBool = True
else:
print("您的输入有误,请重新输入!")
sort()
mode = input('''请选择排序方式
(1:按英语成绩排序;
2:按python成绩排序;
3:按C语言成绩排序;
0:按总成绩排序):''')
if mode == "1" :
student_new.sort(key = lambda x:x['english'],reverse = ascORdescBool)
elif mode == "2" :
student_new.sort(key = lambda x:x['python'],reverse = ascORdescBool)
elif mode == "3" :
student_new.sort(key = lambda x:x['c'],reverse = ascORdescBool)
elif mode == "0" :
student_new.sort(key = lambda x:x['english'] + x['python'] + x['c'],reverse = ascORdescBool)
else:
print("您的输入有误,请重新输入!")
sort()
show_student(student_new)
'''6 统计学生总数'''
def total():
if os.path.exists(filename) :
with open(filename,'r') as rfile:#只读形式
student_old = rfile.readlines()
if student_old :
print("一共有 %d 名学生!" % len(student_old))
else:
print("还没有录入学生信息!")
else:
print("暂未保存数据信息...")
'''7 显示所有学生信息'''
def show():
student_new = []
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r') as rfile: # 打开文件
student_old = rfile.readlines() # 读取全部内容
for list in student_old:
student_new.append(eval(list)) # 将找到的学生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("暂未保存数据信息...")
if __name__ == "__main__" :
main()
四,程序测试
以上只是部分截图,发现了如下几个主要问题:
1,字的颜色太单调
2,成绩显示对不齐
3,排序部分有明显bug,函数中嵌套自己有问题,需要修改