python班级成绩管理系统中,完善统计部分。

对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。
功能描述:
1、本系统显示这样的菜单:
请选择系统功能项:

  1. 成绩录入
  2. 成绩显示
  3. 成绩保存
  4. 成绩排序
  5. 成绩修改(要求先输入密码)
  6. 成绩统计
    a. 显示每门课程成绩最高的学生的基本信息
    b. 显示每门课程的平均成绩
    c. 显示超过某门课程平均成绩的学生人数
  7. 退出系统
    2、执行一个具体的功能之后,程序将重新显示菜单。
    3、将学生成绩保存到文件中。

我目前的残缺程序如下,统计部分实现不了

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()

此程序除了统计部分外都可实现,但统计部分弄了好久也不行,请大家在此程序基础上(在程序中统计函数哪里)实现统计部分,非常急,谢谢大家了!

根据你的代码思路写出如下函数,未调整数据结构,不过还是建议

  • 了解好,用好数据结构
  • 了解一些第三方库,这个如果用应该excel+numpy很简单

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; 
    }
}