# Python课程设计:学生成绩管理系统
> **关键词:** Python课程设计、学生成绩管理系统、Python大作业、Python期末项目
>
> **适用课程:** Python程序设计、程序设计基础、计算机导论
## 一、项目简介
学生成绩管理系统是高校Python课程设计中最常见的选题之一。本文提供一个**基于Python + 文件存储**的完整实现,包含增删改查、成绩统计、数据排序、文件读写等核心功能,代码结构清晰,可直接用于课程设计提交。
**功能清单:**
- 学生信息录入(学号、姓名、各科成绩)
- 成绩查询(按学号/姓名)
- 成绩修改与删除
- 成绩统计(平均分、最高分、最低分、及格率)
- 成绩排名(按总分/单科排序)
- 数据持久化(CSV文件存储)
- 数据导出(生成成绩报告)
## 二、项目结构
```
student_grade_system/
├── main.py # 主程序入口
├── student.py # 学生类定义
├── manager.py # 成绩管理核心逻辑
├── utils.py # 工具函数
├── data.csv # 数据文件
└── README.md # 使用说明
```
## 三、完整代码
### 3.1 student.py — 学生类
```python
class Student:
"""学生类,封装学生基本信息和成绩"""
def __init__(self, sid, name, chinese=0, math=0, english=0, python_score=0):
self.sid = sid # 学号
self.name = name # 姓名
self.chinese = chinese # 语文
self.math = math # 数学
self.english = english # 英语
self.python_score = python_score # Python
@property
def total(self):
"""计算总分"""
return self.chinese + self.math + self.english + self.python_score
@property
def average(self):
"""计算平均分"""
return self.total / 4
def to_dict(self):
"""转为字典,用于CSV存储"""
return {
'学号': self.sid,
'姓名': self.name,
'语文': self.chinese,
'数学': self.math,
'英语': self.english,
'Python': self.python_score,
'总分': self.total,
'平均分': round(self.average, 2)
}
def __str__(self):
return (f"{self.sid:<12}{self.name:<8}{self.chinese:<8}"
f"{self.math:<8}{self.english:<8}{self.python_score:<10}"
f"{self.total:<8}{self.average:.2f}")
```
### 3.2 manager.py — 管理核心
```python
import csv
import os
from student import Student
class GradeManager:
"""成绩管理器,负责增删改查和统计"""
def __init__(self, filepath='data.csv'):
self.filepath = filepath
self.students = []
self.load_data()
def load_data(self):
"""从CSV文件加载数据"""
if not os.path.exists(self.filepath):
return
with open(self.filepath, 'r', encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
for row in reader:
s = Student(
sid=row['学号'],
name=row['姓名'],
chinese=int(row['语文']),
math=int(row['数学']),
english=int(row['英语']),
python_score=int(row['Python'])
)
self.students.append(s)
def save_data(self):
"""保存数据到CSV文件"""
with open(self.filepath, 'w', encoding='utf-8-sig', newline='') as f:
if not self.students:
return
writer = csv.DictWriter(f, fieldnames=self.students[0].to_dict().keys())
writer.writeheader()
for s in self.students:
writer.writerow(s.to_dict())
def add_student(self, sid, name, chinese, math, english, python_score):
"""添加学生"""
if self.find_by_sid(sid):
return False, "学号已存在"
student = Student(sid, name, chinese, math, english, python_score)
self.students.append(student)
self.save_data()
return True, "添加成功"
def find_by_sid(self, sid):
"""按学号查找"""
for s in self.students:
if s.sid == sid:
return s
return None
def find_by_name(self, name):
"""按姓名查找(模糊匹配)"""
return [s for s in self.students if name in s.name]
def delete_student(self, sid):
"""删除学生"""
student = self.find_by_sid(sid)
if student:
self.students.remove(student)
self.save_data()
return True, "删除成功"
return False, "学号不存在"
def update_score(self, sid, subject, new_score):
"""修改单科成绩"""
student = self.find_by_sid(sid)
if not student:
return False, "学号不存在"
if hasattr(student, subject):
setattr(student, subject, new_score)
self.save_data()
return True, "修改成功"
return False, "科目不存在"
def sort_by_total(self, reverse=True):
"""按总分排序"""
return sorted(self.students, key=lambda s: s.total, reverse=reverse)
def sort_by_subject(self, subject, reverse=True):
"""按单科排序"""
return sorted(self.students, key=lambda s: getattr(s, subject, 0), reverse=reverse)
def get_statistics(self):
"""获取班级统计数据"""
if not self.students:
return None
totals = [s.total for s in self.students]
subjects = ['chinese', 'math', 'english', 'python_score']
stats = {
'总人数': len(self.students),
'班级总分平均': round(sum(totals) / len(totals), 2),
'最高总分': max(totals),
'最低总分': min(totals),
'及格率': f"{sum(1 for t in totals if t >= 240) / len(totals) * 100:.1f}%",
'优秀率': f"{sum(1 for t in totals if t >= 360) / len(totals) * 100:.1f}%",
}
for subj in subjects:
scores = [getattr(s, subj) for s in self.students]
stats[f'{subj}_平均'] = round(sum(scores) / len(scores), 2)
stats[f'{subj}_最高'] = max(scores)
return stats
```
### 3.3 utils.py — 工具函数
```python
def print_header():
"""打印表头"""
print("=" * 70)
print(f"{'学号':<12}{'姓名':<8}{'语文':<8}{'数学':<8}"
f"{'英语':<8}{'Python':<10}{'总分':<8}{'平均分'}")
print("-" * 70)
def print_students(students):
"""打印学生列表"""
if not students:
print("暂无数据")
return
print_header()
for s in students:
print(str(s))
print("=" * 70)
def print_statistics(stats):
"""打印统计信息"""
if not stats:
print("暂无数据")
return
print("\n" + "=" * 40)
print(" 班级成绩统计报告")
print("=" * 40)
for key, value in stats.items():
label = key.replace('chinese', '语文').replace('math', '数学')\
.replace('english', '英语').replace('python_score', 'Python')
print(f" {label:<12}:{value}")
print("=" * 40)
def input_score(subject_name):
"""输入单科成绩,带校验"""
while True:
try:
score = int(input(f" {subject_name}成绩(0-100): "))
if 0 <= score <= 100:
return score
print(" 成绩范围:0-100,请重新输入")
except ValueError:
print(" 请输入数字")
```
### 3.4 main.py — 主程序
```python
from manager import GradeManager
from utils import print_students, print_statistics, input_score
def show_menu():
print("\n" + "=" * 40)
print(" 学生成绩管理系统 v1.0")
print("=" * 40)
print(" 1. 添加学生")
print(" 2. 查询成绩(按学号)")
print(" 3. 查询成绩(按姓名)")
print(" 4. 修改成绩")
print(" 5. 删除学生")
print(" 6. 成绩排名(按总分)")
print(" 7. 成绩排名(按单科)")
print(" 8. 班级统计报告")
print(" 9. 显示所有学生")
print(" 0. 退出系统")
print("=" * 40)
def main():
manager = GradeManager()
while True:
show_menu()
choice = input("请选择操作(0-9): ").strip()
if choice == '1':
print("\n--- 添加学生 ---")
sid = input(" 学号: ").strip()
name = input(" 姓名: ").strip()
chinese = input_score("语文")
math = input_score("数学")
english = input_score("英语")
python_score = input_score("Python")
ok, msg = manager.add_student(sid, name, chinese, math, english, python_score)
print(f"\n >> {msg}")
elif choice == '2':
sid = input("\n请输入学号: ").strip()
s = manager.find_by_sid(sid)
if s:
print_students([s])
else:
print(" >> 未找到该学生")
elif choice == '3':
name = input("\n请输入姓名: ").strip()
results = manager.find_by_name(name)
print_students(results)
elif choice == '4':
print("\n--- 修改成绩 ---")
sid = input(" 学号: ").strip()
print(" 科目:chinese / math / english / python_score")
subject = input(" 科目名: ").strip()
score = input_score("新")
ok, msg = manager.update_score(sid, subject, score)
print(f"\n >> {msg}")
elif choice == '5':
sid = input("\n请输入要删除的学号: ").strip()
ok, msg = manager.delete_student(sid)
print(f" >> {msg}")
elif choice == '6':
sorted_list = manager.sort_by_total()
print("\n--- 按总分排名 ---")
print_students(sorted_list)
elif choice == '7':
print(" 可选科目:chinese / math / english / python_score")
subject = input(" 请输入科目: ").strip()
sorted_list = manager.sort_by_subject(subject)
print_students(sorted_list)
elif choice == '8':
stats = manager.get_statistics()
print_statistics(stats)
elif choice == '9':
print_students(manager.students)
elif choice == '0':
print("\n 感谢使用,再见!")
break
else:
print("\n >> 无效选择,请重新输入")
if __name__ == '__main__':
main()
```
## 四、运行效果
```
========================================
学生成绩管理系统 v1.0
========================================
1. 添加学生
2. 查询成绩(按学号)
...
请选择操作(0-9): 1
--- 添加学生 ---
学号: 2024001
姓名: 张三
语文成绩(0-100): 85
数学成绩(0-100): 92
英语成绩(0-100): 78
Python成绩(0-100): 95
>> 添加成功
```
## 五、报告撰写要点
课程设计报告一般包含以下部分:
1. **需求分析** — 系统要实现什么功能,面向什么用户
2. **系统设计** — 类图、模块划分、数据结构设计
3. **详细设计** — 每个函数的流程图和逻辑说明
4. **测试结果** — 截图展示各功能运行效果
5. **总结与体会** — 遇到的问题和解决方案
> **提示:** 在报告中重点体现你对**面向对象编程**的理解(Student类的封装)和**文件操作**的掌握(CSV读写),这两个是Python课程的核心考点。
## 六、扩展方向
如果想拿更高分,可以加这些功能:
- **图形界面** — 用 `tkinter` 做一个GUI版本
- **数据库存储** — 用 `sqlite3` 替代CSV文件
- **数据可视化** — 用 `matplotlib` 画成绩分布图
- **登录验证** — 加一个管理员登录功能
---
**完整代码已上传GitHub:** (此处放你的仓库链接)
> 如果这篇文章对你有帮助,请点赞 + 收藏 + 关注,后续会更新更多课程设计实战内容!
4184

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



