第50集:第一阶段综合项目
学习目标
- 综合运用前面所学的知识
- 实现一个完整的项目
- 提高编程实践能力
- 掌握项目组织结构
- 学会独立解决问题
项目:学生成绩管理系统
项目需求
实现一个学生成绩管理系统,包含以下功能:
学生管理
- 添加学生
- 删除学生
- 查看学生列表
- 查找学生
成绩管理
- 录入成绩
- 修改成绩
- 查看成绩
- 计算平均分
统计功能
- 班级平均分
- 最高分/最低分
- 成绩排名
- 成绩分布
数据持久化
- 保存数据到文件
- 从文件加载数据
项目结构
student_management/
├── main.py # 主程序
├── models.py # 数据模型
├── utils.py # 工具函数
└── data/ # 数据目录
└── students.json # 数据文件代码实现
models.py(数据模型)
class Student:
"""学生类"""
def __init__(self, student_id, name, class_name):
self.student_id = student_id
self.name = name
self.class_name = class_name
self.scores = {}
def add_score(self, subject, score):
"""添加成绩"""
self.scores[subject] = score
def get_average(self):
"""获取平均分"""
if not self.scores:
return 0
return sum(self.scores.values()) / len(self.scores)
def to_dict(self):
"""转换为字典"""
return {
"student_id": self.student_id,
"name": self.name,
"class_name": self.class_name,
"scores": self.scores
}
@staticmethod
def from_dict(data):
"""从字典创建学生"""
student = Student(
data["student_id"],
data["name"],
data["class_name"]
)
student.scores = data.get("scores", {})
return studentutils.py(工具函数)
import json
import os
DATA_FILE = "data/students.json"
def save_data(students):
"""保存数据到文件"""
os.makedirs(os.path.dirname(DATA_FILE), exist_ok=True)
with open(DATA_FILE, "w", encoding="utf-8") as f:
data = [student.to_dict() for student in students]
json.dump(data, f, ensure_ascii=False, indent=2)
print("数据已保存")
def load_data():
"""从文件加载数据"""
if not os.path.exists(DATA_FILE):
return []
with open(DATA_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
return [Student.from_dict(item) for item in data]
def find_student(students, student_id):
"""查找学生"""
for student in students:
if student.student_id == student_id:
return student
return None
def calculate_class_average(students):
"""计算班级平均分"""
if not students:
return 0
total = sum(student.get_average() for student in students)
return total / len(students)
def rank_students(students):
"""学生排名"""
return sorted(students, key=lambda s: s.get_average(), reverse=True)main.py(主程序)
from models import Student
from utils import save_data, load_data, find_student, calculate_class_average, rank_students
class StudentManagementSystem:
"""学生成绩管理系统"""
def __init__(self):
self.students = load_data()
def add_student(self, student_id, name, class_name):
"""添加学生"""
if find_student(self.students, student_id):
print("学号已存在")
return False
student = Student(student_id, name, class_name)
self.students.append(student)
save_data(self.students)
print(f"学生 {name} 添加成功")
return True
def delete_student(self, student_id):
"""删除学生"""
student = find_student(self.students, student_id)
if not student:
print("学生不存在")
return False
self.students.remove(student)
save_data(self.students)
print(f"学生 {student.name} 删除成功")
return True
def add_score(self, student_id, subject, score):
"""录入成绩"""
student = find_student(self.students, student_id)
if not student:
print("学生不存在")
return False
if not (0 <= score <= 100):
print("成绩必须在0-100之间")
return False
student.add_score(subject, score)
save_data(self.students)
print(f"成绩录入成功")
return True
def show_students(self):
"""显示学生列表"""
if not self.students:
print("没有学生信息")
return
print("\n学生列表:")
print("-" * 60)
print(f"{'学号':<10} {'姓名':<10} {'班级':<10} {'平均分':<10}")
print("-" * 60)
for student in self.students:
avg = student.get_average()
print(f"{student.student_id:<10} {student.name:<10} {student.class_name:<10} {avg:<10.1f}")
def show_ranking(self):
"""显示排名"""
if not self.students:
print("没有学生信息")
return
ranked = rank_students(self.students)
print("\n成绩排名:")
print("-" * 70)
print(f"{'排名':<6} {'学号':<10} {'姓名':<10} {'平均分':<10} {'成绩':<20}")
print("-" * 70)
for i, student in enumerate(ranked, 1):
avg = student.get_average()
scores_str = ", ".join(f"{k}:{v}" for k, v in student.scores.items())
print(f"{i:<6} {student.student_id:<10} {student.name:<10} {avg:<10.1f} {scores_str:<20}")
def show_statistics(self):
"""显示统计信息"""
if not self.students:
print("没有学生信息")
return
class_avg = calculate_class_average(self.students)
averages = [s.get_average() for s in self.students]
print("\n统计信息:")
print(f"学生总数:{len(self.students)}")
print(f"班级平均分:{class_avg:.1f}")
print(f"最高分:{max(averages):.1f}")
print(f"最低分:{min(averages):.1f}")
def run(self):
"""运行系统"""
while True:
print("\n" + "="*50)
print(" 学生成绩管理系统")
print("="*50)
print("1. 添加学生")
print("2. 删除学生")
print("3. 录入成绩")
print("4. 查看学生列表")
print("5. 查看排名")
print("6. 查看统计信息")
print("0. 退出")
print("="*50)
choice = input("\n请输入选项:")
if choice == '0':
print("感谢使用!")
break
elif choice == '1':
student_id = input("学号:")
name = input("姓名:")
class_name = input("班级:")
self.add_student(student_id, name, class_name)
elif choice == '2':
student_id = input("学号:")
self.delete_student(student_id)
elif choice == '3':
student_id = input("学号:")
subject = input("科目:")
try:
score = float(input("成绩:"))
self.add_score(student_id, subject, score)
except ValueError:
print("请输入有效的数字")
elif choice == '4':
self.show_students()
elif choice == '5':
self.show_ranking()
elif choice == '6':
self.show_statistics()
else:
print("无效的选项")
# 运行系统
if __name__ == "__main__":
system = StudentManagementSystem()
system.run()项目功能展示
功能1:添加学生
1. 添加学生
学号:001
姓名:小明
班级:一班
学生 小明 添加成功功能2:录入成绩
3. 录入成绩
学号:001
科目:数学
成绩:95
成绩录入成功功能3:查看排名
5. 查看排名
------------------------------------------------------
排名 学号 姓名 平均分 成绩
------------------------------------------------------
1 001 小明 92.5 数学:95, 语文:90项目扩展建议
增加功能
- 按班级筛选
- 按科目统计
- 成绩图表展示
- 导出Excel
优化体验
- 输入验证
- 错误提示
- 帮助文档
- 快捷操作
技术优化
- 使用数据库
- 添加用户登录
- 网络功能
- GUI界面
总结
通过这个项目,你掌握了:
- ✓ Python基本语法
- ✓ 数据类型和数据结构
- ✓ 函数和模块
- ✓ 异常处理
- ✓ 文件操作
- ✓ 项目组织
恭喜你完成第一阶段的学习! 🎉
继续加油,进入第二阶段:面向对象编程!