Python打卡第十八天,跟着CSDN练习语法

# 控制台学生信息管理系统

目录

项目结构 

 代码思路

 实现界面展示

 功能菜单

 主函数

 1录入学生成绩信息

 将学生信息保存到文件中

 按行储存

2查找学生成绩信息 

 将保存在列表中的学生信息显示出来

简单介绍函数功能 

 3删除学生成绩信息

 4修改学生成绩信息

 5排序

 6统计学生总数

 7显示所有学生信息

 全部代码

 结果 

总结错误

错误示范

正确示范 

案例源代码



项目结构 

 代码思路

        还是原来的老套路,只不过这回程序步骤比较多,我边写边说。

因为这个案例要用到 正则表达式 操作系统 模块,所以我就先导入这两个模块了;

import re  # 导入正则表达式模块
import os  # 导入操作系统模块

首先,我先展示一下我想要实现的 控制学生信息操作系统 的实现界面: 

 实现界面展示 

如图,我们可以看出,最先展示的是功能菜单, 然后是 请选择 的手动输入,最后是展示功能。代码是从上而下执行的,所以,我必须先定义一个功能菜单的函数,然后再对菜单实现功能操作。

 功能菜单

# 定义功能菜单
def menu():
    # 显示菜单
    print('''
    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    ''')

 主函数

接下来,我们就要通过定义一个主菜单来实现具体的功能了; 

# 定义主函数
def main():
    ctrl = True  # 标记是否退出系统(哨兵变量)
    while ctrl:
        # 显示菜单
        menu()
        option = input("请选择您想要进行的操作:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ["0", "1", "2", "3", "4", "5", "6", "7"]:
            option_int = int(option_str)
            if option_int == 0:  # 退出程序
                print("您已成功退出学生信息管理系统!")
                ctrl = False  # 哨兵变量
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()

注:这里有一个 需要注意的地方,第5行的代码,我来简单介绍一下 re.sub() 的用法;

\D 表示的是非数字 re.sub("\D", "", option)  表示在option这个字符串里,把不是数字的都表示为“”;接下来,我们就根据这个主菜单来设计这个程序吧。

 1录入学生成绩信息

首先,是 录入学生成绩信息 ,所以定义一个 insert() 函数;写一个这样环环相套的程序,所以就要保证程序的严密性,刚开始写的时候,大家都没有这么严密的思维能力,第一次写一个 比较长的案例,我连有些代码的作用都不知道,所以,写这个案例的第一次,先搞清楚每一行代码的意思以及它的思路,然后用整体与部分的眼光来看这个案例,所有的问题就迎刃而解了。

# 1录入学生成绩
def insert():
    studentList = []  # 保存学生信息的列表
    mark = True  # 是否继续添加(哨兵变量,用起来很方便)
    while mark:
        id = input("请输入ID(如 1001):")
        if not 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": 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()函数
    save(studentList)
    print("学生信息录入完毕!!!")

在insert()录入学生的成绩信息,我们 录入信息 ,就要考虑到 保存信息 ,所以要定义一个保存学生信息的函数  save() 

 将学生信息保存到文件中

# 将学生信息保存到文件中
def save(student):
    try:
        # 以追加模式打开文件
        student_txt = open(filename, "a")
    except:
        # 文件不存在,创建文件并打开
        student_txt = open(filename, "w")
    for info in student:
        # 按行存储,添加换行符
        student_txt.write(str(info) + "\n")
    # 关闭文件
    student_txt.close()

 按行储存

按行存储示例如下: 

 

2查找学生成绩信息 

 接下来,实现 查找学生成绩信息 的功能;

# 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()  # 重新查询
            # 打开文件
            with open(filename, "r") as file:
                # 读取全部内容
                student = file.readlines()
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id != "":  # 判断是否按照ID查
                        if d["id"] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name != "":  # 判断是否按照姓名查
                        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

 将保存在列表中的学生信息显示出来

查询到数据,需要显示出来,所以需要定义一个显示查询信息的函数 show_student()  

# 将保存在列表中的学生信息显示出来
def show_student(studentList):
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \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)))

简单介绍函数功能 

简单的介绍一下 第6行代码 {:^6}的作用 以及 get() 函数, center() 函数;

 3删除学生成绩信息

3和1,2大同小异,3中调用了 show() 函数,后续会写到的

# 3删除学生成绩信息
def delete():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId != "":  # 判断要删除的学生是否存在
            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修改学生成绩信息

4和1,2,3都是大同小异,仍旧是用到了 show() 函数,后续会写到;

# 4修改学生成绩信息
def modify():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        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排序

5和前几个比较像,稍微不同的是有排序,倒序Ture,正序False 

# 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           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为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":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse = ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        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统计学生总数

# 6统计学生总数
def total():
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print(f"一共有{len(student_old)}名学生!")
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")

 7显示所有学生信息

 他来了 ,他终于来啦!show()函数终于来啦!

# 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("暂未保存数据信息...")

 全部代码

# 控制台学生信息管理系统

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("请选择您想要进行的操作:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ["0", "1", "2", "3", "4", "5", "6", "7"]:
            option_int = int(option_str)
            if option_int == 0:  # 退出程序
                print("您已成功退出学生信息管理系统!")
                ctrl = False  # 哨兵变量
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


# 1录入学生成绩
def insert():
    studentList = []  # 保存学生信息的列表
    mark = True  # 是否继续添加(哨兵变量,用起来很方便)
    while mark:
        id = input("请输入ID(如 1001):")
        if not 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": 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()函数
    save(studentList)
    print("学生信息录入完毕!!!")


# 将学生信息保存到文件中
def save(student):
    try:
        # 以追加模式打开文件
        student_txt = open(filename, "a")
    except:
        # 文件不存在,创建文件并打开
        student_txt = open(filename, "w")
    for info in student:
        # 按行存储,添加换行符
        student_txt.write(str(info) + "\n")
    # 关闭文件
    student_txt.close()


# 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()  # 重新查询
            # 打开文件
            with open(filename, "r") as file:
                # 读取全部内容
                student = file.readlines()
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id != "":  # 判断是否按照ID查
                        if d["id"] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name != "":  # 判断是否按照姓名查
                        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("(o@.@o) 无数据信息 (o@.@o) \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():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId != "":  # 判断要删除的学生是否存在
            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:
        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  # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True  # 标记变量,为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":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        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(f"一共有{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 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    
请选择您想要进行的操作:1'
请输入ID(如 1001):1007
请输入姓名:张艺兴
请输入英语成绩:99
请输入python成绩:98
请输入C语言成绩:100
是否继续添加?(y/n):n
学生信息录入完毕!!!

    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    
请选择您想要进行的操作:
{'id': '1007', 'name': 'zyx', 'english': 99, 'python': 99, 'c': 111}
{'id': '1007', 'name': '张艺兴', 'english': 99, 'python': 98, 'c': 100}

总结错误

最后,发现了一个致命的错误,我就不标注了,聪明人一定一眼就看出问题所在了。

错误示范

正确示范 

案例源代码

# 开发工具:PyCharm
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("请选择:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:  # 退出系统
                print('您已退出学生成绩管理系统!')
                ctrl = False
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


def insert():
    """1 录入学生信息"""
    stdentList = []        # 保存学生信息的列表
    mark = True  # 是否继续添加
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入名字:")
        if not name:  # 名字为空,跳出循环
            break
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入Python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值....重新录入信息")
            continue
        stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}  # 将输入的学生信息保存到字典
        stdentList.append(stdent)  # 将学生字典添加到列表中
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":  # 继续添加
            mark = True
        else:  # 不继续添加
            mark = False
    save(stdentList)  # 将学生信息保存到文件
    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()  # 关闭文件


def search():
    """2 查找学生成绩信息"""
    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()  # 重新查询
            with open(filename, 'r') as file:  # 打开文件
                student = file.readlines()  # 读取全部内容
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id is not "":  # 判断是否按ID查
                        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 delete():
    """3 删除学生成绩信息"""
    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  # 退出删除学生信息功能


def modify():
    """4 修改学生成绩信息"""
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        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()  # 重新执行修改操作


def sort():
    """5 排序"""
    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           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为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":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        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)  # 显示排序结果


def total():
    """6 统计学生总数"""
    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("暂未保存数据信息...")


def show():
    """7 显示所有学生信息"""
    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("暂未保存数据信息...")


def show_student(studentList):
    """将保存在列表中的学生信息显示出来"""
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \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)))


if __name__ == "__main__":
    main()

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值