当前位置:   article > 正文

Python课程设计 | 实现学生信息管理系统_python学生信息管理系统

python学生信息管理系统

本文介绍了一个简单的学生信息管理系统,包括管理员登录、重置学生密码、添加、删除和修改学生信息、查询学生信息以及对学生成绩进行排序等功能。该系统使用Python编写,基于控制台交互

实现思路

该系统分为两个部分,管理员登录和学生信息管理。在管理员登录时,程序会要求用户输入用户名和密码进行身份验证;验证通过后,进入到学生信息管理界面。学生信息管理界面提供了多种操作方式,包括重置学生密码、添加、删除和修改学生信息、查询学生信息以及对学生成绩进行排序等功能。

在实现过程中,我们使用了文件存储学生信息,其中每一行代表一个学生的信息,各字段之间以逗号分隔。在对学生成绩进行排序时,我们计算每个学生的平均分,并将其作为排序依据。

代码实现

登录界面

# 登录界面
def login():
    print("欢迎使用学生信息管理系统") # 打印欢迎信息
    while True: # 一直循环直到输入正确的角色类型
        role = input("请输入登录角色(1-学生,2-管理员):") # 输入角色类型
        if role == '1': # 如果输入是学生
            student_login() # 转到学生登录函数
            break # 结束循环
        elif role == '2': # 如果输入是管理员
            admin_login() # 转到管理员登录函数
            break # 结束循环
        else:
            print("输入有误,请重新输入") # 提示输入错误,重新输入

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
执行效果

请添加图片描述

学生登录

# 学生登录
def student_login():
    while True: # 一直循环直到输入正确的账号和密码
        account = input("请输入账号:") # 输入账号
        password = input("请输入密码:") # 输入密码
        with open('xs.txt', 'r', encoding='utf-8') as f: # 打开存放学生信息的文件
            for line in f: # 遍历所有行
                data = line.strip().split() # 分隔每行数据
                姓名 = data[0].split(':')[1].strip() # 获取姓名
                学号 = data[1].split(':')[1].strip() # 获取学号
                账号 = data[2].split(':')[1].strip() # 获取账号
                密码 = data[3].split(':')[1].strip() # 获取密码
                if 账号 == account and 密码 == password: # 如果账号和密码匹配
                    print(f"欢迎登陆,{姓名}同学!") # 打印欢迎信息
                    student_menu(account) # 转到学生菜单函数
                    return # 结束函数
            print("账号或密码错误,请重新输入") # 提示输入错误,重新输入


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
执行效果

请添加图片描述

学生菜单

# 学生菜单
def student_menu(account):
    while True: # 一直循环直到选择退出系统或者退回登录界面
        print("""
        ================
            1. 查看所有学生信息
            2. 查询个人信息
            3. 退回登录界面
            0. 退出系统
        ================
        """) # 打印菜单
        choice = input("请输入您的选择:") # 输入选项
        if choice == "1": # 如果输入为 1
            show_all_students() # 转到显示所有学生信息函数
        elif choice == "2": # 如果输入为 2
            show_student_info() # 转到显示个人信息函数
        elif choice == "3": # 如果输入为 3
            login() # 返回登陆
        elif choice == "0": # 如果输入为 0
            print("感谢使用本系统,再见!") # 打印欢送信息
            exit() # 退出程序
        else:
            print("输入有误,请重新输入!") # 提示输入错误,重新输入

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
执行效果

请添加图片描述

展示所有学生信息

# 展示所有学生信息
def show_all_students():
    with open('xinxi.txt', 'r',encoding='utf-8') as f: # 打开存放学生信息的文件
        lines = f.readlines() # 读取所有行
        if len(lines) == 0: # 如果文件为空
            print("暂无学生信息") # 打印提示信息
            return # 结束函数
        header = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format("姓  名", "班   级", "学  号", "Linux", "Python", "C语言", "C++语言", "Java语言", "平均分") # 定义表头格式
        print(header) # 打印表头
        for line in lines: # 遍历每一行数据
            info = line.strip().split(',') # 分隔每行数据
            student_info = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format(info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8]) # 格式化学生信息
            print(student_info) # 打印学生信息

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
执行效果

请添加图片描述

查询单个学生的学生信息

# 查询单个学生的学生信息
def show_student_info():
    student_id = input("请输入要查询的学号:") # 输入学号
    with open('xinxi.txt', 'r', encoding='utf-8') as f: # 打开存放学生信息的文件
        found = False # 判断是否找到该学生信息
        for line in f: # 遍历每一行数据
            info = line.strip().split(',') # 分隔每行数据
            if info[2] == student_id: # 如果该行数据中的学号和输入的学号相同
                print(f"姓名:{info[0]}") # 打印姓名
                print(f"班级:{info[1]}") # 打印班级
                print(f"学号:{info[2]}") # 打印学号
                print(f"Linux成绩:{info[3]}") # 打印 Linux 成绩
                print(f"Python成绩:{info[4]}") # 打印 Python 成绩
                print(f"C语言成绩:{info[5]}") # 打印 C 语言成绩
                print(f"C++语言成绩:{info[6]}") # 打印 C++ 语言成绩
                print(f"Java语言成绩:{info[7]}") # 打印 Java 语言成绩
                print(f"平均分:{info[8]}") # 打印平均分
                found = True # 标记为找到
                break # 结束循环
        if not found: # 如果未找到该学生信息
            print("未找到该学号的学生信息") # 提示未找到


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
执行效果

请添加图片描述

管理员登录

# 管理员登录
def admin_login():
    while True: # 一直循环直到输入正确的账号和密码或手动退出
        account = input("请输入账号:") # 输入账号
        password = input("请输入密码:") # 输入密码
        try:
            with open('gly.txt', 'r', encoding='utf-8') as f: # 打开存放管理员信息的文件
                for line in f: # 遍历每一行数据
                    info = line.strip().split(' ') # 分隔每行数据
                    if len(info) != 4: # 如果分割后的数据不是 4 项(即格式不正确)
                        continue # 跳过本次循环
                    # 根据文件内容里的冒号进行处理
                    name = info[0].split(':')[1] # 获取姓名
                    num = info[1].split(':')[1] # 获取工号
                    acc = info[2].split(':')[1] # 获取账号
                    pwd = info[3].split(':')[1] # 获取密码
                    if acc == account and pwd == password: # 如果账号和密码匹配
                        print(f"欢迎登陆,{name}管理员!") # 打印欢迎信息
                        admin_menu() # 转到管理员菜单函数
                        return # 结束函数
                print("账号或密码错误,请重新输入") # 提示输入错误,重新输入
        except IOError: # 捕获文件打开异常
            print("无法打开文件,请检查文件路径和权限") # 提示无法打开文件
            return # 结束函数
        except Exception as e: # 捕获其他异常
            print(f"发生错误:{str(e)}") # 打印错误信息
            return # 结束函数

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
执行效果

请添加图片描述

管理员菜单

# 管理员菜单
def admin_menu():
    while True: # 一直循环直到选择退出程序
        choice = input(
            "请选择操作(1-重置学生账号密码,2-添加学生信息,3-删除学生信息,4-修改学生信息,5-查询学生信息,6-学生成绩排序,0-退出):") # 打印管理员操作菜单,输入选项
        if choice == '1': # 如果选择 1
            reset_password() # 转到重置学生账号密码函数
        elif choice == '2': # 如果选择 2
            add_student() # 转到添加学生信息函数
        elif choice == '3': # 如果选择 3
            delete_student() # 转到删除学生信息函数
        elif choice == '4': # 如果选择 4
            modify_student() # 转到修改学生信息函数
        elif choice == '5': # 如果选择 5
            search_student() # 转到查询学生信息函数
        elif choice == '6': # 如果选择 6
            sort_students() # 转到学生成绩排序函数
        elif choice == '0': # 如果选择 0
            break # 退出循环
        else:
            print("输入有误,请重新输入") # 提示输入错误,重新输入


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
执行效果

请添加图片描述

重置学生账号密码

# 重置学生账号密码
def reset_password():
    choice = input("请选择操作(1-修改密码,2-删除账号,3-添加账号):") # 打印选项菜单,输入选择
    if choice == '1': # 如果选择 1
        student_id = input("请输入要修改密码的学号:") # 输入要修改密码的学号
        with open('xs.txt', 'r', encoding='utf-8-sig') as f: # 打开存放学生信息的文件
            lines = f.readlines() # 读取所有行数据
            for i in range(len(lines)): # 遍历每一行数据
                line = lines[i].strip() # 去除首尾空格
                info = line.split() # 分隔每行数据
                if len(info) != 4: # 如果分割后的数据不是 4 项(即格式不正确)
                    continue # 跳过本次循环
                name = info[0][3:] # 获取姓名
                sid = info[1][3:] # 获取学号
                account = info[2][3:] # 获取账号
                password = info[3][3:] # 获取密码
                if sid == student_id: # 如果学号匹配
                    print(f"姓名:{name},学号:{sid},账号:{account},密码:{password}") # 打印该学生信息
                    new_password = input("请输入新密码:") # 输入新密码
                    # 修改密码
                    lines[i] = f"姓名:{name} 学号:{sid} 账号:{account} 密码:{new_password}\n"
                    with open('xs.txt', 'w', encoding='utf-8-sig') as f:
                        f.writelines(lines)
                    print("密码修改成功") # 提示密码修改成功
                    break # 结束循环
            else: # 如果未找到该学生信息
                print("未找到该学号的学生信息") # 提示未找到
    elif choice == '2': # 如果选择 2
        student_id = input("请输入要删除账号的学号:") # 输入要删除账号的学号
        with open('xs.txt', 'r', encoding='utf-8-sig') as f: # 打开存放学生信息的文件
            lines = f.readlines() # 读取所有行数据
            for i in range(len(lines)): # 遍历每一行数据
                line = lines[i].strip() # 去除首尾空格
                info = line.split() # 分隔每行数据
                if len(info) != 4: # 如果分割后的数据不是 4 项(即格式不正确)
                    continue # 跳过本次循环
                name = info[0][3:] # 获取姓名
                sid = info[1][3:] # 获取学号
                account = info[2][3:] # 获取账号
                password = info[3][3:] # 获取密码
                if sid == student_id: # 如果学号匹配
                    print(f"姓名:{name},学号:{sid},账号:{account},密码:{password}") # 打印该学生信息
                    # 删除账号
                    del lines[i] # 删除该行数据
                    with open('xs.txt', 'w', encoding='utf-8-sig') as f:
                        f.writelines(lines)
                    print("账号删除成功") # 提示账号删除成功
                    break # 结束循环
            else: # 如果未找到该学生信息
                print("未找到该学号的学生信息") # 提示未找到
    elif choice == '3': # 如果选择 3
        new_sid = input("请输入新的学号:") # 输入新学号
        new_name = input("请输入姓名:") # 输入姓名
        new_account = input("请输入账号:") # 输入账号
        new_password = input("请输入密码:") # 输入密码
        new_line = f"姓名:{new_name} 学号:{new_sid} 账号:{new_account} 密码:{new_password}\\n"
        with open('xs.txt', 'a', encoding='utf-8-sig') as f: # 打开存放学生信息的文件
            f.write(new_line) # 写入新行数据
        print("账号添加成功") # 提示账号添加成功
    else:
        print("输入有误,请重新选择") # 提示选择错误,重新选择操作



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
执行效果

请添加图片描述

添加学生信息

# 添加学生信息
def add_student():
    # 要求用户输入学生信息(姓名,班级,学号,Linux成绩,Python成绩,C语言成绩,C++语言成绩,Java语言成绩)
    student_info = input("请输入学生信息(姓名,班级,学号,Linux成绩,Python成绩,C语言成绩,C++语言成绩,Java语言成绩):")
    info_list = student_info.split(',') # 将输入的信息按逗号分隔开
    if len(info_list) < 8: # 如果信息项不足8项(即输入不完整)
        print("输入的信息不完整,请重新输入!") # 提示信息不完整
        return
    name, cls, id, linux, python, c, cpp, java = info_list[:8] # 获取各个信息项
    total_score = (int(linux) + int(python) + int(c) + int(cpp) + int(java)) / 5 # 计算平均分
    student_info = f"{name},{cls},{id},{linux},{python},{c},{cpp},{java}" # 构造要写入文件的字符串
    with open('xinxi.txt', 'a', encoding='utf-8') as f: # 打开存放学生信息的文件(以追加方式)
        f.write(f"{student_info},{total_score}\n") # 将学生信息和平均分写入文件
    print(f"学生信息添加成功,平均分为{total_score},平均分已自动填充") # 输出添加成功提示信息


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
执行效果

请添加图片描述

删除学生信息

# 删除学生信息
def delete_student():
    student_id = input("请输入要删除信息的学号:")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for i in range(len(lines)):
            info = lines[i].strip().split(",")
            if info[2] == student_id:
                del lines[i]
                with open('xinxi.txt', 'w', encoding='utf-8') as f:
                    f.writelines(lines)
                print("学生信息删除成功")
                break
        else:
            print("未找到该学号的学生信息")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
执行效果

请添加图片描述

修改学生信息

# 修改学生信息
def modify_student():
    # 输入要修改信息的学号
    student_id = input("请输入要修改信息的学号:")
    # 打开文件并读取所有行
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        # 循环遍历每一行
        for i in range(len(lines)):
            # 分割数据并赋值给变量
            data = lines[i].strip().split(',')
            学生姓名 = data[0]
            班级 = data[1]
            学号 = data[2]
            Linux成绩 = int(data[3])
            Python成绩 = int(data[4])
            C语言成绩 = int(data[5])
            Cpp语言成绩 = int(data[6])
            Java语言成绩 = int(data[7])
            平均分 = float(data[8])
            # 如果学号匹配成功,则进入修改流程
            if 学号 == student_id:
                # 输入新的学生信息
                new_info_str = input(
                    "请按照格式输入新的学生信息(姓名,班级,学号,Linux成绩,Python成绩,C语言成绩,C++语言成绩,Java语言成绩):")
                # 分割新的学生信息并赋值给变量
                new_info = new_info_str.strip().split(',')
                new_学生姓名 = new_info[0]
                new_班级 = new_info[1]
                new_学号 = new_info[2]
                new_Linux成绩 = int(new_info[3])
                new_Python成绩 = int(new_info[4])
                new_C语言成绩 = int(new_info[5])
                new_Cpp语言成绩 = int(new_info[6])
                new_Java语言成绩 = int(new_info[7])
                # 计算新的平均分
                new_平均分 = (new_Linux成绩 + new_Python成绩 + new_C语言成绩 + new_Cpp语言成绩 + new_Java语言成绩) / 5
                # 生成新的一行数据并替换旧的数据
                lines[i] = f"{new_学生姓名},{new_班级},{new_学号},{new_Linux成绩},{new_Python成绩},{new_C语言成绩},{new_Cpp语言成绩},{new_Java语言成绩},{new_平均分}\n"
                # 打开文件并写入新的所有行
                with open('xinxi.txt', 'w', encoding='utf-8') as f:
                    f.writelines(lines)
                # 输出成功信息并结束函数
                print("学生信息修改成功")
                break
        else:
            # 如果未找到该学号的学生信息,则输出失败信息
            print("未找到该学号的学生信息")


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
执行效果

请添加图片描述

查询学生信息

# 查询学生信息
def search_student():
    # 输入要查询信息的学号
    student_id = input("请输入要查询信息的学号:")
    # 打开文件并逐行读取
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        for line in f:
            # 分割数据并赋值给变量
            data = line.strip().split(',')
            学生姓名 = data[0]
            班级 = data[1]
            学号 = data[2]
            Linux成绩 = data[3]
            Python成绩 = data[4]
            C语言成绩 = data[5]
            Cpp语言成绩 = data[6]
            Java语言成绩 = data[7]
            平均分 = data[8]
            # 如果学号匹配成功,则输出学生信息并结束函数
            if 学号 == student_id:
                print(f"姓名:{学生姓名}")
                print(f"班级:{班级}")
                print(f"学号:{学号}")
                print(f"Linux成绩:{Linux成绩}")
                print(f"Python成绩:{Python成绩}")
                print(f"C语言成绩:{C语言成绩}")
                print(f"C++语言成绩:{Cpp语言成绩}")
                print(f"Java语言成绩:{Java语言成绩}")
                print(f"平均分:{平均分}")
                break
        else:
            # 如果未找到该学号的学生信息,则输出失败信息
            print("未找到该学号的学生信息")


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
执行效果

请添加图片描述

学生成绩排序

# 学生成绩排序
def sort_students():
    # 循环直到用户输入正确选项为止
    while True:
        choice = input("请选择排序方式(1-升序,2-降序):")
        if choice == '1':
            reverse = False
            break
        elif choice == '2':
            reverse = True
            break
        else:
            print("输入有误,请重新选择")
    # 打开文件并读取所有行
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        students = []
        # 循环遍历每一行数据,并将其转化为元组类型加入到 students 列表中
        for line in lines:
            info = line.strip().split(',')
            score_sum = sum(map(float, info[3:]))
            students.append((info[0], info[1], info[2], *info[3:], score_sum))
        # 对 students 列表进行排序
        students.sort(key=lambda x: x[-1], reverse=reverse)
        # 输出表格标题
        print("排序结果如下:")
        print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
              "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
        print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
            "姓名", "班级", "学号", "Linux", "Python", "C语言", "C++语言", "Java语言", "平均分"))
        print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
              "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
        # 循环遍历每一个排序后的学生信息,并输出到控制台上
        for student in students:
            print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
                student[0], student[1], student[2], student[3], student[4], student[5], student[6], student[7], student[8]))
            print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
                  "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
执行效果

请添加图片描述

主函数

# 主函数
if __name__ == '__main__':
    # 调用登录函数
    login()

  • 1
  • 2
  • 3
  • 4
  • 5

程序设计分析

功能模块划分

该学生成绩管理系统主要包含以下功能模块:

  1. 学生信息添加模块;
  2. 学生信息删除模块;
  3. 学生信息修改模块;
  4. 学生信息查询模块;
  5. 学生成绩排序模块;
  6. 学生账号管理模块;
  7. 管理员登录模块;
  8. 管理员操作权限管理模块;
  9. 管理员账号管理模块。

因此,我们可以将整个程序分为九个部分,分别实现以上九个功能模块。

数据存储方式

在该项目中,我们采用文本文件的方式存储学生信息、账号信息和管理员信息。具体地,我们将学生信息存储在名为的文件中,每行表示一个学生的信息,包括学生姓名、班级名称、学号以及五门课程的成绩;将账号信息存储在名为的文件中,每行表示一个学生的账号信息,包括学生姓名、学号、账号以及密码;将管理员信息存储在名为的文件中,每行表示一个管理员的账号信息,包括管理员账号和密码。这种方式简单方便,易于实现和维护。xinxi.txt xs.txt gly.txt

程序流程设计

该项目的程序流程如下所示:

  1. 打印出菜单,让用户选择要执行的操作;
  2. 如果用户选择管理员登录操作,则执行管理员登录模块,要求用户输入管理员账号和密码并与存储在名为的文件中的信息进行比对;如果比对成功,则可以进行管理员操作权限管理和管理员账号管理;gly.txt
  3. 根据用户的选择,调用相应的函数实现对应的功能;
  4. 用户可以反复执行操作,直到选择退出程序为止。

具体的函数实现和结构设计将在下一节中进行介绍。

总结

本项目是一个简单的学生成绩管理系统,通过对该项目的分析和实现,我们可以掌握Python语言基本的文件处理技巧、字符串操作技巧、异常处理技巧等;同时也加深了我们对面向过程编程思想的理解和应用能力。在未来的开发工作中,这些技能和经验都将非常有用。

完整代码


# 登录界面
def login():
    print("欢迎使用学生信息管理系统")
    while True:
        role = input("请输入登录角色(1-学生,2-管理员):")
        if role == '1':
            student_login()
            break
        elif role == '2':
            admin_login()
            break
        else:
            print("输入有误,请重新输入")


# 学生登录
def student_login():
    while True:
        account = input("请输入账号:")
        password = input("请输入密码:")
        with open('xs.txt', 'r', encoding='utf-8') as f:
            for line in f:
                data = line.strip().split()
                姓名 = data[0].split(':')[1].strip()
                学号 = data[1].split(':')[1].strip()
                账号 = data[2].split(':')[1].strip()
                密码 = data[3].split(':')[1].strip()
                if 账号 == account and 密码 == password:
                    print(f"欢迎登陆,{姓名}同学!")
                    student_menu(account)
                    return
            print("账号或密码错误,请重新输入")




# 学生菜单
def student_menu(account):
    while True:
        print("""
        ================
            1. 查看所有学生信息
            2. 查询个人信息
            3. 退回登录界面
            0. 退出系统
        ================
        """)
        choice = input("请输入您的选择:")
        if choice == "1":
            show_all_students()
        elif choice == "2":
            show_student_info()
        elif choice == "3":
            return
        elif choice == "0":
            print("感谢使用本系统,再见!")
            exit()
        else:
            print("输入有误,请重新输入!")



# 展示所有学生信息
def show_all_students():
    with open('xinxi.txt', 'r',encoding='utf-8') as f:
        lines = f.readlines()
        if len(lines) == 0:
            print("暂无学生信息")
            return
        header = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format("姓  名", "班   级", "学  号", "Linux", "Python", "C语言", "C++语言", "Java语言", "平均分")
        print(header)
        for line in lines:
            info = line.strip().split(',')
            student_info = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format(info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8])
            print(student_info)



# 查询单个学生的学生信息
def show_student_info():
    student_id = input("请输入要查询的学号:")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        found = False
        for line in f:
            info = line.strip().split(',')
            if info[2] == student_id:
                print(f"姓名:{info[0]}")
                print(f"班级:{info[1]}")
                print(f"学号:{info[2]}")
                print(f"Linux成绩:{info[3]}")
                print(f"Python成绩:{info[4]}")
                print(f"C语言成绩:{info[5]}")
                print(f"C++语言成绩:{info[6]}")
                print(f"Java语言成绩:{info[7]}")
                print(f"平均分:{info[8]}")
                found = True
                break

        if not found:
            print("未找到该学号的学生信息")



# 管理员登录
def admin_login():
    while True:
        account = input("请输入账号:")
        password = input("请输入密码:")
        try:
            with open('gly.txt', 'r', encoding='utf-8') as f:
                for line in f:
                    info = line.strip().split(' ')
                    if len(info) != 4:
                        continue
                    # 根据文件内容里的冒号进行处理
                    name = info[0].split(':')[1]
                    num = info[1].split(':')[1]
                    acc = info[2].split(':')[1]
                    pwd = info[3].split(':')[1]
                    if acc == account and pwd == password:
                        print(f"欢迎登陆,{name}管理员!")
                        admin_menu()
                        return
                print("账号或密码错误,请重新输入")
        except IOError:
            print("无法打开文件,请检查文件路径和权限")
            return
        except Exception as e:
            print(f"发生错误:{str(e)}")
            return




# 管理员菜单
def admin_menu():
    while True:
        choice = input(
            "请选择操作(1-重置学生账号密码,2-添加学生信息,3-删除学生信息,4-修改学生信息,5-查询学生信息,6-学生成绩排序,0-退出):")
        if choice == '1':
            reset_password()
        elif choice == '2':
            add_student()
        elif choice == '3':
            delete_student()
        elif choice == '4':
            modify_student()
        elif choice == '5':
            search_student()
        elif choice == '6':
            sort_students()
        elif choice == '0':
            break
        else:
            print("输入有误,请重新输入")


# 重置学生账号密码
def reset_password():
    choice = input("请选择操作(1-修改密码,2-删除账号,3-添加账号):")
    if choice == '1':
        student_id = input("请输入要修改密码的学号:")
        with open('xs.txt', 'r', encoding='utf-8-sig') as f:
            lines = f.readlines()
            for i in range(len(lines)):
                line = lines[i].strip()
                info = line.split()
                if len(info) != 4:
                    continue
                name = info[0][3:] # 姓名
                sid = info[1][3:] # 学号
                account = info[2][3:] # 账号
                password = info[3][3:] # 密码
                if sid == student_id:
                    print(f"姓名:{name},学号:{sid},账号:{account},密码:{password}")
                    new_password = input("请输入新密码:")
                    # 修改密码
                    lines[i] = f"姓名:{name} 学号:{sid} 账号:{account} 密码:{new_password}\n"
                    with open('xs.txt', 'w', encoding='utf-8-sig') as f:
                        f.writelines(lines)
                    print("密码修改成功")
                    break
            else:
                print("未找到该学号的学生信息")
    elif choice == '2':
        student_id = input("请输入要删除账号的学号:")
        with open('xs.txt', 'r', encoding='utf-8-sig') as f:
            lines = f.readlines()
            for i in range(len(lines)):
                line = lines[i].strip()
                info = line.split()
                if len(info) != 4:
                    continue
                name = info[0][3:] # 姓名
                sid = info[1][3:] # 学号
                account = info[2][3:] # 账号
                password = info[3][3:] # 密码
                if sid == student_id:
                    print(f"姓名:{name},学号:{sid},账号:{account},密码:{password}")
                    # 删除账号
                    del lines[i]
                    with open('xs.txt', 'w', encoding='utf-8-sig') as f:
                        f.writelines(lines)
                    print("账号删除成功")
                    break
            else:
                print("未找到该学号的学生信息")
    elif choice == '3':
        new_sid = input("请输入新的学号:")
        new_name = input("请输入姓名:")
        new_account = input("请输入账号:")
        new_password = input("请输入密码:")
        new_line = f"姓名:{new_name} 学号:{new_sid} 账号:{new_account} 密码:{new_password}\n"
        with open('xs.txt', 'a', encoding='utf-8-sig') as f:
            f.write(new_line)
        print("账号添加成功")
    else:
        print("输入有误,请重新选择")




# 添加学生信息
def add_student():
    student_info = input("请输入学生信息(姓名,班级,学号,Linux成绩,Python成绩,C语言成绩,C++语言成绩,Java语言成绩):")
    info_list = student_info.split(',')
    if len(info_list) < 8:
        print("输入的信息不完整,请重新输入!")
        return
    name, cls, id, linux, python, c, cpp, java = info_list[:8]
    total_score = (int(linux) + int(python) + int(c) + int(cpp) + int(java)) / 5
    student_info = f"{name},{cls},{id},{linux},{python},{c},{cpp},{java}"
    with open('xinxi.txt', 'a', encoding='utf-8') as f:
        f.write(f"{student_info},{total_score}\n")
    print(f"学生信息添加成功,平均分为{total_score},平均分已自动填充")



# 删除学生信息
def delete_student():
    student_id = input("请输入要删除信息的学号:")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for i in range(len(lines)):
            info = lines[i].strip().split(",")
            if info[2] == student_id:
                del lines[i]
                with open('xinxi.txt', 'w', encoding='utf-8') as f:
                    f.writelines(lines)
                print("学生信息删除成功")
                break
        else:
            print("未找到该学号的学生信息")


# 修改学生信息
def modify_student():
    student_id = input("请输入要修改信息的学号:")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for i in range(len(lines)):
            data = lines[i].strip().split(',')
            学生姓名 = data[0]
            班级 = data[1]
            学号 = data[2]
            Linux成绩 = int(data[3])
            Python成绩 = int(data[4])
            C语言成绩 = int(data[5])
            Cpp语言成绩 = int(data[6])
            Java语言成绩 = int(data[7])
            平均分 = float(data[8])
            if 学号 == student_id:
                new_info_str = input(
                    "请按照格式输入新的学生信息(姓名,班级,学号,Linux成绩,Python成绩,C语言成绩,C++语言成绩,Java语言成绩):")
                new_info = new_info_str.strip().split(',')
                new_学生姓名 = new_info[0]
                new_班级 = new_info[1]
                new_学号 = new_info[2]
                new_Linux成绩 = int(new_info[3])
                new_Python成绩 = int(new_info[4])
                new_C语言成绩 = int(new_info[5])
                new_Cpp语言成绩 = int(new_info[6])
                new_Java语言成绩 = int(new_info[7])
                new_平均分 = (new_Linux成绩 + new_Python成绩 + new_C语言成绩 + new_Cpp语言成绩 + new_Java语言成绩) / 5
                lines[i] = f"{new_学生姓名},{new_班级},{new_学号},{new_Linux成绩},{new_Python成绩},{new_C语言成绩},{new_Cpp语言成绩},{new_Java语言成绩},{new_平均分}\n"
                with open('xinxi.txt', 'w', encoding='utf-8') as f:
                    f.writelines(lines)
                print("学生信息修改成功")
                break
        else:
            print("未找到该学号的学生信息")




# 查询学生信息
def search_student():
    student_id = input("请输入要查询信息的学号:")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        for line in f:
            data = line.strip().split(',')
            学生姓名 = data[0]
            班级 = data[1]
            学号 = data[2]
            Linux成绩 = data[3]
            Python成绩 = data[4]
            C语言成绩 = data[5]
            Cpp语言成绩 = data[6]
            Java语言成绩 = data[7]
            平均分 = data[8]
            if 学号 == student_id:
                print(f"姓名:{学生姓名}")
                print(f"班级:{班级}")
                print(f"学号:{学号}")
                print(f"Linux成绩:{Linux成绩}")
                print(f"Python成绩:{Python成绩}")
                print(f"C语言成绩:{C语言成绩}")
                print(f"C++语言成绩:{Cpp语言成绩}")
                print(f"Java语言成绩:{Java语言成绩}")
                print(f"平均分:{平均分}")
                break
        else:
            print("未找到该学号的学生信息")




# 学生成绩排序
def sort_students():
    while True:
        choice = input("请选择排序方式(1-升序,2-降序):")
        if choice == '1':
            reverse = False
            break
        elif choice == '2':
            reverse = True
            break
        else:
            print("输入有误,请重新选择")
    with open('xinxi.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        students = []
        for line in lines:
            info = line.strip().split(',')
            score_sum = sum(map(float, info[3:]))
            students.append((info[0], info[1], info[2], *info[3:], score_sum))
        students.sort(key=lambda x: x[-1], reverse=reverse)
        print("排序结果如下:")
        print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
              "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
        print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
            "姓名", "班级", "学号", "Linux", "Python", "C语言", "C++语言", "Java语言", "平均分"))
        print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
              "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
        for student in students:
            print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
                student[0], student[1], student[2], student[3], student[4], student[5], student[6], student[7], student[8]))
            print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
                  "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")


# 主函数
if __name__ == '__main__':
    login()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366

好了,今天的分享就到这里!如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份Python全套学习资料,里面的内容都是适合零基础小白的笔记和资料,超多实战案例,不懂编程也能听懂、看懂。

需要的话可以微信扫描下方二维码免费获得。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述
二、Python学习软件

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述
三、Python入门学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述
四、Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述
五、Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述
六、副业兼职
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
七、资料领取
由于篇幅有限,很多资料图片放不上来。需要的小伙伴可以微信扫描下方CSDN官方认证二维码领取(免费免费免费)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/170277
推荐阅读
相关标签
  

闽ICP备14008679号