4. 学生成绩管理

任务说明

实现一个学生成绩管理系统,核心是一个Student类(包含姓名和成绩),以及一个StudentManager管理类,支持添加、删除、修改、查询学生信息,并能计算全班平均分和最高分。所有操作通过命令行交互完成。

核心实现

class Student:
    """学生类,包含姓名和成绩"""
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __str__(self):
        return f"{self.name}: {self.score}分"

class StudentManager:
    """学生成绩管理器"""
    def __init__(self):
        self.students = []  # 存储Student对象列表

    def add_student(self, name, score):
        """添加学生"""
        # 检查姓名是否已存在
        if self.find_student(name):
            return False, f"学生 {name} 已存在"
        self.students.append(Student(name, score))
        return True, f"已添加学生 {name},成绩 {score}分"

    def delete_student(self, name):
        """删除学生"""
        student = self.find_student(name)
        if student:
            self.students.remove(student)
            return True, f"已删除学生 {name}"
        return False, f"未找到学生 {name}"

    def update_student(self, name, new_score):
        """修改学生成绩"""
        student = self.find_student(name)
        if student:
            student.score = new_score
            return True, f"已更新 {name} 的成绩为 {new_score}分"
        return False, f"未找到学生 {name}"

    def find_student(self, name):
        """按姓名查找学生,返回Student对象或None"""
        for s in self.students:
            if s.name == name:
                return s
        return None

    def query_student(self, name):
        """查询学生信息"""
        student = self.find_student(name)
        if student:
            return True, str(student)
        return False, f"未找到学生 {name}"

    def average_score(self):
        """计算全班平均分"""
        if not self.students:
            return 0.0
        total = sum(s.score for s in self.students)
        return round(total / len(self.students), 2)

    def max_score(self):
        """获取最高分学生"""
        if not self.students:
            return None
        return max(self.students, key=lambda s: s.score)

    def list_all(self):
        """列出所有学生"""
        if not self.students:
            return "暂无学生数据"
        return "\n".join(str(s) for s in self.students)

def main():
    manager = StudentManager()
    print("=== 学生成绩管理系统 ===")
    print("命令: add 姓名 成绩 | del 姓名 | update 姓名 新成绩 | query 姓名 | avg | max | list | exit")

    while True:
        cmd = input("\n> ").strip().split()
        if not cmd:
            continue

        action = cmd[0].lower()

        if action == "exit":
            print("系统已退出")
            break
        elif action == "add" and len(cmd) == 3:
            name, score = cmd[1], float(cmd[2])
            ok, msg = manager.add_student(name, score)
            print(msg)
        elif action == "del" and len(cmd) == 2:
            ok, msg = manager.delete_student(cmd[1])
            print(msg)
        elif action == "update" and len(cmd) == 3:
            name, new_score = cmd[1], float(cmd[2])
            ok, msg = manager.update_student(name, new_score)
            print(msg)
        elif action == "query" and len(cmd) == 2:
            ok, msg = manager.query_student(cmd[1])
            print(msg)
        elif action == "avg":
            print(f"全班平均分: {manager.average_score()}")
        elif action == "max":
            top = manager.max_score()
            if top:
                print(f"最高分: {top}")
            else:
                print("暂无学生数据")
        elif action == "list":
            print(manager.list_all())
        else:
            print("无效命令,请重试")

if __name__ == "__main__":
    main()

运行与验证

将上述代码保存为student_manager.py,在终端执行python student_manager.py即可启动系统。按提示输入命令进行测试,建议按以下顺序验证:

  1. 添加:输入add 张三 85,再输入add 李四 92,add 王五 78,观察返回成功提示。
  2. 查询:输入query 李四,应显示李四: 92分。
  3. 修改:输入update 王五 88,再query 王五确认成绩已变为88分。
  4. 统计:输入avg,预期输出全班平均分: 88.33((85+92+88)/3=88.33);输入max,预期输出最高分: 李四: 92分。
  5. 删除:输入del 张三,再输入list确认张三已不在列表中。
  6. 异常处理:输入query 赵六,应提示未找到;重复添加add 李四 90,应提示已存在。

判定标准:以上操作返回的信息与预期一致,且avg和max的计算结果与当前列表中的学生数据吻合,即判定功能正确。

学生成绩管理 — 命令交互与数据流 用户命令 add 张三 85 del 张三 update 王五 88 query 李四 avg / max / list StudentManager add_student() delete_student() update_student() query_student() average_score() / max_score() students 列表 Student("张三", 85) Student("李四", 92) Student("王五", 88) (动态增删改) 解析命令 增删改查 返回操作结果 / 统计数据 验证观测点 ① add 张三 85 → 返回"已添加学生 张三,成绩 85.0分" ② query 李四 → 返回"李四: 92分" ③ avg → 全班平均分: 88.33(与列表数据一致) ④ max → 最高分: 李四: 92分(取成绩最大值)