law.liu 发表于 2023-6-6 16:26

学生信息管理系统

本帖最后由 law.liu 于 2023-6-7 12:37 编辑

2018年义务帮女朋友开发的学生信息管理系统一个学生信息管理系统,包括录入学生信息、查找学生信息、删除学生信息、修改学生信息、排序学生信息、统计学生总数和显示所有学生信息等功能,最近帮朋友写的一个项目,有需要的朋友拿走。

开发环境要求本系统的软件开发及运行环境具体如下。ü 操作系统:Windows 10。ü Python版本:Python 3.7.0。ü 开发工具:Python IDLE。ü Python内置模块:os、re。
# _*_ coding:utf-8   _*_
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():
    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()# 关闭文件


'''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 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


'''3 删除学生成绩信息'''


def delete():
    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# 退出删除学生信息功能


'''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("一共有 %d 名学生!" % 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("暂未保存数据信息...")


# 将保存在列表中的学生信息显示出来
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()

牧马小太爷 发表于 2023-6-6 17:22

你觉得我能搞懂你的代码?你太看得起我了。

1e3e 发表于 2023-6-6 18:34

    │说明:通过数字或↑↓方向键选择菜单          │
    ╚———————————————————————╝
   
请选择:D:/Program Files/Pycharm_professional_2019.3.3_Portable/bin/Pycharm/config/scratches/scratch_105.py:120: SyntaxWarning: "is not" with a literal. Did you mean "!="?
if id is not "":# 判断是否按ID查
D:/Program Files/Pycharm_professional_2019.3.3_Portable/bin/Pycharm/config/scratches/scratch_105.py:123: SyntaxWarning: "is not" with a literal. Did you mean "!="?
elif name is not "":# 判断是否按姓名查
D:/Program Files/Pycharm_professional_2019.3.3_Portable/bin/Pycharm/config/scratches/scratch_105.py:145: SyntaxWarning: "is not" with a literal. Did you mean "!="?
if studentId is not "":# 判断要删除的学生是否存在

cxx0515 发表于 2023-6-6 17:22

感谢分享,学习了

emin199 发表于 2023-6-6 17:30

学习一下!

狂笑一君 发表于 2023-6-6 17:30

牧马小太爷 发表于 2023-6-6 17:22
你觉得我能搞懂你的代码?你太看得起我了。

基本上每行都有注释了,这样的代码已经是很容易阅读的了

shubiao05 发表于 2023-6-6 17:35

测试节一下,相当棒!谢谢楼主分享!

smallmouse228 发表于 2023-6-6 17:39

会写程序的都是牛人!!!

zhangsan2022 发表于 2023-6-6 17:47

都是牛人!!!

wyw6813 发表于 2023-6-6 18:05

没有界面好像回到了几十年前,使用不便,输入几百个学生的成绩手都要累死了。。。。。

blindcat 发表于 2023-6-6 18:20

感谢分享,学习一下
页: [1] 2 3 4 5 6 7
查看完整版本: 学生信息管理系统