对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。
功能描述:
1、本系统显示这样的菜单:
请选择系统功能项:
我目前的残缺程序如下,统计部分实现不了
import os
import re
from collections import Counter
filename = 'student.txt'
print('================ 欢迎使用学生成绩管理系统V1.0 ================')
def menu():
print('\n---------------- 主菜单 ----------------')
print('1. 录入学生成绩')
print('2. 删除学生成绩')
print('3. 修改学生成绩')
print('4. 成绩排序')
print('5. 统计')
print('6. 显示所有学生成绩')
print('0. 退出系统')
def main():
x =6
while True:
menu()
x = int(input('\n请选择功能:'))
if x == 0:
y = input('您确定要退出系统吗?y/n:')
if y == 'y' or y == 'Y':
print('\n感谢使用学生成绩管理系统V1.0!')
break
else:
continue
elif x == 1:
insert()
elif x == 2:
delete()
elif x == 3:
modify()
elif x == 4:
sort()
elif x == 5:
total()
elif x == 6:
show()
else:
print('输入有误,请重新输入!')
def insert():
student_list = []
while True:
id = input('请输入学生学号:')
if not id:
break
name = input('请输入学生姓名:')
if not name:
break
try:
english = int(input('请输入学生英语成绩:'))
python = int(input('请输入学生python成绩:'))
math = int(input('请输入学生数学成绩:'))
data = int(input('请输入学生数据结构成绩:'))
except:
print('成绩录入有错,请检查后重新录入!')
continue
stu = {'id': id, 'name': name, 'english': english, 'python': python, 'math': math, 'data': data}
student_list.append(stu)
a = input('\n是否继续录入?y/n:')
if a == 'y' or a == 'Y':
continue
else:
break
save(student_list)
print('\n学生成绩录入成功!')
def delete():
while True:
show()
id = input('请输入要删除的学生id(输入0结束本功能):')
if id != '':
if id == '0':
print('\n删除模块已关闭!')
break
if os.path.exists(filename): # 查询文件是否存在
with open(filename, 'r', encoding = 'UTF-8') as file:
stu_old = file.readlines() # 读取文件中所有信息
else:
stu_old = [] # 若文件不存在,则建立一个空列表
flag = False # 标记是否删除
if stu_old: # 判断学生列表否有数据
with open(filename, 'w', encoding = 'UTF-8') as w_file:
d = {} # 建立一个空字典
for i in stu_old:
d = dict(eval(i)) # 将字符串转为字典
if d['id'] != id: # 当id值不同时,写入到文件中
w_file.write(str(d)+'\n')
else:
flag = True # 当查找出要删除的信息时,把标记设置成已删除状态
if flag: # 根据标记判断信息是否删除
print(f'\nid为{id}的学生已被删除!')
else:
print(f'\n没有找到id为{id}的学生信息!')
else:
print('\n无学生信息!')
break
show() # 删除后显示所有学生信息
def modify(): # 修改学生信息
q=eval(input("请输入密码:"))
while q==123456:
show()
id = input('\n输入要修改的学生id(输入0退出):')
if id == '0':
print('\n退出修改模块成功!')
return
if os.path.exists(filename):
with open(filename, 'r', encoding = 'UTF-8') as r_file:
stu_old = r_file.readlines()
else:
return
with open(filename, 'w', encoding = 'UTF-8') as w_file:
flag = False
for i in stu_old:
d = dict(eval(i))
if d['id'] == id: # 查询出要修改的学生信息
flag = True # 设置修改标记为已修改状态
a = {'id': id, 'name': '', 'english': 0, 'python': 0, 'math': 0, 'data': 0}
while True:
try:
a['name'] = input(f"请输入姓名({d['name']}):")
a['english'] = input(f"请输入英语成绩({d['english']}):")
a['python'] = input(f"请输入python成绩({d['python']}):")
a['math'] = input(f"请输入数学成绩({d['math']}):")
a['data'] = input(f"请输入数据结构成绩({d['data']}):")
x = input('\n是否确定修改y/n,')
if x == 'y' or x == 'Y':
d = a # a为修改后的信息,当用户确认修改后,将a值赋给d,并将d值写入文件
print('\n修改成功!')
except:
print('输入有误,请重新输入!')
break
w_file.write(str(d) + '\n') # 将修改后的信息写入文件
else:
w_file.write(str(d) + '\n')
if not flag:
print('\n未查询到该学生信息!')
else:
print("密码错误,进程结束")
def sort(): # 排序
show() # 显示学生信息列表
if os.path.exists(filename):
with open(filename, 'r', encoding = 'UTF-8') as r_file:
stu_list = r_file.readlines()
stu_new = []
for i in stu_list:
d = dict(eval(i))
stu_new.append(d)
else:
return
asc_or_desc = input('请选择(0。升序 1.降序):')
if asc_or_desc == '0':
asc_or_desc_bool = False # 升序标记
elif asc_or_desc == '1':
asc_or_desc_bool = True # 降序标记
else:
print('输入错误!')
m = input('请选择排序方式:(1.按英语成绩排序 2.按python成绩排序 3.按数学成绩排序 4.按数据结构成绩排序 0.按总成绩排序):')
if m == '1': # 按英语成绩排序
stu_new.sort(key = lambda x:int(x['english']), reverse = asc_or_desc_bool)
elif m == '2': # 按python成绩排序
stu_new.sort(key = lambda x:int(x['python']), reverse = asc_or_desc_bool)
elif m == '3': # 按数学成绩排序
stu_new.sort(key = lambda x:int(x['math']), reverse = asc_or_desc_bool)
elif m == '4': # 按数据结构成绩排序
stu_new.sort(key = lambda x:int(x['data']), reverse = asc_or_desc_bool)
elif m == '0': # 按总成绩排序
stu_new.sort(key = lambda x:int(x['english']) + int(x['python']) + int(x['math']) + int(x['data']), reverse = asc_or_desc_bool)
else:
print("输入有误!")
show_stu(stu_new)
def total():
def show(): # 显示所有学生信息
stu_lst = []
if os.path.exists(filename):
with open(filename, 'r', encoding = 'UTF-8') as r_file:
stu = r_file.readlines()
for i in stu:
stu_lst.append(eval(i))
if stu_lst:
show_stu(stu_lst)
else:
print('\n暂未保存过数据!')
def save(lst):
try:
stu_write = open(filename, 'a', encoding = 'UTF-8') # 如果文件存在,则以追加的方式录入
except:
stu_write = open(filename, 'w', encoding = 'UTF-8') # 如果文件不存在,则写入文件
for i in lst:
stu_write.write(str(i) + '\n') # 写入文件并换行
stu_write.close() # 关闭I/O流
def show_stu(lst):
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^6}\t{:^14}'
print(format_title.format('id', '姓名', '英语成绩', 'python成绩', '数学成绩', '数据结构成绩', '总成绩'))
print('=======================================================================================')
format_data = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^16}\t{:^8}'
for i in lst:
print(format_data.format(i.get('id'), i.get('name'), i.get('english'), i.get('python'), i.get('math'),
i.get('data'),
int(i.get('english')) + int(i.get('python')) + int(i.get('math')) + int(
i.get('data'))))
x = input('按任意键继续...')
if __name__ == '__main__':
main()
此程序除了统计部分外都可实现,但统计部分弄了好久也不行,请大家在此程序基础上(在程序中统计函数哪里)实现统计部分,非常急,谢谢大家了!
根据你的代码思路写出如下函数,未调整数据结构,不过还是建议
def total():
stu_lst = []
if os.path.exists(filename):
with open(filename, 'r', encoding = 'UTF-8') as r_file:
stu = r_file.readlines()
for i in stu:
stu_lst.append(eval(i))
maxscore = dict()
avgscore = dict()
course_list=[ 'english', 'python', 'math', 'data' ]
for course in course_list:
avgscore[course] = 0
for item in stu_lst:
for course in course_list:
avgscore[course] += item.get(course)
if maxscore.get(course) is None:
maxscore[course] = item
else:
if maxscore[course].get(course) < item.get(course):
maxscore[course] = item
for course in course_list:
avgscore[course] = avgscore[course] * 1.0 / len(stu_lst)
above_avgscore = len( list(filter(lambda x: x.get(course) > avgscore[course], stu_lst )) )
print( course )
print( '课程平均分为:', round( avgscore[course]))
print( '超过平均分人数:', above_avgscore,2 )
print( '最高分学生信息(姓名-学号):', maxscore[course].get('name'), '-' , maxscore[course].get('id') )
print()
input('按任意键继续...')
Python:学习成绩管理系统
借鉴下
https://blog.csdn.net/weixin_56761388/article/details/127540823
/*---------------------------------------------f.成绩统计---------------------------------------------*/
void CountScore(){
int maxn[M],count[M];
double k,average[M];
memset(maxn,0,sizeof(maxn));
/*--------------------显示每门课程成绩最高的学生的基本信息--------------------*/
for(i=0;i<N;++i){
for(j=0;j<M;++j){
if(Stu[i].subject[j]>Stu[i].subject[maxn[j]])
maxn[j]=i;
}
}
for(i=0;i<M;++i){
cout<<"课程"<<i+1<<"成绩最高分学生信息:"<<Stu[i].ID<<"\t"<<Stu[i].name<<"\t";
for(j=0;j<M;++j)
cout<<Stu[i].subject[j]<<"\t";
cout<<endl;
}
cout<<endl;
/*---------------------------显示每门课程的平均成绩---------------------------*/
for(j=0;j<M;++j){
k=0;
for(i=0;i<N;++i)
k+=Stu[i].subject[j];
average[j]=k/N;
cout<<"课程"<<j+1<<"的平均成绩为:"<<average[j]<<endl;
}
cout<<endl;
/*---------------------显示超过某门课程平均成绩的学生人数---------------------*/
for(j=0;j<M;++j){
count[j]=0;
for(i=0;i<N;++i){
if(Stu[i].subject[j]>average[j])
++count[j];
}
cout<<"超过课程"<<j+1<<"平均成绩的学生人数为:"<<count[j]<<endl;
}
}