学生成绩管理系统(控制台版)
-
核心功能:实现学生信息(姓名、学号、各科成绩)的添加、查询、修改、删除、成绩排名统计,数据暂存于内存(进阶可保存到文件)。
-
技术栈:列表 / 字典(存储学生数据)、自定义函数、循环 / 条件判断、字符串格式化输出。
-
实现思路:
- 第一步:定义全局列表(如
students = []),用于存储每个学生的字典数据(如{"id": "001", "name": "张三", "math": 90}); - 第二步:封装各功能函数(如
add_student()、query_student()、sort_score()); - 第三步:搭建控制台菜单(如 “1. 添加学生 2. 查询学生 3. 退出系统”),通过循环接收用户选择并调用对应函数;
- 第四步:实现成绩排名(使用
sorted()函数结合自定义排序规则),格式化输出排名结果。
一、项目核心定位与需求
- 第一步:定义全局列表(如
1. 项目定位
这是控制台版入门级项目(无图形界面,纯命令行交互),无需第三方库,仅依赖 Python 基础语法,适合零基础学习者巩固知识,建立编程逻辑思维。
2. 核心功能需求
一个完整的学生管理系统,需实现 5 大基础功能,外加菜单导航和退出功能:
- 添加学生:录入学生学号、姓名、各科成绩(如数学、语文、英语),确保学号唯一(不重复添加)。
- 查询学生:支持按学号精准查询,展示学生完整信息(学号、姓名、各科成绩、总分)。
- 修改学生:按学号找到学生,修改其姓名或各科成绩。
- 删除学生:按学号删除指定学生信息,支持删除前确认。
- 成绩统计:展示所有学生信息,并按总分从高到低排名,格式化输出。
- 菜单导航:提供清晰的命令行菜单,支持循环操作(用户可重复选择功能,无需重新运行程序)。
- 退出系统:安全退出程序,提示友好信息。
3. 数据存储方案
入门阶段采用内存存储(列表 + 字典),数据暂存于程序运行内存中,程序关闭后数据丢失(进阶可优化为文件存储,如 TXT/Excel/SQLite):
- 外层:使用列表
students = []存储所有学生信息。 - 内层:使用字典存储单个学生信息,格式如下:
python
运行
{
"student_id": "001", # 学号(唯一标识)
"name": "张三", # 姓名
"math": 90, # 数学成绩
"chinese": 85, # 语文成绩
"english": 95 # 英语成绩
}
二、分步实现(从基础到完整)
步骤 1:搭建项目框架(菜单导航 + 循环交互)
先实现核心骨架,搭建命令行菜单,支持循环选择功能,这是系统的 “入口”。
python
运行
# 定义全局列表,存储所有学生信息(程序运行期间有效)
students = []
def show_menu():
"""展示系统菜单,打印友好提示"""
print("=" * 30)
print(" 学生管理系统(控制台版)")
print(" 1. 添加学生信息")
print(" 2. 查询学生信息")
print(" 3. 修改学生信息")
print(" 4. 删除学生信息")
print(" 5. 成绩排名统计")
print(" 0. 退出系统")
print("=" * 30)
if __name__ == "__main__":
# 循环执行,实现多次操作
while True:
show_menu()
# 获取用户输入的功能选择
try:
choice = int(input("请输入你要选择的功能编号(0-5):"))
except ValueError:
print("输入无效!请输入数字0-5\n")
continue # 跳过本次循环,重新显示菜单
# 根据选择执行对应功能(先搭建分支,后续填充功能)
if choice == 0:
print("感谢使用学生管理系统,再见!")
break # 退出循环,结束程序
elif choice == 1:
print("--- 进入添加学生功能 ---\n")
# 后续填充add_student()函数
elif choice == 2:
print("--- 进入查询学生功能 ---\n")
# 后续填充query_student()函数
elif choice == 3:
print("--- 进入修改学生功能 ---\n")
# 后续填充modify_student()函数
elif choice == 4:
print("--- 进入删除学生功能 ---\n")
# 后续填充delete_student()函数
elif choice == 5:
print("--- 进入成绩排名功能 ---\n")
# 后续填充sort_students()函数
else:
print("功能编号不存在!请输入0-5的数字\n")
步骤 2:实现核心功能函数(逐个填充)
功能 1:添加学生(核心:学号唯一性校验)
python
运行
def add_student():
"""添加学生信息,校验学号唯一性"""
# 获取用户输入
student_id = input("请输入学生学号(如:001):").strip()
name = input("请输入学生姓名:").strip()
# 校验学号和姓名是否为空
if not student_id or not name:
print("学号和姓名不能为空!添加失败\n")
return
# 校验学号是否已存在(核心逻辑)
for student in students:
if student["student_id"] == student_id:
print(f"学号{student_id}已存在!无法重复添加\n")
return
# 获取各科成绩,做异常处理(确保输入数字)
try:
math = int(input("请输入数学成绩:"))
chinese = int(input("请输入语文成绩:"))
english = int(input("请输入英语成绩:"))
# 成绩范围校验(可选,提升合理性)
if not (0 <= math <= 100 and 0 <= chinese <= 100 and 0 <= english <= 100):
print("成绩必须在0-100之间!添加失败\n")
return
except ValueError:
print("成绩输入无效!请输入整数数字\n")
return
# 构造学生字典,添加到全局列表
new_student = {
"student_id": student_id,
"name": name,
"math": math,
"chinese": chinese,
"english": english
}
students.append(new_student)
print(f"学生{name}(学号{student_id})添加成功!\n")
功能 2:查询学生(核心:按学号精准匹配)
python
运行
def query_student():
"""按学号查询学生完整信息"""
if not students:
print("系统中暂无学生信息,无法查询\n")
return
student_id = input("请输入要查询的学生学号:").strip()
# 遍历列表,查找对应学号
for student in students:
if student["student_id"] == student_id:
# 格式化输出学生信息
print("--- 学生信息查询结果 ---")
print(f"学号:{student['student_id']}")
print(f"姓名:{student['name']}")
print(f"数学:{student['math']}分")
print(f"语文:{student['chinese']}分")
print(f"英语:{student['english']}分")
print(f"总分:{student['math'] + student['chinese'] + student['english']}分")
print("------------------------\n")
return
# 若遍历结束未找到
print(f"未查询到学号{student_id}对应的学生信息\n")
功能 3:修改学生(核心:先查找,后修改)
python
运行
def modify_student():
"""按学号修改学生姓名或各科成绩"""
if not students:
print("系统中暂无学生信息,无法修改\n")
return
student_id = input("请输入要修改的学生学号:").strip()
# 查找学生
target_student = None
for student in students:
if student["student_id"] == student_id:
target_student = student
break
if not target_student:
print(f"未找到学号{student_id}对应的学生,修改失败\n")
return
# 展示当前信息
print(f"找到学生:{target_student['name']},当前信息如下:")
print(f"姓名:{target_student['name']},数学:{target_student['math']},语文:{target_student['chinese']},英语:{target_student['english']}")
# 获取新信息(支持选择性修改,输入回车则保留原信息)
new_name = input("请输入新姓名(回车保留原姓名):").strip()
if new_name:
target_student["name"] = new_name
# 修改成绩,异常处理
try:
math_input = input("请输入新数学成绩(回车保留原成绩):").strip()
if math_input:
math = int(math_input)
if not (0 <= math <= 100):
print("数学成绩必须在0-100之间!不修改该科目\n")
else:
target_student["math"] = math
chinese_input = input("请输入新语文成绩(回车保留原成绩):").strip()
if chinese_input:
chinese = int(chinese_input)
if not (0 <= chinese <= 100):
print("语文成绩必须在0-100之间!不修改该科目\n")
else:
target_student["chinese"] = chinese
english_input = input("请输入新英语成绩(回车保留原成绩):").strip()
if english_input:
english = int(english_input)
if not (0 <= english <= 100):
print("英语成绩必须在0-100之间!不修改该科目\n")
else:
target_student["english"] = english
except ValueError:
print("成绩输入无效!未修改任何成绩\n")
return
print(f"学号{student_id}的学生信息修改成功!\n")
功能 4:删除学生(核心:列表删除元素 + 确认机制)
python
运行
def delete_student():
"""按学号删除学生信息,添加删除确认"""
if not students:
print("系统中暂无学生信息,无法删除\n")
return
student_id = input("请输入要删除的学生学号:").strip()
# 查找学生索引和信息
target_index = -1
for index, student in enumerate(students):
if student["student_id"] == student_id:
target_index = index
break
if target_index == -1:
print(f"未找到学号{student_id}对应的学生,删除失败\n")
return
# 删除前确认,防止误操作
student_name = students[target_index]["name"]
confirm = input(f"确定要删除学生{student_name}(学号{student_id})吗?(y/n):").strip().lower()
if confirm == "y":
# 删除列表中对应索引的元素
students.pop(target_index)
print(f"学生{student_name}(学号{student_id})删除成功!\n")
else:
print("已取消删除操作\n")
功能 5:成绩排名(核心:sorted () 自定义排序)
python
运行
def sort_students():
"""按学生总分从高到低排名,格式化输出"""
if not students:
print("系统中暂无学生信息,无法排名\n")
return
# 自定义排序:使用sorted(),按总分降序排列
# key=lambda 匿名函数:计算每个学生的总分,作为排序依据
# reverse=True:降序排列(从高到低)
sorted_students = sorted(
students,
key=lambda s: s["math"] + s["chinese"] + s["english"],
reverse=True
)
# 格式化输出排名结果
print("--- 学生成绩排名(总分从高到低) ---")
print(f"排名\t学号\t姓名\t数学\t语文\t英语\t总分")
for rank, student in enumerate(sorted_students, start=1):
total = student["math"] + student["chinese"] + student["english"]
print(f"{rank}\t{student['student_id']}\t{student['name']}\t{student['math']}\t{student['chinese']}\t{student['english']}\t{total}")
print("------------------------------------\n")
步骤 3:整合所有功能(完整代码)
将上述框架和功能函数整合,即可得到可直接运行的完整代码:
python
运行
# 全局列表:存储所有学生信息
students = []
def show_menu():
"""展示系统菜单"""
print("=" * 30)
print(" 学生管理系统(控制台版)")
print(" 1. 添加学生信息")
print(" 2. 查询学生信息")
print(" 3. 修改学生信息")
print(" 4. 删除学生信息")
print(" 5. 成绩排名统计")
print(" 0. 退出系统")
print("=" * 30)
def add_student():
"""添加学生信息,校验学号唯一性"""
student_id = input("请输入学生学号(如:001):").strip()
name = input("请输入学生姓名:").strip()
if not student_id or not name:
print("学号和姓名不能为空!添加失败\n")
return
# 学号唯一性校验
for student in students:
if student["student_id"] == student_id:
print(f"学号{student_id}已存在!无法重复添加\n")
return
# 成绩输入与校验
try:
math = int(input("请输入数学成绩:"))
chinese = int(input("请输入语文成绩:"))
english = int(input("请输入英语成绩:"))
if not (0 <= math <= 100 and 0 <= chinese <= 100 and 0 <= english <= 100):
print("成绩必须在0-100之间!添加失败\n")
return
except ValueError:
print("成绩输入无效!请输入整数数字\n")
return
# 添加学生
new_student = {
"student_id": student_id,
"name": name,
"math": math,
"chinese": chinese,
"english": english
}
students.append(new_student)
print(f"学生{name}(学号{student_id})添加成功!\n")
def query_student():
"""按学号查询学生信息"""
if not students:
print("系统中暂无学生信息,无法查询\n")
return
student_id = input("请输入要查询的学生学号:").strip()
for student in students:
if student["student_id"] == student_id:
print("--- 学生信息查询结果 ---")
print(f"学号:{student['student_id']}")
print(f"姓名:{student['name']}")
print(f"数学:{student['math']}分")
print(f"语文:{student['chinese']}分")
print(f"英语:{student['english']}分")
print(f"总分:{student['math'] + student['chinese'] + student['english']}分")
print("------------------------\n")
return
print(f"未查询到学号{student_id}对应的学生信息\n")
def modify_student():
"""按学号修改学生信息"""
if not students:
print("系统中暂无学生信息,无法修改\n")
return
student_id = input("请输入要修改的学生学号:").strip()
target_student = None
for student in students:
if student["student_id"] == student_id:
target_student = student
break
if not target_student:
print(f"未找到学号{student_id}对应的学生,修改失败\n")
return
# 展示当前信息
print(f"找到学生:{target_student['name']},当前信息如下:")
print(f"姓名:{target_student['name']},数学:{target_student['math']},语文:{target_student['chinese']},英语:{target_student['english']}")
# 修改姓名
new_name = input("请输入新姓名(回车保留原姓名):").strip()
if new_name:
target_student["name"] = new_name
# 修改成绩
try:
# 数学成绩
math_input = input("请输入新数学成绩(回车保留原成绩):").strip()
if math_input:
math = int(math_input)
if 0 <= math <= 100:
target_student["math"] = math
else:
print("数学成绩必须在0-100之间!不修改该科目\n")
# 语文成绩
chinese_input = input("请输入新语文成绩(回车保留原成绩):").strip()
if chinese_input:
chinese = int(chinese_input)
if 0 <= chinese <= 100:
target_student["chinese"] = chinese
else:
print("语文成绩必须在0-100之间!不修改该科目\n")
# 英语成绩
english_input = input("请输入新英语成绩(回车保留原成绩):").strip()
if english_input:
english = int(english_input)
if 0 <= english <= 100:
target_student["english"] = english
else:
print("英语成绩必须在0-100之间!不修改该科目\n")
except ValueError:
print("成绩输入无效!未修改任何成绩\n")
return
print(f"学号{student_id}的学生信息修改成功!\n")
def delete_student():
"""按学号删除学生信息"""
if not students:
print("系统中暂无学生信息,无法删除\n")
return
student_id = input("请输入要删除的学生学号:").strip()
target_index = -1
for index, student in enumerate(students):
if student["student_id"] == student_id:
target_index = index
break
if target_index == -1:
print(f"未找到学号{student_id}对应的学生,删除失败\n")
return
# 删除确认
student_name = students[target_index]["name"]
confirm = input(f"确定要删除学生{student_name}(学号{student_id})吗?(y/n):").strip().lower()
if confirm == "y":
students.pop(target_index)
print(f"学生{student_name}(学号{student_id})删除成功!\n")
else:
print("已取消删除操作\n")
def sort_students():
"""按总分降序排名并输出"""
if not students:
print("系统中暂无学生信息,无法排名\n")
return
# 按总分排序
sorted_students = sorted(
students,
key=lambda s: s["math"] + s["chinese"] + s["english"],
reverse=True
)
# 输出排名
print("--- 学生成绩排名(总分从高到低) ---")
print(f"排名\t学号\t姓名\t数学\t语文\t英语\t总分")
for rank, student in enumerate(sorted_students, start=1):
total = student["math"] + student["chinese"] + student["english"]
print(f"{rank}\t{student['student_id']}\t{student['name']}\t{student['math']}\t{student['chinese']}\t{student['english']}\t{total}")
print("------------------------------------\n")
if __name__ == "__main__":
while True:
show_menu()
try:
choice = int(input("请输入你要选择的功能编号(0-5):"))
except ValueError:
print("输入无效!请输入数字0-5\n")
continue
if choice == 0:
print("感谢使用学生管理系统,再见!")
break
elif choice == 1:
add_student()
elif choice == 2:
query_student()
elif choice == 3:
modify_student()
elif choice == 4:
delete_student()
elif choice == 5:
sort_students()
else:
print("功能编号不存在!请输入0-5的数字\n")
三、核心知识点总结
-
数据结构:使用「列表 + 字典」存储结构化数据,列表存储批量数据,字典存储单个学生的多字段信息,是 Python 基础数据结构的经典应用。
-
函数封装:将每个功能独立封装为函数(如
add_student()、query_student()),代码结构清晰,便于维护和复用。 -
循环与条件判断:
while True实现循环交互,支持多次操作;for循环遍历学生列表,实现查找、学号校验等功能;if-elif-else实现菜单分支和条件校验。
-
异常处理:使用
try-except捕获ValueError(输入非数字),提升程序健壮性,避免程序意外崩溃。 -
自定义排序:使用
sorted()函数 +lambda匿名函数,按总分自定义排序,这是 Python 排序的核心技巧。 -
列表操作:使用
append()添加元素、pop()删除元素、enumerate()获取索引 + 元素,掌握列表的核心操作。
四、优化与扩展方向(进阶提升)
-
数据持久化:将内存中的学生数据保存到文件(TXT/CSV/Excel/SQLite),程序关闭后数据不丢失。
- 示例(TXT 存储):使用
open()函数写入 / 读取学生数据,按固定格式存储。 - 示例(Excel 存储):使用
openpyxl库,将学生数据写入 Excel 文件。
- 示例(TXT 存储):使用
-
功能扩展:
- 支持模糊查询(按姓名关键字查询,如输入 “张”,查询所有姓张的学生);
- 支持批量删除 / 修改;
- 计算班级平均分、最高分、最低分等统计信息。
-
输入优化:
- 限制学号格式(如固定 3 位数字);
- 自动去重空格,提升用户体验;
- 支持快捷键退出功能。
-
图形界面:使用 Python 内置的
tkinter库,制作可视化图形界面,替代命令行交互,更贴近实际应用。
总结
- 学生管理系统(控制台版)是 Python 入门的经典项目,核心是巩固「列表 / 字典 / 函数 / 循环 / 条件判断」等基础语法。
- 项目实现遵循「先搭框架,后填功能」的思路,先实现菜单导航,再逐个完成添加、查询、修改、删除、排名功能。
- 核心要点:学号唯一性校验、按学号精准查找、
sorted()自定义排序、异常处理,这些技巧可复用至其他基础项目中。 - 可通过数据持久化、功能扩展、图形界面等方向,逐步提升项目的实用性和复杂度。