学生成绩管理系统

主程序函数说明

分支代码解析

8.主函数和运行函数代码段

def Main():
    while True:
        Menu_b()

        choice = int(input('输入对应功能序号:'))

        if choice in [0,1,2,3,4,5,6,7]:
            if choice == 0:
                answer = input('您确信退出系统?y/n')
                if answer.lower() == 'y':
                    print('感谢使用本系统!')
                    break
                else:
                    continue
            elif choice == 1:
                Insert()
            elif choice == 2:
                Search()
            elif choice == 3:
                Delete()
            elif choice == 4:
                Modify()
            elif choice == 5:
                Sort()
            elif choice == 6:
                Total()
            elif choice == 7:
                Show()
        else:
            print('请输入正确的信息编号:')
            continue

if __name__=='__main__':
    Main()

9.功能菜单代码段

def Menu_b():
    print('''
    ===========学生信息管理系统========

    -----------功  能  菜  单-----------
    \n\t\t\t 1 录入学生信息  2 查找学生信息
    \n\t\t\t 3 删除学生信息  4 修改学生信息
    \n\t\t\t 5 学生信息排序  6 学生信息汇总
    \n\t\t\t 7 学生信息展示  0 退出
   ___________________________________
    ''')

主程序完整代码段

import os

filename = 'student_score.txt'
def Menu_b():
    print('''
    ===========学生信息管理系统========

    -----------功  能  菜  单-----------
    \n\t\t\t 1 录入学生信息  2 查找学生信息
    \n\t\t\t 3 删除学生信息  4 修改学生信息
    \n\t\t\t 5 学生信息排序  6 学生信息汇总
    \n\t\t\t 7 学生信息展示  0 退出
   ___________________________________
    ''')

def Main():
    while True:
        Menu_b()

        choice = int(input('输入对应功能序号:'))

        if choice in [0,1,2,3,4,5,6,7]:
            if choice == 0:
                answer = input('您确信退出系统?y/n')
                if answer.lower() == 'y':
                    print('感谢使用本系统!')
                    break
                else:
                    continue
            elif choice == 1:
                Insert()
            elif choice == 2:
                Search()
            elif choice == 3:
                Delete()
            elif choice == 4:
                Modify()
            elif choice == 5:
                Sort()
            elif choice == 6:
                Total()
            elif choice == 7:
                Show()
        else:
            print('请输入正确的信息编号:')
            continue

def Insert():
    while True:
        student_info = []
        id = input('请输入学生ID【如 1001】')
        if not id:
            break
        name = input('请输入学生姓名【如:张三】')
        if not name:
            break
        try:
            chinese = int(input('请输入语文成绩:'))
            maths = int(input('请输入数学成绩:'))
            english = int(input('请输入英语成绩:'))
            physics = int(input('请输入物理成绩:'))
            # 保存信息到字典中
            student = {'id': id, 'name': name, 'chinese': chinese, 'maths': maths, 'english': english,'physics': physics}
            # 信息保存到列表中
            student_info.append(student)
            # 调用保存函数,对数据进行保存
            Save(student_info)
        except:
            print('输入无效,不是整数哦!请重新输入')
            continue

        answer = input('是否继续录入y/n\n')
        if answer.lower() == 'y':
            continue
        else:
            break

def Save(st):
    #假如程序是第一次运行,就创建一个文件保存信息,假如已经创建了文件,第二次运行,直接打开文件写入信息
    try:
        student_txt =  open(filename,'a',encoding='utf-8')
    except:
        student_txt =  open(filename,'w',encoding='utf-8')
    #把python中的信息变量写操作,内容为接收的列表中的字典项(st-此处是一个函数中的形参命名,对应student实际参数)
    for info in st:
        student_txt.write(str(info)+'\n')
    student_txt.close()

    pass #查找信息
def Delete():
    while True:
        #先输入需要删除的id,判断已经输入好,判断文件内部是否有这样的id
        stu_id = input('请输入删除学生ID号:')
        if id !='':
            if os.path.exists(filename):
                with open(filename,'r',encoding='utf-8') as file:
                    stu_temp_old = file.readlines()
            else:
                stu_temp_old = []
            flag = False #标记是否删除
            if stu_temp_old:
                #此入打开文件的状态为w,表示信息提取并写入覆盖的方式保存到本地硬盘中
                with open(filename,'w',encoding='utf-8') as wfile:
                    d = {}
                    #建立一个空字典用来存储,通过readlines()导入到内存的数据
                    #由于item是把文本文件中的字典整条导入到列表中,因素我们需要把字典两边的字符去掉,实现字典还原
                    #导入到空字典中的还原字典的id和我们要删除的id如果不相等,则系统会重新把数据写入原文件中
                    #删除的方式,是把原数据提取出来,比较不同的id重新存入原文件,相同的信息不存入原文件,达到删除效果。
                    for item in stu_temp_old:
                        print('直接导入列表中的字典item',item)
                        d = dict(eval(item)) #字典还原
                        #?为什么要写wfile.write(......),不太理解
                        if d['id'] != stu_id:
                            wfile.write(str(d)+'\n') #如果提取信息不是要删除的信息,重新保存回本地硬盘内

                        else:
                            flag = True
                    if flag:
                        print(f'ID为{stu_id}的学生信息已删除')
                    else:
                        print(f'ID为{stu_id}的学生没有找到')
            else:
                print('无该学生信息')
                break
            Show()
            answer = input('是否继续删除?y/n\n')
            if answer.lower()=='y':
                continue
            else:
                break

def Search():
    student_query = []
    while True:
        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()
        with open(filename, 'r', encoding='utf-8') as rfile:
            student = rfile.readlines()
            for item in student:
                d = dict(eval(item))
                if id != '':
                    if d['id'] == id: #比对输入的id和文件内的信息id,若相等则添加本条字典信息到空列表中
                        student_query.append(d)
                if name != '':
                    if d['name'] == name:
                        student_query.append(d)
        # 显示查询结果
        show_student(student_query)
        # 清空列表
        student_query.clear()
        answer = input('是否要继续查询?y/n :')
        if answer.lower() == 'y':
            continue
        else:
            break

def Modify():
    Show()
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as rfile:
            student_old = rfile.readlines()
    else:
        return
    student_id = input('请输入要修改的学员的ID:')
    if student_id != '':
        with open(filename, 'w', encoding='utf-8') as wfile:
            for item in student_old:
                d = dict(eval(item))
                if d['id'] == student_id:
                    print('找到该学生信息,可以修改他的相关信息了!')
                    try:
                        d['id'] = input('请输入新的ID:')
                        d['name'] = input('请输入姓名:')
                        d['chinese'] = int(input('请输入语文的成绩:'))
                        d['maths'] = int(input('请输入数学的成绩:'))
                        d['english'] = int(input('请输入英语的成绩:'))
                        d['physics'] = int(input('请输入物理的成绩:'))
                    except:
                        print('您的输入有误,请重新输入!!!')
                    wfile.write(str(d) + '\n')
                    print('修改成功!')
                else:
                    wfile.write(str(d) + '\n')
            answer = input('是否继续修改其他学生的信息?y/n:')
            if answer == 'y' or answer == 'Y':
                Modify()

def Sort():
    #定义一个全局变量,当Sort()函数结束时,保存变量的文字信息,供后面print()函数调用
    #调用Show()函数,显示源文件中的所有学生信息
    #利用os.path.exists()函数判断是否在本地硬盘存在源文件filename
    #若本地存在文件则以只读方式打开文件,同时读取信息到内存,保存到列表student_list中
    #建立一个空列表student_new,从内存的列表student_list遍历出每一带引号的字典项item
    #然后利用eval()函数,把item两边的引号去掉,还原成字典格式,并存入变量d中
    #然后利用append()函数把变量d中的字典数据添加到定义好的空列表student_new中
    #如果源文件中不存在学生成绩信息,则执行print()函数后,return退出
    #利用input函数,接收01字符,确定排序成绩的升降序方式,同时利用前面定义的全局变量asc_str接收字符
    #利用asc_or_desc_bool变量,接收True和False来实现参数设置,以完成sort()函数的升降序设置
    #然后对存入列表中的字典分别进行各科成绩进行排序,这里有2个知识点:sort()函数,lambda,现分别讲述
    #sort()函数,对全部字典数据,按其参数key=接收字典中键名为指定名称某学科,存入lambda中的x内
    # 利用int(x['chinese']),按照整数的形式进行成绩数据的排列,reverse=True/False进行升或降的排序
    # 利用if elif函数,进行每个学科的单独设置排序

    global asc_str
    Show()
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as rfile:
            student_list = rfile.readlines()
        student_new = []
        for item in student_list:
            d = dict(eval(item))
            student_new.append(d)
    else:
        print('文件中无学生信息')
        return
    asc_or_desc = input('请选择(0.升序 1.降序):')
    if asc_or_desc == '0':
        asc_str = '升'
        asc_or_desc_bool = False
    elif asc_or_desc == '1':
        asc_str = '降'
        asc_or_desc_bool = True
    else:
        Sort()
    mode = int(input('请选择排序方式(1.按语文排序 2.按数学排序 3.按英语排序 4.按物理排序 0.按总成绩排序):'))
    sub_num = ['总成绩','语文','数学','英语','物理']
    print('++++',student_new)
    if mode == 1:
        student_new.sort(key=lambda x: int(x['chinese']), reverse=asc_or_desc_bool)
    elif mode == 2:
        student_new.sort(key=lambda x: int(x['maths']), reverse=asc_or_desc_bool)
    elif mode == 3:
        student_new.sort(key=lambda x: int(x['english']), reverse=asc_or_desc_bool)
    elif mode == 4:
        student_new.sort(key=lambda x: int(x['physics']), reverse=asc_or_desc_bool)
    elif mode == 0:
        student_new.sort(key=lambda x: int(x['chinese']) + int(x['maths']) + int(x['english']) + int(x['physics']),
                         reverse=asc_or_desc_bool)
    else:
        Sort()
    show_student(student_new)
    print(f'\n本次排序是---{sub_num[mode]}成绩---进行({asc_str}序)排序\n')

def Total():
    pass #信息汇总
def Show():
    #思路分析
    # 定义一个空列表,判断文件内部是否含有数据,若有,就读取数据
    #把读取数据保存到变量students列表中
    #利用for in 对students列表中的字典进行提取,此处提取到的是带有字符属性的事引号的字典项item
    #处理item,去除其两侧的引号,还原字典数据信息,并把信息保存到空列表stu_lst中

    stu_lst = []
    if os.path.exists(filename):
        with open(filename,'r',encoding='utf-8')as rfile:
            students = rfile.readlines()
            #print(students)
            for item in students: #遍历列表中的字典'{...}'
                stu_lst.append(eval(item)) # 去除字典两边引号{},添加到列表stu_lst列表中

            if stu_lst:
                show_student(stu_lst)  #把处理好的列表信息文件,送入show_student()函数,显示
            else:
                print('暂未保存过数据!') #若硬盘的源文件中无数据,则显示print函数

def show_student(lst):
    #判断接收到的lst(形参)---对应上在的stu_lst含有字典的列表
    #使用Len()函数判断列表的长度是否为0,如果为零,输出print函数,并退出,如果不为零,则先定义一个格式:格式为居中,数字为总宽度,同时用分隔符分隔
    #使用print()函数把定义好的格式,用format函数和显示列表的表头连起来,显示在python中
    #for in 函数把列表中的字典依次从lst形参中取出来,同时利用字典中的item.get('键名')函数,取到对应的值value
    #
    if len(lst) == 0: #判断
        print('没有查询到学生信息!!!')
        return
    #定义标题显示格式
    format_title = '{:^6}\t{:^13}\t{:^10}\t{:^6}\t{:^10}\t{:^6}\t{:^7}' #定义显示表头格式
    print(format_title.format('ID','姓名','语文成绩','数学成绩','英语成绩','物理成绩','总成绩')) #按格式输出表头
    format_data = '{:^6}\t{:^13}\t{:^10}\t{:^18}\t{:^7}\t{:8}\t{:^17}' #定义数据格式
    for item in lst:
        print(
            format_data.format(item.get('id'),item.get('name'),item.get('chinese'),
                                 item.get('maths'),item.get('english'),item.get('physics'),
                                 int(item.get('chinese')) + int(item.get('maths')) + int(item.get('english'))+ int(item.get('physics'))
                                 )
        ) #按格式显示字典内各科成绩到python内部

if __name__=='__main__':
    Main()

显示字典数据解析:

理论分析:通过一组多列的数据字典,组建列表,建立一个格式变量,利用for in函数,从列表中取出字典,然后利用格式变量+format(获取字典内每个键的值),输出到python显示出来。

format函数

dict = [{'a':1,'b':4,'c':13,'d':8,'e':10,'f':19},
        {'a':3,'b':6,'c':12,'d':8,'e':6,'f':29},
        {'a':5,'b':9,'c':16,'d':8,'e':12,'f':49},
        {'a':7,'b':12,'c':18,'d':8,'e':15,'f':69}]

if __name__ == '__main__':
    while True:
        pxm = input('请输入按字母a,b,c,d,e,f排序')
        px = dict.sort(key=lambda x: int(x[pxm]), reverse=False)
        #题目格式 {:^6}\t
        format_topic = '{:^6}\t{:^6}\t{:^6}\t{:^6}\t{:^6}\t{:^6}'
        print(format_topic.format('a','b','c','d','e','f'))
        for con in dict:
            print(format_topic.format(
                con.get('a'),
                con.get('b'),
                con.get('c'),
                con.get('d'),
                con.get('e'),
                con.get('f')
            ))

显示字典数据解析:

对硬盘内文件进行加工并按关键字排序的流程

本文修版时间表

Original: https://blog.csdn.net/weixin_41704077/article/details/124155178
Author: 德天老师
Title: 学生成绩管理系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/670957/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球