第18课:简易成绩单——计算与格式化输出

🎯 本课目标

  • 学习计算多个成绩的总分和平均分
  • 掌握格式化输出漂亮的成绩单
  • 学会判断成绩等级和给出评语
  • 制作完整的成绩管理系统
  • 综合运用前17课知识解决实际问题

📊 趣味引入:成为班级"小老师"

想象一下:你是班级的"小老师",需要:

  • 📝 收集同学们的成绩
  • 🧮 计算总分和平均分
  • 📈 判断成绩等级
  • 💯 生成漂亮的成绩单
  • 🎯 给出学习建议

今天,让我们一起用Python制作智能成绩单系统,成为数据处理小专家!


🔧 第一部分:基础成绩计算

1.1 单个学生成绩计算

# 单个学生成绩计算
print("📊 单个学生成绩计算")
print("=" * 40)

# 输入各科成绩
print("\n请输入各科成绩:")
chinese = float(input("语文成绩:"))
math = float(input("数学成绩:"))
english = float(input("英语成绩:"))
science = float(input("科学成绩:"))

# 计算总分和平均分
total = chinese + math + english + science
average = total / 4

# 显示结果
print(f"\n{'='*30}")
print("📈 成绩统计:")
print(f"{'='*30}")
print(f"语文:{chinese:6.1f}分")
print(f"数学:{math:6.1f}分")
print(f"英语:{english:6.1f}分")
print(f"科学:{science:6.1f}分")
print(f"{'-'*30}")
print(f"总分:{total:6.1f}分")
print(f"平均分:{average:6.1f}分")
print(f"{'='*30}")

# 判断等级
if average >= 90:
    grade = "A"
    comment = "优秀!继续保持!"
elif average >= 80:
    grade = "B"
    comment = "良好!继续努力!"
elif average >= 70:
    grade = "C"
    comment = "中等!加油进步!"
elif average >= 60:
    grade = "D"
    comment = "及格!需要努力!"
else:
    grade = "E"
    comment = "不及格!要加油了!"

print(f"\n📈 成绩等级:{grade}")
print(f"💡 学习建议:{comment}")

1.2 多个科目扩展

# 多科目成绩计算
print("\n📚 多科目成绩计算")
print("=" * 40)

# 科目列表
subjects = ["语文", "数学", "英语", "科学", "社会", "美术", "体育", "音乐"]
scores = []

print(f"请输入{len(subjects)}科成绩:")

# 收集各科成绩
for subject in subjects:
    while True:
        try:
            score = float(input(f"{subject}成绩:"))
            if 0 <= score <= 100:
                scores.append(score)
                break
            else:
                print("⚠️ 成绩应该在0-100之间!")
        except ValueError:
            print("❌ 请输入数字!")

# 计算统计
total = sum(scores)
average = total / len(scores)
highest = max(scores)
lowest = min(scores)

# 显示漂亮的成绩单
print(f"\n{'='*50}")
print(f"{'📊 成绩单':^50}")
print(f"{'='*50}")

print(f"\n{'科目':<8} {'成绩':>8} {'等级':>6} {'评价':>10}")
print(f"{'-'*40}")

for i, (subject, score) in enumerate(zip(subjects, scores)):
    # 判断单科等级
    if score >= 90:
        grade = "A"
        eval_text = "优秀"
    elif score >= 80:
        grade = "B"
        eval_text = "良好"
    elif score >= 70:
        grade = "C"
        eval_text = "中等"
    elif score >= 60:
        grade = "D"
        eval_text = "及格"
    else:
        grade = "E"
        eval_text = "需努力"
    
    print(f"{subject:<8} {score:>8.1f}分 {grade:>6} {eval_text:>10}")

print(f"{'='*50}")

# 显示统计信息
print(f"\n📈 统计信息:")
print(f"  科目数量:{len(subjects)}科")
print(f"  总分:{total:.1f}分")
print(f"  平均分:{average:.1f}分")
print(f"  最高分:{highest:.1f}分")
print(f"  最低分:{lowest:.1f}分")

# 计算与满分的差距
perfect_score = 100 * len(subjects)
gap = perfect_score - total
print(f"  与满分差距:{gap:.1f}分")

🎨 第二部分:格式化成绩单

2.1 精美成绩单模板

# 精美成绩单模板
print("🎨 精美成绩单生成器")
print("=" * 50)

# 学生信息
student_info = {
    "name": "张小明",
    "class": "五年级二班",
    "student_id": "2023001",
    "exam_date": "2023-12-20",
    "teacher": "李老师"
}

# 成绩数据
grades = {
    "语文": 88.5,
    "数学": 92.0,
    "英语": 85.0,
    "科学": 90.5,
    "社会": 87.0,
    "美术": 95.0,
    "体育": 93.0,
    "音乐": 89.0
}

# 计算统计
total = sum(grades.values())
average = total / len(grades)
subject_count = len(grades)

# 生成成绩单
print("\n" + "⭐" * 20)
print(f"{'成绩报告单':^40}")
print("⭐" * 20)

# 学生信息
print(f"\n👤 学生姓名:{student_info['name']}")
print(f"🏫 所在班级:{student_info['class']}")
print(f"🆔 学号:{student_info['student_id']}")
print(f"📅 考试日期:{student_info['exam_date']}")
print(f"👨🏫 班主任:{student_info['teacher']}")

print(f"\n{'='*50}")
print(f"{'科目':<10} {'成绩':>8} {'等级':>8} {'评语':>15}")
print(f"{'='*50}")

# 各科成绩
for subject, score in grades.items():
    # 判断等级
    if score >= 90:
        grade = "A"
        comment = "优秀"
        symbol = "⭐"
    elif score >= 80:
        grade = "B"
        comment = "良好"
        symbol = "👍"
    elif score >= 70:
        grade = "C"
        comment = "中等"
        symbol = "💪"
    elif score >= 60:
        grade = "D"
        comment = "及格"
        symbol = "📈"
    else:
        grade = "E"
        comment = "加油"
        symbol = "💪"
    
    print(f"{subject:<10} {score:>8.1f}分 {grade:>8} {symbol} {comment:>10}")

print(f"{'='*50}")

# 统计信息
print(f"\n📊 成绩统计:")
print(f"{'-'*30}")
print(f"  科目总数:{subject_count:>8}科")
print(f"  总分:{total:>12.1f}分")
print(f"  平均分:{average:>11.1f}分")
print(f"  最高分:{max(grades.values()):>11.1f}分")
print(f"  最低分:{min(grades.values()):>11.1f}分")

# 总体评价
if average >= 90:
    overall = "🏆 优秀!继续保持!"
elif average >= 80:
    overall = "🎯 良好!继续努力!"
elif average >= 70:
    overall = "💪 中等!加油进步!"
elif average >= 60:
    overall = "📈 及格!需要加倍努力!"
else:
    overall = "🚩 不及格!要加油了!"

print(f"\n💬 总体评价:{overall}")
print(f"\n⭐" * 20)
print(f"{'祝学习进步!':^40}")
print("⭐" * 20)

2.2 带进度条的成绩单

# 带进度条的成绩单
print("📈 可视化成绩单")
print("=" * 50)

# 模拟数据
subjects = ["语文", "数学", "英语", "科学", "美术", "体育"]
scores = [85, 92, 78, 88, 95, 90]

print(f"\n📊 成绩进度图")
print(f"{'='*50}")

# 显示每个科目的进度条
for subject, score in zip(subjects, scores):
    # 计算进度条长度(每个百分点用2个字符)
    bar_length = int(score * 0.4)  # 100分对应40个字符
    
    # 选择颜色
    if score >= 90:
        bar_char = "█"
        color = "🟩"  # 绿色
    elif score >= 80:
        bar_char = "▓"
        color = "🟨"  # 黄色
    elif score >= 70:
        bar_char = "▒"
        color = "🟧"  # 橙色
    elif score >= 60:
        bar_char = "░"
        color = "🟥"  # 红色
    else:
        bar_char = " "
        color = "⬛"  # 黑色
    
    # 生成进度条
    progress_bar = bar_char * bar_length
    
    # 判断等级
    if score >= 90:
        grade = "A"
    elif score >= 80:
        grade = "B"
    elif score >= 70:
        grade = "C"
    elif score >= 60:
        grade = "D"
    else:
        grade = "E"
    
    # 显示
    print(f"{subject:4} [{color}{progress_bar:40}] {score:3}分 ({grade})")

print(f"{'='*50}")

# 计算统计
total = sum(scores)
average = total / len(scores)
highest = max(scores)
lowest = min(scores)

# 平均分进度条
avg_bar_length = int(average * 0.4)
avg_bar = "█" * avg_bar_length

if average >= 90:
    avg_color = "🟩"
    avg_grade = "优秀"
elif average >= 80:
    avg_color = "🟨"
    avg_grade = "良好"
elif average >= 70:
    avg_color = "🟧"
    avg_grade = "中等"
elif average >= 60:
    avg_color = "🟥"
    avg_grade = "及格"
else:
    avg_color = "⬛"
    avg_grade = "需努力"

print(f"\n📈 平均分 [{avg_color}{avg_bar:40}] {average:5.1f}分 ({avg_grade})")

# 显示统计
print(f"\n📊 统计信息:")
print(f"  总分:{total:6.1f}分")
print(f"  平均分:{average:5.1f}分")
print(f"  最高分:{highest:5.1f}分")
print(f"  最低分:{lowest:5.1f}分")
print(f"  科目数:{len(subjects):6}科")

# 进步空间
improvement = 100 - average
print(f"  进步空间:{improvement:4.1f}分")

if improvement < 10:
    print("\n💡 建议:已经很棒了!保持就是进步!")
elif improvement < 20:
    print("\n💡 建议:很不错!再努力一点点!")
elif improvement < 30:
    print("\n💡 建议:有进步空间,继续加油!")
else:
    print("\n💡 建议:需要制定学习计划,稳步提升!")

📁 第三部分:成绩管理系统

3.1 单个学生成绩管理

# 单个学生成绩管理系统
print("🎒 单个学生成绩管理系统")
print("=" * 50)

# 学生类
class Student:
    def __init__(self, name, student_id, class_name):
        """初始化学生信息"""
        self.name = name
        self.student_id = student_id
        self.class_name = class_name
        self.grades = {}  # 科目:成绩
        self.comments = []  # 评语
    
    def add_grade(self, subject, score):
        """添加成绩"""
        self.grades[subject] = score
    
    def calculate_total(self):
        """计算总分"""
        return sum(self.grades.values())
    
    def calculate_average(self):
        """计算平均分"""
        if not self.grades:
            return 0
        return self.calculate_total() / len(self.grades)
    
    def get_highest(self):
        """获取最高分"""
        if not self.grades:
            return 0
        return max(self.grades.values())
    
    def get_lowest(self):
        """获取最低分"""
        if not self.grades:
            return 0
        return min(self.grades.values())
    
    def get_grade_level(self, score):
        """获取成绩等级"""
        if score >= 90:
            return "A", "优秀"
        elif score >= 80:
            return "B", "良好"
        elif score >= 70:
            return "C", "中等"
        elif score >= 60:
            return "D", "及格"
        else:
            return "E", "需努力"
    
    def get_overall_evaluation(self):
        """获取总体评价"""
        average = self.calculate_average()
        
        if average >= 90:
            return "🏆 优秀!学习态度认真,成绩优异!"
        elif average >= 80:
            return "🎯 良好!学习努力,继续保持!"
        elif average >= 70:
            return "💪 中等!有进步空间,继续加油!"
        elif average >= 60:
            return "📈 及格!需要更加努力!"
        else:
            return "🚩 不及格!要制定学习计划,迎头赶上!"
    
    def display_report(self):
        """显示成绩报告"""
        print(f"\n{'='*60}")
        print(f"{'📊 学生成绩报告单':^60}")
        print(f"{'='*60}")
        
        # 基本信息
        print(f"\n👤 学生姓名:{self.name}")
        print(f"🏫 所在班级:{self.class_name}")
        print(f"🆔 学号:{self.student_id}")
        
        print(f"\n{'='*60}")
        print(f"{'科目':<10} {'成绩':>8} {'等级':>8} {'评价':>12} {'排名':>8}")
        print(f"{'='*60}")
        
        # 各科成绩
        for i, (subject, score) in enumerate(self.grades.items(), 1):
            grade, evaluation = self.get_grade_level(score)
            
            # 选择图标
            if grade == "A":
                icon = "⭐"
            elif grade == "B":
                icon = "👍"
            elif grade == "C":
                icon = "💪"
            elif grade == "D":
                icon = "📈"
            else:
                icon = "💪"
            
            print(f"{subject:<10} {score:>8.1f}分 {grade:>8} {icon} {evaluation:>10} #{i:>6}")
        
        print(f"{'='*60}")
        
        # 统计信息
        print(f"\n📈 成绩统计:")
        print(f"{'-'*40}")
        print(f"  科目总数:{len(self.grades):>6}科")
        print(f"  总分:{self.calculate_total():>10.1f}分")
        print(f"  平均分:{self.calculate_average():>9.1f}分")
        print(f"  最高分:{self.get_highest():>9.1f}分")
        print(f"  最低分:{self.get_lowest():>9.1f}分")
        
        # 总体评价
        print(f"\n💬 总体评价:{self.get_overall_evaluation()}")
        
        # 学习建议
        average = self.calculate_average()
        if average >= 90:
            suggestion = "继续保持优秀的学习习惯,可以挑战更高难度的学习内容。"
        elif average >= 80:
            suggestion = "良好的基础,可以在薄弱科目上多下功夫,争取全科优秀。"
        elif average >= 70:
            suggestion = "有进步空间,建议制定学习计划,重点突破薄弱科目。"
        elif average >= 60:
            suggestion = "需要加倍努力,建议寻求老师或同学帮助,打好基础。"
        else:
            suggestion = "需要立即制定详细学习计划,从基础开始,逐步提高。"
        
        print(f"\n💡 学习建议:{suggestion}")
        
        print(f"\n{'='*60}")
        print(f"{'祝:学习进步,天天向上!':^60}")
        print(f"{'='*60}")

# 使用示例
print("\n🎯 创建学生档案")

# 输入学生信息
name = input("学生姓名:")
student_id = input("学号:")
class_name = input("班级:")

# 创建学生对象
student = Student(name, student_id, class_name)

# 输入成绩
print(f"\n📝 输入{name}的成绩(输入'完成'结束):")

subject_count = 0
while True:
    subject = input(f"\n科目{subject_count+1}名称(输入'完成'结束):")
    if subject.lower() in ['完成', 'done', 'end']:
        break
    
    while True:
        try:
            score = float(input(f"{subject}成绩:"))
            if 0 <= score <= 100:
                student.add_grade(subject, score)
                subject_count += 1
                break
            else:
                print("⚠️ 成绩应该在0-100之间!")
        except ValueError:
            print("❌ 请输入数字!")

# 显示成绩报告
if student.grades:
    student.display_report()
    
    # 保存到文件
    save = input("\n💾 是否保存成绩报告到文件?(是/否): ")
    if save.lower() in ['是', 'yes', 'y']:
        filename = f"{name}_成绩报告.txt"
        try:
            with open(filename, 'w', encoding='utf-8') as f:
                # 这里可以添加文件保存代码
                f.write(f"学生姓名:{name}\n")
                f.write(f"学号:{student_id}\n")
                f.write(f"班级:{class_name}\n\n")
                
                for subject, score in student.grades.items():
                    f.write(f"{subject}:{score}分\n")
                
                f.write(f"\n总分:{student.calculate_total()}分\n")
                f.write(f"平均分:{student.calculate_average():.1f}分\n")
            
            print(f"✅ 已保存到:{filename}")
        except:
            print("❌ 保存失败!")
else:
    print("❌ 没有输入任何成绩!")

3.2 班级成绩管理系统

# 班级成绩管理系统
print("👥 班级成绩管理系统")
print("=" * 50)

class ClassGradeManager:
    def __init__(self, class_name, teacher):
        """初始化班级信息"""
        self.class_name = class_name
        self.teacher = teacher
        self.students = []  # 学生列表
        self.subjects = ["语文", "数学", "英语", "科学", "社会"]
    
    def add_student(self, name, student_id):
        """添加学生"""
        student = {
            "name": name,
            "id": student_id,
            "grades": {},
            "total": 0,
            "average": 0,
            "rank": 0
        }
        self.students.append(student)
        print(f"✅ 添加学生:{name} (学号:{student_id})")
    
    def input_grades(self):
        """输入成绩"""
        if not self.students:
            print("❌ 还没有学生!")
            return
        
        print(f"\n📝 输入{self.class_name}班成绩")
        print("-" * 30)
        
        for student in self.students:
            print(f"\n👤 学生:{student['name']} (学号:{student['id']})")
            
            total = 0
            for subject in self.subjects:
                while True:
                    try:
                        score = float(input(f"  {subject}成绩:"))
                        if 0 <= score <= 100:
                            student['grades'][subject] = score
                            total += score
                            break
                        else:
                            print("    ⚠️ 成绩应该在0-100之间!")
                    except ValueError:
                        print("    ❌ 请输入数字!")
            
            student['total'] = total
            student['average'] = total / len(self.subjects)
    
    def calculate_ranks(self):
        """计算排名"""
        # 按总分排序
        sorted_students = sorted(self.students, key=lambda x: x['total'], reverse=True)
        
        # 分配名次
        for i, student in enumerate(sorted_students, 1):
            student['rank'] = i
    
    def display_class_report(self):
        """显示班级成绩报告"""
        if not self.students:
            print("❌ 还没有学生数据!")
            return
        
        self.calculate_ranks()
        
        print(f"\n{'='*70}")
        print(f"{'📊 班级成绩报告单':^70}")
        print(f"{'='*70}")
        
        print(f"\n🏫 班级:{self.class_name}")
        print(f"👨🏫 班主任:{self.teacher}")
        print(f"👥 学生人数:{len(self.students)}人")
        print(f"📚 考试科目:{len(self.subjects)}科")
        
        print(f"\n{'='*70}")
        print(f"{'排名':<6} {'姓名':<8} {'学号':<10}", end="")
        for subject in self.subjects:
            print(f" {subject:<6}", end="")
        print(f" {'总分':<8} {'平均分':<8} {'等级':<6}")
        print(f"{'-'*70}")
        
        for student in sorted(self.students, key=lambda x: x['rank']):
            # 判断等级
            avg = student['average']
            if avg >= 90:
                grade = "A"
                grade_icon = "⭐"
            elif avg >= 80:
                grade = "B"
                grade_icon = "👍"
            elif avg >= 70:
                grade = "C"
                grade_icon = "💪"
            elif avg >= 60:
                grade = "D"
                grade_icon = "📈"
            else:
                grade = "E"
                grade_icon = "💪"
            
            # 显示学生信息
            print(f"{student['rank']:^6} {student['name']:<8} {student['id']:<10}", end="")
            
            # 显示各科成绩
            for subject in self.subjects:
                score = student['grades'].get(subject, 0)
                print(f" {score:>6.1f}", end="")
            
            # 显示统计
            print(f" {student['total']:>8.1f} {student['average']:>8.1f} {grade_icon} {grade:>6}")
        
        print(f"{'='*70}")
        
        # 班级统计
        class_total_avg = sum(s['average'] for s in self.students) / len(self.students)
        class_highest_avg = max(s['average'] for s in self.students)
        class_lowest_avg = min(s['average'] for s in self.students)
        
        # 各科平均分
        print(f"\n📈 班级各科平均分:")
        for subject in self.subjects:
            subject_avg = sum(s['grades'].get(subject, 0) for s in self.students) / len(self.students)
            print(f"  {subject}:{subject_avg:6.1f}分")
        
        print(f"\n📊 班级总体统计:")
        print(f"  班级平均分:{class_total_avg:6.1f}分")
        print(f"  最高平均分:{class_highest_avg:6.1f}分")
        print(f"  最低平均分:{class_lowest_avg:6.1f}分")
        
        # 优秀率(平均分≥85)
        excellent_count = sum(1 for s in self.students if s['average'] >= 85)
        excellent_rate = (excellent_count / len(self.students)) * 100
        
        # 及格率(平均分≥60)
        pass_count = sum(1 for s in self.students if s['average'] >= 60)
        pass_rate = (pass_count / len(self.students)) * 100
        
        print(f"\n📈 班级评级:")
        print(f"  优秀率:{excellent_rate:6.1f}% ({excellent_count}/{len(self.students)})")
        print(f"  及格率:{pass_rate:6.1f}% ({pass_count}/{len(self.students)})")
        
        # 班级评价
        if class_total_avg >= 85:
            eval_text = "🏆 优秀班级!继续保持!"
        elif class_total_avg >= 75:
            eval_text = "🎯 良好班级!继续努力!"
        elif class_total_avg >= 65:
            eval_text = "💪 中等班级!加油进步!"
        else:
            eval_text = "📈 需要努力!一起加油!"
        
        print(f"\n💬 班级评价:{eval_text}")
        print(f"{'='*70}")

# 使用示例
print("\n🏫 创建班级信息")
class_name = input("班级名称:")
teacher = input("班主任:")

# 创建班级管理器
manager = ClassGradeManager(class_name, teacher)

# 添加学生
print(f"\n👥 添加学生(输入'完成'结束):")
student_count = 0
while True:
    name = input(f"\n学生{student_count+1}姓名(输入'完成'结束):")
    if name.lower() in ['完成', 'done', 'end']:
        break
    
    student_id = input(f"学号:")
    manager.add_student(name, student_id)
    student_count += 1

# 输入成绩
if manager.students:
    input_grades = input("\n📝 现在输入成绩吗?(是/否): ")
    if input_grades.lower() in ['是', 'yes', 'y']:
        manager.input_grades()
        
        # 显示报告
        display_report = input("\n📊 显示班级成绩报告吗?(是/否): ")
        if display_report.lower() in ['是', 'yes', 'y']:
            manager.display_class_report()
            
            # 保存报告
            save = input("\n💾 是否保存班级报告?(是/否): ")
            if save.lower() in ['是', 'yes', 'y']:
                filename = f"{class_name}_成绩报告.txt"
                try:
                    with open(filename, 'w', encoding='utf-8') as f:
                        f.write(f"班级:{class_name}\n")
                        f.write(f"班主任:{teacher}\n")
                        f.write(f"学生人数:{len(manager.students)}\n\n")
                        
                        for student in manager.students:
                            f.write(f"{student['name']}:")
                            for subject in manager.subjects:
                                score = student['grades'].get(subject, 0)
                                f.write(f"{subject}{score}分 ")
                            f.write(f"总分{student['total']}分\n")
                    
                    print(f"✅ 已保存到:{filename}")
                except:
                    print("❌ 保存失败!")
    else:
        print("❌ 没有输入成绩!")
else:
    print("❌ 没有添加学生!")

📈 第四部分:进阶功能

4.1 成绩趋势分析

# 成绩趋势分析
print("📈 成绩趋势分析工具")
print("=" * 50)

def analyze_grades(grades_dict):
    """
    分析成绩趋势
    
    参数:
        grades_dict: 科目成绩字典
    
    返回:
        分析结果字典
    """
    if not grades_dict:
        return {"error": "没有成绩数据"}
    
    subjects = list(grades_dict.keys())
    scores = list(grades_dict.values())
    
    # 基础统计
    total = sum(scores)
    average = total / len(scores)
    highest = max(scores)
    lowest = min(scores)
    
    # 找出最高和最低的科目
    highest_subject = subjects[scores.index(highest)]
    lowest_subject = subjects[scores.index(lowest)]
    
    # 分析优势科目和薄弱科目
    strong_subjects = []
    weak_subjects = []
    
    for subject, score in grades_dict.items():
        if score >= 90:
            strong_subjects.append((subject, score))
        elif score < 70:
            weak_subjects.append((subject, score))
    
    # 计算与平均分的差距
    gaps = {}
    for subject, score in grades_dict.items():
        gaps[subject] = score - average
    
    return {
        "total": total,
        "average": average,
        "highest": highest,
        "lowest": lowest,
        "highest_subject": highest_subject,
        "lowest_subject": lowest_subject,
        "strong_subjects": strong_subjects,
        "weak_subjects": weak_subjects,
        "gaps": gaps,
        "subject_count": len(subjects)
    }

def display_analysis(analysis):
    """显示分析结果"""
    if "error" in analysis:
        print(analysis["error"])
        return
    
    print(f"\n{'='*50}")
    print(f"{'📈 成绩分析报告':^50}")
    print(f"{'='*50}")
    
    print(f"\n📊 基础统计:")
    print(f"  科目总数:{analysis['subject_count']:>6}科")
    print(f"  总分:{analysis['total']:>10.1f}分")
    print(f"  平均分:{analysis['average']:>9.1f}分")
    print(f"  最高分:{analysis['highest']:>9.1f}分 ({analysis['highest_subject']})")
    print(f"  最低分:{analysis['lowest']:>9.1f}分 ({analysis['lowest_subject']})")
    
    # 优势科目
    if analysis['strong_subjects']:
        print(f"\n⭐ 优势科目:")
        for subject, score in analysis['strong_subjects']:
            print(f"  • {subject}: {score:.1f}分 (优秀!)")
    
    # 薄弱科目
    if analysis['weak_subjects']:
        print(f"\n📈 需要加强的科目:")
        for subject, score in analysis['weak_subjects']:
            gap = 70 - score
            print(f"  • {subject}: {score:.1f}分 (还需提高{gap:.1f}分)")
    
    # 与平均分的差距
    print(f"\n📉 各科与平均分的差距:")
    for subject, gap in analysis['gaps'].items():
        if gap > 0:
            print(f"  • {subject}: +{gap:.1f}分 (高于平均分)")
        elif gap < 0:
            print(f"  • {subject}: {gap:.1f}分 (低于平均分)")
        else:
            print(f"  • {subject}: 正好是平均分")
    
    # 学习建议
    print(f"\n💡 学习建议:")
    
    if analysis['average'] >= 90:
        if analysis['weak_subjects']:
            print("  优势明显,重点加强薄弱科目,争取全科优秀!")
        else:
            print("  全科优秀!可以挑战更高难度的学习内容。")
    elif analysis['average'] >= 80:
        if analysis['weak_subjects']:
            print("  整体良好,集中精力提高薄弱科目。")
        else:
            print("  各科均衡,稳步提高,争取进入优秀行列。")
    elif analysis['average'] >= 70:
        print("  中等水平,需要制定详细学习计划,重点突破。")
    elif analysis['average'] >= 60:
        print("  及格水平,需要加倍努力,从基础开始巩固。")
    else:
        print("  需要立即寻求帮助,制定个性化学习方案。")
    
    print(f"\n{'='*50}")

# 使用示例
print("\n📝 输入成绩进行分析")

grades = {}
while True:
    subject = input("\n科目名称(输入'完成'结束):")
    if subject.lower() in ['完成', 'done', 'end']:
        break
    
    try:
        score = float(input(f"{subject}成绩:"))
        if 0 <= score <= 100:
            grades[subject] = score
        else:
            print("⚠️ 成绩应该在0-100之间!")
    except ValueError:
        print("❌ 请输入数字!")

# 进行分析
if grades:
    analysis = analyze_grades(grades)
    display_analysis(analysis)
else:
    print("❌ 没有输入成绩!")

4.2 目标成绩计算器

# 目标成绩计算器
print("🎯 目标成绩计算器")
print("=" * 50)

def calculate_target(current_grades, target_average, new_subjects_count=0):
    """
    计算需要达到的目标成绩
    
    参数:
        current_grades: 当前成绩列表
        target_average: 目标平均分
        new_subjects_count: 新增科目数量
    
    返回:
        计算结果字典
    """
    if not current_grades:
        return {"error": "没有当前成绩数据"}
    
    # 当前统计
    current_total = sum(current_grades)
    current_count = len(current_grades)
    current_average = current_total / current_count
    
    # 计算需要的总成绩
    total_subjects = current_count + new_subjects_count
    needed_total = target_average * total_subjects
    
    # 计算需要在新增科目中获得的分数
    if new_subjects_count > 0:
        needed_new_total = needed_total - current_total
        needed_new_average = needed_new_total / new_subjects_count
    else:
        needed_new_total = 0
        needed_new_average = 0
    
    # 计算平均需要提高的分数
    improvement_per_subject = (target_average - current_average) * total_subjects / current_count
    
    return {
        "current_average": current_average,
        "target_average": target_average,
        "current_total": current_total,
        "needed_total": needed_total,
        "improvement_needed": target_average - current_average,
        "improvement_per_subject": improvement_per_subject,
        "needed_new_average": needed_new_average,
        "current_subject_count": current_count,
        "new_subject_count": new_subjects_count
    }

def display_target_calculation(result):
    """显示目标计算结果"""
    if "error" in result:
        print(result["error"])
        return
    
    print(f"\n{'='*50}")
    print(f"{'🎯 目标成绩分析':^50}")
    print(f"{'='*50}")
    
    print(f"\n📊 当前情况:")
    print(f"  当前平均分:{result['current_average']:.1f}分")
    print(f"  目标平均分:{result['target_average']:.1f}分")
    print(f"  需要提高:{result['improvement_needed']:.1f}分")
    
    if result['new_subject_count'] > 0:
        print(f"\n📈 新增{result['new_subject_count']}科后:")
        print(f"  需要在新增科目中平均获得:{result['needed_new_average']:.1f}分")
    
    print(f"\n💡 达成目标的建议:")
    
    improvement = result['improvement_needed']
    
    if improvement <= 0:
        print("  ✅ 已经达到目标!继续保持!")
    elif improvement <= 5:
        print(f"  📈 只需提高{improvement:.1f}分,轻松可达!")
        print("  建议:保持当前学习节奏,注意细节。")
    elif improvement <= 10:
        print(f"  🎯 需要提高{improvement:.1f}分,需要努力!")
        print("  建议:增加学习时间,重点复习薄弱点。")
    elif improvement <= 20:
        print(f"  💪 需要提高{improvement:.1f}分,需要加倍努力!")
        print("  建议:制定详细计划,寻求老师帮助。")
    else:
        print(f"  🚩 需要提高{improvement:.1f}分,需要重大改进!")
        print("  建议:全面调整学习方法,从基础开始。")
    
    # 分科目提高建议
    if result['current_subject_count'] > 0 and improvement > 0:
        per_subject = result['improvement_per_subject']
        print(f"\n📚 分科目提高建议:")
        print(f"  平均每科需要提高:{per_subject:.1f}分")
        
        if per_subject <= 3:
            print("  • 每次作业多检查一遍")
            print("  • 上课多回答一个问题")
        elif per_subject <= 6:
            print("  • 每天多复习30分钟")
            print("  • 多做一套练习题")
        elif per_subject <= 10:
            print("  • 制定每日学习计划")
            print("  • 重点攻克薄弱知识点")
        else:
            print("  • 需要系统性的学习计划")
            print("  • 考虑课外辅导或学习小组")
    
    print(f"\n{'='*50}")

# 使用示例
print("\n🎯 计算目标成绩")

# 输入当前成绩
current_grades = []
print("\n📝 输入当前各科成绩(输入'完成'结束):")

while True:
    try:
        grade_input = input(f"科目{len(current_grades)+1}成绩(输入'完成'结束):")
        if grade_input.lower() in ['完成', 'done', 'end']:
            break
        
        grade = float(grade_input)
        if 0 <= grade <= 100:
            current_grades.append(grade)
        else:
            print("⚠️ 成绩应该在0-100之间!")
    except ValueError:
        print("❌ 请输入数字!")

if current_grades:
    # 输入目标
    while True:
        try:
            target_average = float(input("\n🎯 目标平均分:"))
            if 0 <= target_average <= 100:
                break
            else:
                print("⚠️ 平均分应该在0-100之间!")
        except ValueError:
            print("❌ 请输入数字!")
    
    # 是否新增科目
    new_subjects = input("\n📚 下学期会增加新科目吗?(是/否): ")
    new_subjects_count = 0
    
    if new_subjects.lower() in ['是', 'yes', 'y']:
        while True:
            try:
                new_subjects_count = int(input("新增几门科目?"))
                if new_subjects_count >= 0:
                    break
                else:
                    print("⚠️ 请输入非负数!")
            except ValueError:
                print("❌ 请输入整数!")
    
    # 计算
    result = calculate_target(current_grades, target_average, new_subjects_count)
    display_target_calculation(result)
else:
    print("❌ 没有输入成绩!")

📅 下节课预告

第19课:单位转换器——长度、重量、温度转换

下节课你将学习:

  1. 长度单位转换(米、厘米、千米、英尺、英寸)
  2. 重量单位转换(千克、克、斤、磅)
  3. 温度单位转换(摄氏度、华氏度)
  4. 制作多功能单位转换器
  5. 实际生活中的单位转换应用

预习思考

  1. 1米等于多少厘米?多少英尺?
  2. 1千克等于多少克?多少斤?
  3. 摄氏度和华氏度如何转换?

💬 给家长的话

亲爱的家长

今天孩子学习了成绩单的制作和分析,这是将编程与学习结合的实际应用,能帮助孩子更好地理解数据处理和数学计算。

孩子今天学会了

  1. ✅ 计算多个成绩的总分和平均分
  2. ✅ 制作格式化的漂亮成绩单
  3. ✅ 判断成绩等级和给出评语
  4. ✅ 管理班级成绩数据
  5. ✅ 分析成绩趋势和制定目标

成绩管理的实际价值

| 技能 | 在成绩管理中的应用 | 教育意义 | 能力培养 |

|------|------------------|---------|---------|

| 数学计算 | 计算总分、平均分 | 数学应用 | 计算能力 |

| 数据处理 | 管理多科成绩 | 数据分析 | 逻辑思维 |

| 格式化输出 | 制作成绩单 | 展示能力 | 审美能力 |

| 条件判断 | 判断等级、给出评语 | 评价思维 | 判断能力 |

您可以这样做

学习应用

  1. 实际使用:用这个程序管理孩子的真实成绩
  2. 目标设定:一起设定学习目标并跟踪进度
  3. 数据分析:分析成绩趋势,找出强弱项
  4. 学习计划:根据分析结果制定学习计划

思维训练

  1. 讨论:如何公平地评价学习成绩?
  2. 思考:成绩单应该包含哪些信息?
  3. 设计:如何改进成绩单的显示效果?
  4. 实践:用程序帮助管理学习进度

温馨提示

  • 成绩是学习的反馈,不是唯一标准
  • 鼓励孩子关注进步过程,而不只是分数
  • 通过数据分析找到学习方法
  • 用技术帮助学习,让学习更有趣

🏆 今日成就

完成了今天的学习,你:

📊 掌握了成绩计算方法

🎨 学会了格式化输出

📈 能制作专业成绩单

🎯 会分析成绩趋势

💡 能给学习建议

挑战任务

  1. 制作自己的真实成绩单
  2. 为班级制作成绩管理系统
  3. 设计个性化学习目标计算器
  4. 分析一学期的成绩变化趋势

🌟 编程心法

数据是学习的一面镜子
成绩是努力的一个标尺
用代码收集数据
用计算分析趋势
用格式呈现结果
用建议指引方向
编程让学习可视化
数据让进步可衡量
从今天起
用技术管理学习
用数据驱动进步

记住:编程不仅是创造工具,更是解决问题的方法。用编程帮助学习,让技术为成长服务!


第18课结束。你现在已经是成绩管理小专家了!

实践任务:

1. 制作个人学期成绩单

2. 设计班级成绩管理系统

3. 创建学习目标计算器

4. 分析成绩进步趋势

下节课,让我们学习单位转换,用编程解决实际问题!

第19课见!📏