第50集:第一阶段综合项目

学习目标

  • 综合运用前面所学的知识
  • 实现一个完整的项目
  • 提高编程实践能力
  • 掌握项目组织结构
  • 学会独立解决问题

项目:学生成绩管理系统

项目需求

实现一个学生成绩管理系统,包含以下功能:

  1. 学生管理

    • 添加学生
    • 删除学生
    • 查看学生列表
    • 查找学生
  2. 成绩管理

    • 录入成绩
    • 修改成绩
    • 查看成绩
    • 计算平均分
  3. 统计功能

    • 班级平均分
    • 最高分/最低分
    • 成绩排名
    • 成绩分布
  4. 数据持久化

    • 保存数据到文件
    • 从文件加载数据

项目结构

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 student

utils.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

项目扩展建议

  1. 增加功能

    • 按班级筛选
    • 按科目统计
    • 成绩图表展示
    • 导出Excel
  2. 优化体验

    • 输入验证
    • 错误提示
    • 帮助文档
    • 快捷操作
  3. 技术优化

    • 使用数据库
    • 添加用户登录
    • 网络功能
    • GUI界面

总结

通过这个项目,你掌握了:

  1. ✓ Python基本语法
  2. ✓ 数据类型和数据结构
  3. ✓ 函数和模块
  4. ✓ 异常处理
  5. ✓ 文件操作
  6. ✓ 项目组织

恭喜你完成第一阶段的学习! 🎉

继续加油,进入第二阶段:面向对象编程!

« 上一篇 调试技巧 下一篇 » 面向对象编程概述