学生成绩管理系统的设计与实现
一、 课题内容和要求
1.目的:
通过二周程序设计的实践,使学生熟悉Python开发环境和编程方法, 在程序设计过程中,运用软件工程的概念和方法,进系统进行分析与设计,通过编码和调试,完成课题的任务要求。
2. 开发环境和工具
(1) 环境
开发环境 Windows /Linux发行版
(2) 编程语言
Python
3. 功能要求:
- 数据结构:
本课题涉及三个文件,分别用于存放学生、课程和选课信息,基本结构如下
(1) 学生文件 student.dat
学号 姓名 年龄 性别
S1 WANG 20 M
S2 LIU 19 F
S3 CHEN 22 M
S4 WU 19 M
S5 LI 21 F
(2) 课程文件 course.dat
课程号 课程名 学时 学分 课程性质
C2 MATHS 64 4 基础
C4 PHYSICS 48 3 基础
C3 C 32 2 专业基础
C1 DB 48 3 专业
C5 0S 32 2 专业
(3) 选课文件sc.dat
学号 课程号 成绩
S1 C2 89
S2 C1 70
S3 C2
S1 C5 80
S4 C3
S5 C4 78
S2 C4 79
- 宏能要求:
四、功能要求
(1) 信息录入,包括:学生、课程和选课信息
(2) 信息查询,包括:学生、课程和选课信息
(3) 信息修改, 包括:学生、课程和选课信息
(4) 统计每门课程的最高、最低和平均成绩、
(5) 统计某门课程考试成绩各分数段的人数
(6) 计算每门考试课程的方差。
二、需求分析
使用结构化/面向对象方法对系统进行分析与设计。
分别对三个文件录入信息
能分别查询三个文件的信息
分别修改三个文件的信息
计算选中的某门课程的最大值 最小值 平均值和方差
根据获取到的某门课程的分数来对分数进行分段
三、概要设计
总体设计使用模块图
详细设计使用程序流图/盒图
import os
filename1 = 'student.text'
filename2 = 'course.text'
filename3 = 'sc.text'
#函数
def main():
#无限循环
while True:
#调用显示主菜单
menm()
choice=int(input('请选择'))
if choice in[0,1,2,3,4,5,6,7]:
if choice==0:
answer=input('确定要退出系统吗?y/n')
if answer=='y'or answer=='Y':
print('谢谢你的使用')
break #退出系统
else:
continue
elif choice == 1:
insert() # 了录入学生信息
elif choice == 2:
search()
elif choice == 3:
modify()
elif choice == 4:
sort() # 排序
elif choice == 5:
total()
elif choice == 6:
show() # 了录入学生信息
#菜单 就是一个显示页面 引导用户使用
def menm():
print('============================学生信息管理系统=================================')
print('-------------------------------功能菜单-------------------------------------')
print('tttttt1.录入学生信息')
print('tttttt2.查找学生信息')
print('tttttt3.修改学生信息')
print('tttttt4.统计每门课程的最高、最低和平均成绩以及计算对应考试课程的方差')
print('tttttt5.统计某门课程考试成绩各分数段的人数')
print('tttttt0.退出')
print('------------------------------------------------------------------------')
def insert():
while True:
print('1.录入学生文件n')
print('2.录入课程文件n')
print('3.录入选课文件n')
choice = int(input('请选择 输入0返回主界面'))
if choice in [0, 1, 2, 3,]:
if choice == 0:
answer = input('确定要退出录入吗?y/n')
if answer == 'y' or answer == 'Y':
print('已退出录入')
break # 退出系统
else:
continue
if choice==1:
insert1()
elif choice == 2:
insert2() # 了录入学生信息
elif choice == 3:
insert3()
def insert1():
# 创建一个空列表 用来存储输入的信息
student_list = []
while True:
id = input('请输入学号ID(s1)')
if not id:
break
name = input('请输入姓名:')
if not name:
break
sex = input('请输入性别:')
if not sex:
break
# 输入异常处理
try:
age = int(input('请输入年龄'))
except:
print('输入无效,不是整数类型,请重新输入')
continue
# 将录入的学生信息保存到字典中
student = {'学号': id, '姓名': name, '性别': sex, '年龄': age}
# 将录入的学生信息添加到列表当中
student_list.append(student)
answer = input('是否继续添加?y/nn')
if answer == 'y':
continue
else:
break
# 调用函数保存 传入列表
save1(student_list)
print('学生信息录入完毕')
def insert2():
student_list = []
while True:
id = input('请输入课程号')
if not id:
break
name = input('请输入课程名:')
if not name:
break
xingzhi = input('请输入课程性质:')
if not xingzhi:
break
try:
xueshi = int(input('请输入学时'))
xuefen = int(input('请输入学分'))
except:
print('输入无效,不是整数类型,请重新输入')
continue
# 将录入的学生信息保存到字典中
student = {'课程号': id, '课程名': name, '学时': xueshi, '学分': xuefen, '课程性质':xingzhi}
student_list.append(student)
answer = input('是否继续添加?y/nn')
if answer == 'y':
continue
else:
break
# 调用函数保存
save2(student_list)
print('学生信息录入完毕')
def insert3():
student_list = []
while True:
id = input('请输入学号')
if not id:
break
kechenghao = input('请输入课程号:')
if not kechenghao:
break
try:
chengji = int(input('请输入成绩'))
except:
print('输入无效,不是整数类型,请重新输入')
continue
# 将录入的学生信息保存到字典中
student = {'学号': id, '课程号': kechenghao,'成绩': chengji}
student_list.append(student)
answer = input('是否继续添加?y/nn')
if answer == 'y':
continue
else:
break
# 调用函数保存
save3(student_list)
print('学生信息录入完毕')
def save1(lst):
try:
# 以追加的模式打开
stu_txt = open(filename1, 'a', encoding='utf-8')
except:
# 没有这个文件的时候 就用写入的方式打开
stu_txt = open(filename1, 'w', encoding='utf-8')
#遍历lst 转换成字符型写入
for item in lst:
stu_txt.write(str(item)+'n')
#将打开的文件关闭
stu_txt.close()
def save2(lst):
try:
stu_txt = open(filename2, 'a', encoding='utf-8')
except:
stu_txt = open(filename2, 'w', encoding='utf-8')
for item in lst:
stu_txt.write(str(item)+'n')
stu_txt.close()
def save3(lst):
try:
stu_txt = open(filename3, 'a', encoding='utf-8')
except:
stu_txt = open(filename3, 'w', encoding='utf-8')
for item in lst:
stu_txt.write(str(item)+'n')
stu_txt.close()
def search():
while True:
print('1.查询学生文件n')
print('2.查询课程文件n')
print('3.查询选课文件n')
choice = int(input('请选择 输入0返回主界面'))
if choice in [0, 1, 2, 3,]:
if choice == 0:
answer = input('确定要退出查找吗?y/n')
if answer == 'y' or answer == 'Y':
print('已退出查询')
break # 退出系统
else:
continue
if choice == 1:
search1()
elif choice == 2:
search2() # 了录入学生信息
elif choice == 3:
search3()
def search1():
student_query = []
while True:
id = ''
name = ''
if os.path.exists(filename1):
mode = input('按ID查找请输入1,按姓名查找请输入2')
if mode == '1':
id = input('请输入学生ID')
elif mode == '2':
name = input('请输入学生的姓名')
else:
print('您输入的信息有误,请重新输入')
search1()
with open(filename1, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id!='':
if d['学号'] == id:
student_query.append(d)
elif name!='':
if d['姓名'] == name:
student_query.append(d)
# 显示查询结果
for index in range(len(student_query)):
print(student_query[index],'n')
# 清空列表
student_query.clear()
answer = input('是否要继续查询?y/nn')
if answer == 'y':
continue
else:
break
else:
print('暂未保存学生信息')
return
def search2():
student_query = []
while True:
id = ''
name = ''
if os.path.exists(filename2):
mode = input('按课程号查找请输入1,按课程名查找请输入2')
if mode == '1':
id = input('请输入学生ID')
elif mode == '2':
name = input('请输入学生的姓名')
else:
print('您输入的信息有误,请重新输入')
search2()
with open(filename2, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id!='':
if d['课程号'] == id:
student_query.append(d)
elif name!='':
if d['课程名'] == name:
student_query.append(d)
# 显示查询结果
for index in range(len(student_query)):
print(student_query[index], 'n')
# 清空列表
student_query.clear()
answer = input('是否要继续查询?y/nn')
if answer == 'y':
continue
else:
break
else:
print('暂未保存学生信息')
return
def search3():
student_query = []
while True:
id = ''
name = ''
if os.path.exists(filename3):
mode = input('按学号查找请输入1,按课程号查找请输入2')
if mode == '1':
id = input('请输入学生学号')
elif mode == '2':
name = input('请输入学生的课程号')
else:
print('您输入的信息有误,请重新输入')
search3()
with open(filename3, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id!='':
if d['学号'] == id:
student_query.append(d)
elif name!='':
if d['课程号'] == name:
student_query.append(d)
# 显示查询结果
for index in range(len(student_query)):
print(student_query[index],'n') # 清空列表
student_query.clear()
answer = input('是否要继续查询?y/nn')
if answer == 'y':
continue
else:
break
else:
print('暂未保存学生信息')
return
def modify():
while True:
print('1.修改学生文件n')
print('2.修改课程文件n')
print('3.修改选课文件n')
choice = int(input('请选择 输入0返回主界面'))
if choice in [0, 1, 2, 3,]:
if choice == 0:
answer = input('确定要退出查找吗?y/n')
if answer == 'y' or answer == 'Y':
print('已退出修改')
break # 退出系统
else:
continue
if choice == 1:
modify1()
elif choice == 2:
modify2() # 了录入学生信息
elif choice == 3:
modify3()
def modify1():
show()
# 判断文件是否存在
if os.path.exists(filename1):
with open(filename1, 'r', encoding='utf-8') as rfile:
# 打开问文件 读取信息 存入列表
student_old = rfile.readlines()
else:
# 不存在就结束函数
return
student_id = input('请输入要修改的学员的ID')
with open(filename1, 'w', encoding='utf-8') as wfile:
for item in student_old:
# 把读取到的字符串转换成字典
d = dict(eval(item))
if d['学号']==student_id:
print('找到学生的信息,可以修改他的相关信息了!')
while True:
try:
d['姓名'] = input('请输入姓名')
d['性别'] = input('请输入性别')
d['年龄'] = input('请输入年龄')
except:
print('您的输入有误,请重新输入!!!')
else:
break
wfile.write(str(d)+'n')
print('修改成功')
else:
wfile.write(str(d)+'n')
answer = input('是否继续修改其他学生信息?y/nn')
if answer == 'y':
modify1()
def modify2():
show()
if os.path.exists(filename2):
with open(filename2, 'r', encoding='utf-8') as rfile:
student_old = rfile.readlines()
else:
return
student_id = input('请输入要修改的课程号')
with open(filename2, 'w', encoding='utf-8') as wfile:
for item in student_old:
d = dict(eval(item))
if d['课程号']==student_id:
print('找到学生的信息,可以修改他的相关信息了!')
while True:
try:
d['课程名'] = input('请输入课程名')
d['学时'] = input('请输入学时')
d['学分'] = input('请输入学分')
d['课程性质'] = input('请输入课程性质')
except:
print('您的输入有误,请重新输入!!!')
else:
break
wfile.write(str(d)+'n')
print('修改成功')
else:
wfile.write(str(d)+'n')
answer = input('是否继续修改其他学生信息?y/nn')
if answer == 'y':
modify2()
def modify3():
show()
if os.path.exists(filename3):
with open(filename3, 'r', encoding='utf-8') as rfile:
student_old = rfile.readlines()
else:
return
student_id = input('请输入要修改的学员的ID')
with open(filename3, 'w', encoding='utf-8') as wfile:
for item in student_old:
d = dict(eval(item))
if d['学号']==student_id:
print('找到学生的信息,可以修改他的相关信息了!')
while True:
try:
d['课程号'] = input('请输入课程号')
d['成绩'] = input('请输入成绩')
except:
print('您的输入有误,请重新输入!!!')
else:
break
wfile.write(str(d)+'n')
print('修改成功')
else:
wfile.write(str(d)+'n')
answer = input('是否继续修改其他学生信息?y/nn')
if answer == 'y':
modify3()
def sort():
student_query = []
while True:
id = ''
if os.path.exists(filename3):
id = input('请输入要查询的课程号')
with open(filename3, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id != '':
if d['课程号']==id:
student_query.append(d)
# 显示查询结果
if student_query[0]!='':
L = ()
p = 0
for item in student_query:
i = int(item.get('成绩'))
p = i+p
x=item.get('成绩')
h = (x,)
L = (L) + (h)
print('执行过了')
else:
print('请不要输入空值')
sort()
# 清空列表
if len(student_query)==0:
print('没找到对应课程')
sort()
else:
print('本课程最高分数为', max(L))
print('本课程最低分数为', min(L))
print('平均', p / len(L))
s = 0
for index in range(len(L)):
n = float(p / len(L)) - float(L[index])
s = n * n + s
s = float(s)
print('方差为', s)
del L
answer = input('是否要继续查询?y/nn')
if answer == 'y':
sort()
else:
break
else:
print('暂未保存学生信息')
return
def total():
student_query = []
while True:
id = ''
if os.path.exists(filename3):
id = input('请输入要查询的课程号')
with open(filename3, 'r', encoding='utf-8') as rfile:
student = rfile.readlines()
for item in student:
d = dict(eval(item))
if id != '':
if d['课程号'] == id:
student_query.append(d)
# 显示查询结果
if student_query[0] != '':
L = ()
T = ()
p = 0
for item in student_query:
if int(item.get('成绩'))>59:
x = item.get('成绩')
h = (x,)
L = (L) + (h)
else:
x = item.get('成绩')
h = (x,)
T = (T) + (h)
else:
print('请不要输入空值')
total()
# 清空列表
if len(student_query) == 0:
print('没找到对应课程')
total()
else:
print('不及格的有',T)
print('及格的有', L)
del L
answer = input('是否要继续查询?y/nn')
if answer == 'y':
total()
else:
break
else:
print('暂未保存学生信息')
return
def show():
pass
#以主程序的形式进行
if __name__=='__main__':
main()
python实训报告



