Python实战项目--学生成绩管理系统
一、项目要求
1、程序启动,显示名片管理系统欢迎界面,并显示功能菜单
**************************************************** 欢迎使用【学生信息管理系统】V1.0 请选择你想要进行的操作 1. 新建学生信息 2. 显示全部信息 3. 查询学生信息 4. 删除学生信息 5. 修改学生信息0. 退出系统 **************************************************"""
2、用户用数字选择 不同的功能
3、根据功能选择,执行不同的功能
4、需要记录学生的 姓名、语文成绩、数学成绩、英语成绩 、总分
5、 如果查新到指定的学生信息,用户可以选择 修改 或者 删除 信息
二、代码编写框架
1、系统目标和范围
- 核心目标:实现学生成绩的增删改查与数据持久化
数据持久化:确保数据不会因为程序关闭而丢失。也就是说,是指将程序运行过程中产生的内存数据(临时数据)保存到 非易失性存储介质(如硬盘、数据库等)中,确保数据在程序关闭、电脑重启甚至断电后不会丢失的过程。
- 功能边界:仅处理学生基本信息+三门学科成绩(数学/语文/英语)。就是为了明确系统能做什么、不能做什么,避免功能过于复杂。
- 交互方式:命令行文本交互,通过菜单选择操作。也就是说,用户通过键盘输入数字(如 “1”),然后按回车,告诉程序自己想执行哪个操作。
交互方式指的是用户与程序(或系统)之间进行信息传递、操作沟通的具体形式,简单说就是 “用户怎么操作程序,程序怎么回应用户”。
2、程序结构规划
如图是整个系统的“骨架”设计。
3、代码具体模块划分
│ ├─ 1. 新增学生功能:让用户输入新学生的信息,验证有效性后,将其加入系统。
│ │ ├─ 提示用户输入姓名及三门成绩(利用input函数)
│ │ ├─ 验证输入合法性(成绩需为整数)
│ │ ├─ 自动计算总分
│ │ └─ 将新学生信息添加到列表
│ ├─ 2. 查看所有学生功能:将系统中所有学生的信息以清晰的格式展示给用户。
│ │ ├─ 检查列表是否为空(空则提示)
│ │ └─ 以表格形式展示所有学生信息(对齐排版)
│ ├─ 3. 查找学生功能(input("请输入要查询的学生姓名:"))
│ │ ├─ 获取用户输入的姓名
│ │ ├─ 遍历列表匹配姓名
│ │ ├─ 找到则展示该学生详情
│ │ └─ 未找到则提示"学生不存在"
│ ├─ 4. 修改学生功能
│ │ ├─ 获取目标学生姓名并查找
│ │ ├─ 找到后提供单科成绩修改入口(支持空输入不修改)
│ │ ├─ 修改后重新计算总分
│ │ └─ 未找到则提示
│ └─ 5. 删除学生功能
│ ├─ 获取目标学生姓名并查找
│ ├─ 找到后从列表中移除该学生信息
│ └─ 未找到则提示
这 5 个功能模块覆盖了学生成绩管理的核心需求,每个模块的步骤设计都遵循 “用户输入→程序处理→反馈结果” 的逻辑,既保证了功能的完整性,又考虑了用户操作的合理性(如空输入不修改、输入验证等)。下面这张图是代码编写思路。
三、代码编写
info = """
**************************************************
欢迎使用【学生信息管理系统】V1.0
请选择你想要进行的操作
1. 新建学生信息
2. 显示全部信息
3. 查询学生信息
4. 删除学生信息
5. 修改学生信息0. 退出系统
**************************************************"""# 初始化部分,导入json文件import json# 从JSON文件中读取学生数据
# 打开students.json文件,只读模式,编码为utf-8
with open('students.json', mode='r', encoding='utf-8') as f:text = f.read()
students = json.loads(text)
while True:print(info)action = input('请选择你需要的操作:')if action == '1':print('1. 新建学生信息')name = input('请输入学生的名字:')math = int(input('请输入学生的数学成绩:'))Chinese = int(input('请输入学生的语文成绩:'))English = int(input('请输入学生的英语成绩:'))total = math + Chinese + Englishstudents.append({'name': name,'math': math,'Chinese': Chinese,'English': English,'total': total})elif action == '2':print('姓名 \t\t 数学 \t\t 语文 \t\t 英语 \t\t 总分')for student in students:print('{}\t\t{}\t\t{}\t\t{}\t\t{}'.format(*student.values()))elif action == '3':name = input('请输入被查的学生名字:')for student in students:if student ['name'] == name:print('姓名 \t\t 数学 \t\t 语文 \t\t 英语 \t\t 总分')print('{}\t\t{}\t\t{}\t\t{}\t\t{}'.format(*student.values()))breakelse:print(f'{name}这个同学不存在')elif action == '4':name = input('请输入被删除的学生名字:')for student in students:if student ['name'] == name:del students [students.index(student)]breakelse:print(f'{name}这个同学不存在')elif action == '5':name = input('请输入被修改的学生名字:')for student in students:if student['name'] == name:math = input('请重新输入学生的数学成绩:')if math: # 如果重新输入的数学成绩不为空math = int(math)student['math'] = mathChinese = input('请重新输入学生的数学成绩:')if Chinese: # 如果重新输入的数学成绩不为空Chinese = int(Chinese)student['Chinese'] = ChineseEnglish = input('请重新输入学生的数学成绩:')if English: # 如果重新输入的数学成绩不为空English = int(English)student['English'] = Englishstudent ['total'] = student ['math'] + student ['Chinese'] + student ['English']else:# 学员不存在只有一个print(f'{name} 这个学员不存在')elif action == '0':print('0. 退出系统')with open('students.json', mode='w', encoding='utf-8') as f:f.write(json.dumps(students, ensure_ascii=False))breakelse:print('你输入的选项错了,请重新在选择')
info :是一个字符串变量,它存储了学生信息管理系统的操作菜单文本。
open函数:
file_object = open(file_path, mode, encoding)# file_path:指定文件的路径; # mode:指定文件的打开模式;'r':只读模式,'w':写入模式,'a':追加模式 # encoding:可选参数,指定文件编码(如 'utf-8',常用于处理包含中文的文件)
with: 作用就是会自动调用文件对象的
close()
方法关闭文件,无需手动编写f.close()
。text = f.read() :将文件对象
f
中的内容读取出来,并存储到变量 text中。
students = json.loads(text):是将JSON 格式的字符串转换为Python 数据结构的操作。json.loads()
:这是 Python 内置json
模块中的一个函数,作用是解析 JSON 字符串(即符合 JSON 格式的文本),并将其转换为对应的 Python 数据类型。假设Json文件是'[{"name": "张三", "math": 65}, {"name": "李四", "math": 70}]'
那么执行
students = json.loads(text)
后,students
会变成一个 Python 列表:
[ {"name": "张三", "math": 65},{"name": "李四", "math": 70} ]
format()
方法:通过在字符串中使用占位符{}来标记需要替换的位置,然后将需要插入的值作为参数传递给format()
student.values()
假设student
是一个字典(dictionary),values()
方法会返回字典中所有的值(value)组成的可迭代对象。
例如,如果student = {'name': 'Alice', 'age': 18, 'score': 90}
,则student.values()
会返回['Alice', 18, 90]
(具体顺序取决于 Python 版本,3.7+ 为插入顺序)。
*student.values()
这里的*
是解包操作符,会将可迭代对象中的元素逐个提取出来,作为单独的参数传递给format()
方法。
接上面的例子,*student.values()
相当于把'Alice'
、18
、90
这三个值分别作为参数传入。
elif action == '0':print('0. 退出系统')with open('students.json', mode='w', encoding='utf-8') as f:f.write(json.dumps(students, ensure_ascii=False))breakelse:print('你输入的选项错了,请重新在选择')
在这段代码中,
with open('students.json', mode='w', encoding='utf-8') as f:
with
语句用于文件操作,会自动处理文件的打开和关闭,避免资源泄露open()
函数用于打开文件,参数说明:'students.json'
:要操作的文件名(JSON 格式文件)mode='w'
:打开模式为 "写入"(如果文件不存在则创建,存在则覆盖原有内容)encoding='utf-8'
:指定文件编码为 UTF-8,确保中文等字符能正确写入
as f
:将打开的文件对象赋值给变量f
,后续通过f
操作文件
f.write(json.dumps(students, ensure_ascii=False))
json.dumps()
:将 Python 数据结构(这里是students
列表)转换为 JSON 格式的字符串(序列化过程)students
:要转换的 Python 列表(通常包含多个字典,每个字典代表一个学生的信息)ensure_ascii=False
:关闭 ASCII 编码模式,默认情况下 JSON 会将中文等非 ASCII 字符转义为\uXXXX
格式,设置为False
后会直接保存原始字符f.write()
:将转换后的 JSON 字符串写入到文件中。