当你掌握了 Python 字符串的灵活处理、列表与字典的数据存储,以及循环和函数的逻辑控制后,是时候将理论转化为实践。接下来,就通过开发一个简易版学生成绩管理系统,带你深入理解 Python 编程的实际应用。
一、项目介绍
学生成绩管理系统是一个基础但功能完整的控制台应用程序,用于帮助教师或学校管理人员管理学生的基本信息和成绩数据。通过这个项目,你将学习如何使用 Python 开发一个完整的命令行应用,掌握数据结构设计、用户交互和程序流程控制等基础编程技能。
本系统包含以下核心功能:
- 添加学生信息
- 显示所有学生信息
- 查询学生信息
- 修改学生信息
- 删除学生信息
- 成绩统计分析
二、环境准备
本项目使用 Python 3.x 开发,无需额外安装第三方库,只需要确保你的系统已安装 Python 环境。
没有安装的小伙伴可以参考手把手教你安装Python环境
三、系统设计
在开始编码之前,我们需要先设计系统的数据结构和功能模块。对于这个简易版学生成绩管理系统,我们可以使用 Python 的列表和字典来存储学生信息:
- 每个学生信息使用一个字典表示,包含学号、姓名、各科成绩、总分和平均分
- 所有学生信息存储在一个列表中
系统的功能模块采用函数式设计,每个功能对应一个独立的函数,提高代码的可读性和可维护性。
四、核心功能实现
下面是完整的代码实现
# 全局变量存储学生信息
students = []
def show_menu():
"""显示菜单"""
print("\n" + "="*20 + " 学生成绩管理系统 " + "="*20)
print("1. 添加学生信息")
print("2. 显示所有学生信息")
print("3. 查询学生信息")
print("4. 修改学生信息")
print("5. 删除学生信息")
print("6. 成绩统计")
print("0. 退出系统")
print("="*50)
def add_student():
"""添加学生信息"""
print("\n" + "="*20 + " 添加学生信息 " + "="*20)
while True:
id = input("请输入学号: ").strip()
if not id:
print("学号不能为空!")
continue
# 检查学号是否已存在
for s in students:
if s['id'] == id:
print("该学号已存在!")
break
else: # 学号不存在时执行
name = input("请输入姓名: ").strip()
if not name:
print("姓名不能为空!")
continue
try:
chinese = int(input("请输入语文成绩: "))
math = int(input("请输入数学成绩: "))
english = int(input("请输入英语成绩: "))
if chinese < 0 or math < 0 or english < 0:
print("成绩不能为负数!")
continue
# 计算总分和平均分
total = chinese + math + english
average = round(total / 3, 2)
# 添加到学生列表
students.append({
'id': id,
'name': name,
'chinese': chinese,
'math': math,
'english': english,
'total': total,
'average': average
})
print(f"学生 {name} 信息添加成功!")
break
except ValueError:
print("输入有误,请重新输入数字!")
def show_all():
"""显示所有学生信息"""
print("\n" + "="*20 + " 所有学生信息 " + "="*20)
if not students:
print("暂无学生信息!")
return
# 按学号排序
sorted_students = sorted(students, key=lambda x: x['id'])
for s in sorted_students:
print(f"学号: {s['id']}, 姓名: {s['name']}, 语文: {s['chinese']}, "
f"数学: {s['math']}, 英语: {s['english']}, 总分: {s['total']}, "
f"平均分: {s['average']}")
def search_student():
"""查询学生信息"""
print("\n" + "="*20 + " 查询学生信息 " + "="*20)
if not students:
print("暂无学生信息!")
return
keyword = input("请输入学号或姓名进行查询: ").strip()
if not keyword:
print("查询条件不能为空!")
return
found = []
for s in students:
if keyword in (s['id'], s['name']):
found.append(s)
if not found:
print("未找到匹配的学生!")
else:
for s in found:
print(f"学号: {s['id']}, 姓名: {s['name']}, 语文: {s['chinese']}, "
f"数学: {s['math']}, 英语: {s['english']}, 总分: {s['total']}, "
f"平均分: {s['average']}")
def modify_student():
"""修改学生信息"""
print("\n" + "="*20 + " 修改学生信息 " + "="*20)
if not students:
print("暂无学生信息!")
return
id = input("请输入要修改的学生学号: ").strip()
if not id:
print("学号不能为空!")
return
for s in students:
if s['id'] == id:
print("当前学生信息:")
print(f"学号: {s['id']}, 姓名: {s['name']}, 语文: {s['chinese']}, "
f"数学: {s['math']}, 英语: {s['english']}")
try:
name = input(f"请输入新姓名(当前: {s['name']}): ").strip() or s['name']
chinese = float(input(f"请输入新语文成绩(当前: {s['chinese']}): ") or s['chinese'])
math = float(input(f"请输入新数学成绩(当前: {s['math']}): ") or s['math'])
english = float(input(f"请输入新英语成绩(当前: {s['english']}): ") or s['english'])
if chinese < 0 or math < 0 or english < 0:
print("成绩不能为负数!")
return
# 更新信息
s['name'] = name
s['chinese'] = chinese
s['math'] = math
s['english'] = english
s['total'] = chinese + math + english
s['average'] = round(s['total'] / 3, 2)
print("学生信息修改成功!")
return
except ValueError:
print("输入有误,修改失败!")
return
print("未找到该学号的学生!")
def delete_student():
"""删除学生信息"""
print("\n" + "="*20 + " 删除学生信息 " + "="*20)
if not students:
print("暂无学生信息!")
return
id = input("请输入要删除的学生学号: ").strip()
if not id:
print("学号不能为空!")
return
for i, s in enumerate(students):
if s['id'] == id:
print("将要删除的学生信息:")
print(f"学号: {s['id']}, 姓名: {s['name']}, 语文: {s['chinese']}, "
f"数学: {s['math']}, 英语: {s['english']}")
confirm = input("确认删除吗?(y/n): ").lower()
if confirm == 'y':
del students[i]
print("学生信息已删除!")
return
print("未找到该学号的学生!")
def statistics():
"""成绩统计"""
print("\n" + "="*20 + " 成绩统计 " + "="*20)
if not students:
print("暂无学生信息!")
return
# 计算各科平均分
chinese_avg = sum(s['chinese'] for s in students) / len(students)
math_avg = sum(s['math'] for s in students) / len(students)
english_avg = sum(s['english'] for s in students) / len(students)
print(f"语文平均分: {chinese_avg:.2f}")
print(f"数学平均分: {math_avg:.2f}")
print(f"英语平均分: {english_avg:.2f}")
# 成绩分布
def get_grade_dist(subject):
dist = {'优秀(>=90)': 0, '良好(80-89)': 0, '中等(70-79)': 0,
'及格(60-69)': 0, '不及格(<60)': 0}
for s in students:
score = s[subject]
if score >= 90:
dist['优秀(>=90)'] += 1
elif score >= 80:
dist['良好(80-89)'] += 1
elif score >= 70:
dist['中等(70-79)'] += 1
elif score >= 60:
dist['及格(60-69)'] += 1
else:
dist['不及格(<60)'] += 1
return dist
print("\n语文成绩分布:")
for grade, count in get_grade_dist('chinese').items():
print(f"{grade}: {count}人")
print("\n数学成绩分布:")
for grade, count in get_grade_dist('math').items():
print(f"{grade}: {count}人")
print("\n英语成绩分布:")
for grade, count in get_grade_dist('english').items():
print(f"{grade}: {count}人")
def main():
"""主程序"""
while True:
show_menu()
choice = input("请输入您的选择(0-6): ").strip()
if choice == '1':
add_student()
elif choice == '2':
show_all()
elif choice == '3':
search_student()
elif choice == '4':
modify_student()
elif choice == '5':
delete_student()
elif choice == '6':
statistics()
elif choice == '0':
print("感谢使用学生成绩管理系统,再见!")
break
else:
print("无效的输入,请重新输入0-6之间的数字!")
input("\n按回车键继续...")
if __name__ == "__main__":
main()
五、功能详解
-
数据结构设计
- 使用列表
students存储所有学生信息 - 每个学生信息是一个字典,包含
id,name,chinese,math,english,total,average等键
- 使用列表
-
菜单系统
show_menu()函数负责显示主菜单,提供用户操作选项- 使用数字键选择不同功能,输入 0 退出系统
-
学生信息管理
- 添加学生:验证学号唯一性和输入合法性
- 显示所有学生:按学号排序后输出
- 查询学生:支持按学号或姓名模糊查询
- 修改学生:允许修改姓名和各科成绩
- 删除学生:删除前会显示学生信息并要求确认
-
成绩统计分析
- 计算各科平均分
- 统计各科目成绩分布情况(优秀、良好、中等、及格、不及格)
六、运行与测试
在命令行或者IDLE中运行此代码,系统启动后会显示主菜单,你可以按照提示输入对应的数字来执行相应的功能。

输入 1 添加学生信息

输入 2 查看所有学生信息

输入 6 进行成绩统计分析

输入 0 退出系统

七、项目优化与扩展
虽然我们已经实现了一个功能完整的学生成绩管理系统,但还有很多可以优化和扩展的地方:
-
数据持久化:当前系统仅在程序运行时保存数据,程序退出后数据丢失。可以添加文件操作功能,将学生数据保存到文件中。
-
用户权限管理:增加用户登录和权限控制,区分管理员和普通用户。
-
图形界面:使用 Tkinter、PyQt 等库开发图形界面,提升用户体验。
-
数据导出 / 导入:支持将学生数据导出为 CSV、Excel 等格式,也可以从文件导入数据。
-
更多统计功能:添加最高分、最低分、排名等更丰富的统计分析功能。
-
异常处理增强:完善异常处理机制,确保程序在各种异常情况下都能正常运行。
八、总结
通过这个项目,我们学习了如何使用 Python 开发一个完整的命令行应用程序。主要掌握了以下知识点:
- Python 基础语法和数据结构(列表、字典)
- 函数的定义和调用
- 用户输入处理和验证
- 程序流程控制(循环、条件判断)
- 异常处理机制
- 模块化编程思想
希望这个实战教程能帮助你理解如何从零开始开发一个小型应用程序,并且能够启发你进一步扩展和优化这个系统。
2195

被折叠的 条评论
为什么被折叠?



