第25课:成绩评定系统——根据分数判断等级

🎯 本课目标

  • 综合运用条件判断知识制作完整系统
  • 掌握多等级评定的逻辑设计
  • 学会根据分数给出详细评语和建议
  • 培养系统化思考和程序设计能力
  • 制作可复用的成绩评定函数

🤔 趣味引入:老师的"评分秘籍"

想象一下:老师批改试卷时,心里有个"评分秘籍":

  • 📝 100分 → "满分!太厉害了!"
  • 🌟 90-99分 → "优秀!继续保持!"
  • 👍 80-89分 → "良好!不错的表现!"
  • 💪 70-79分 → "中等!还有进步空间!"
  • 📈 60-69分 → "及格!需要更努力!"
  • 📚 0-59分 → "不及格!要加油了!"

今天,让我们一起用Python制作智能成绩评定系统,成为老师的得力助手!


🔧 第一部分:基础成绩评定

1.1 简单的等级判断

# 基础成绩评定
print("📊 基础成绩评定系统")
print("=" * 50)

def get_grade(score):
    """根据分数返回等级"""
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
    else:
        return "F"

def get_grade_name(grade):
    """根据等级返回中文名称"""
    if grade == "A":
        return "优秀"
    elif grade == "B":
        return "良好"
    elif grade == "C":
        return "中等"
    elif grade == "D":
        return "及格"
    else:
        return "不及格"

# 测试不同分数
test_scores = [95, 82, 73, 68, 45, 100, 59, 88]

print("📋 成绩等级对照表:")
print("-" * 40)
print(f"{'分数':>8} {'等级':>6} {'评价':>10}")
print("-" * 40)

for score in test_scores:
    grade = get_grade(score)
    grade_name = get_grade_name(grade)
    print(f"{score:>8}分 {grade:>6} {grade_name:>10}")

print("-" * 40)

1.2 带评语的评定系统

# 带评语的成绩评定
print("\n📝 带评语的成绩评定系统")
print("=" * 50)

def evaluate_score(score):
    """评定成绩并返回详细评语"""
    
    if score < 0 or score > 100:
        return "❌ 无效分数!请输入0-100之间的分数"
    
    if score == 100:
        grade = "A+"
        comment = "🏆 满分!你是最棒的!继续保持!"
        suggestion = "挑战更高难度的题目吧!"
        
    elif score >= 95:
        grade = "A"
        comment = "⭐ 非常优秀!接近满分!"
        suggestion = "检查一下哪里扣分了,争取下次满分!"
        
    elif score >= 90:
        grade = "A-"
        comment = "🌟 优秀!掌握得很好!"
        suggestion = "继续保持,向满分冲刺!"
        
    elif score >= 85:
        grade = "B+"
        comment = "👍 良好!表现不错!"
        suggestion = "再细心一点,就能进入优秀行列!"
        
    elif score >= 80:
        grade = "B"
        comment = "👌 良好!基础扎实!"
        suggestion = "多做一些练习题,巩固知识!"
        
    elif score >= 75:
        grade = "C+"
        comment = "💪 中等偏上!有进步!"
        suggestion = "找出薄弱环节,针对性复习!"
        
    elif score >= 70:
        grade = "C"
        comment = "📈 中等!还有提升空间!"
        suggestion = "制定学习计划,每天进步一点点!"
        
    elif score >= 65:
        grade = "D+"
        comment = "📖 及格偏上!需要努力!"
        suggestion = "多花时间复习,不懂就问老师!"
        
    elif score >= 60:
        grade = "D"
        comment = "📚 刚好及格!要加油了!"
        suggestion = "需要更加认真对待学习!"
        
    else:
        grade = "F"
        comment = "💔 不及格!需要加倍努力!"
        suggestion = "从基础开始复习,寻求老师和同学的帮助!"
    
    return {
        "score": score,
        "grade": grade,
        "comment": comment,
        "suggestion": suggestion
    }

# 交互式评定
print("欢迎使用智能成绩评定系统!")
print("=" * 40)

try:
    user_score = float(input("请输入考试成绩(0-100):"))
    result = evaluate_score(user_score)
    
    if isinstance(result, dict):
        print(f"\n{'='*40}")
        print(f"📊 成绩评定结果")
        print(f"{'='*40}")
        print(f"📝 分数:{result['score']}分")
        print(f"🏅 等级:{result['grade']}")
        print(f"💬 评语:{result['comment']}")
        print(f"💡 建议:{result['suggestion']}")
        print(f"{'='*40}")
    else:
        print(result)
        
except ValueError:
    print("❌ 请输入有效的数字!")

📊 第二部分:多维度评定系统

2.1 多科目成绩评定

# 多科目成绩评定
print("\n📚 多科目成绩评定系统")
print("=" * 50)

def evaluate_subject(subject, score):
    """评定单科成绩"""
    if score >= 90:
        level = "优秀"
        emoji = "🌟"
    elif score >= 80:
        level = "良好"
        emoji = "👍"
    elif score >= 70:
        level = "中等"
        emoji = "💪"
    elif score >= 60:
        level = "及格"
        emoji = "📈"
    else:
        level = "不及格"
        emoji = "📚"
    
    return f"{emoji} {subject}:{score}分 - {level}"

def calculate_average(scores_dict):
    """计算平均分"""
    total = sum(scores_dict.values())
    count = len(scores_dict)
    return total / count

def get_overall_grade(average):
    """根据平均分返回总体等级"""
    if average >= 90:
        return "A", "优秀", "🏆"
    elif average >= 80:
        return "B", "良好", "🎯"
    elif average >= 70:
        return "C", "中等", "💪"
    elif average >= 60:
        return "D", "及格", "📈"
    else:
        return "F", "不及格", "📚"

# 输入各科成绩
print("请输入各科成绩:")
print("-" * 30)

subjects = ["语文", "数学", "英语", "科学"]
scores = {}

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

# 显示各科评定
print(f"\n{'='*50}")
print(f"{'📋 成绩评定报告':^50}")
print(f"{'='*50}")

print(f"\n各科成绩评定:")
for subject in subjects:
    print(evaluate_subject(subject, scores[subject]))

# 计算总体
average = calculate_average(scores)
grade, grade_name, emoji = get_overall_grade(average)

print(f"\n{'='*50}")
print(f"📊 总体评定:")
print(f"  平均分:{average:.1f}分")
print(f"  总体等级:{emoji} {grade}({grade_name})")

# 总体评语
if average >= 95:
    print(f"\n💬 评语:全能学霸!各科都很优秀!")
elif average >= 90:
    print(f"\n💬 评语:非常优秀!继续保持!")
elif average >= 85:
    print(f"\n💬 评语:整体表现良好!")
elif average >= 80:
    print(f"\n💬 评语:基础扎实,继续努力!")
elif average >= 70:
    print(f"\n💬 评语:有进步空间,加油!")
elif average >= 60:
    print(f"\n💬 评语:刚过及格线,需要更努力!")
else:
    print(f"\n💬 评语:需要认真反思,加倍努力!")

# 找出最强和最弱科目
best_subject = max(scores, key=scores.get)
worst_subject = min(scores, key=scores.get)

print(f"\n📈 科目分析:")
print(f"  🏆 最强科目:{best_subject}({scores[best_subject]}分)")
print(f"  📚 待加强:{worst_subject}({scores[worst_subject]}分)")

# 给出针对性建议
print(f"\n💡 学习建议:")
if scores[worst_subject] < 60:
    print(f"  • {worst_subject}需要重点补习!")
    print(f"  • 建议每天多花30分钟复习")
elif scores[worst_subject] < 70:
    print(f"  • {worst_subject}还有提升空间")
    print(f"  • 多做题,查漏补缺")

if best_subject == worst_subject:
    print("  • 各科均衡发展,很好!")
else:
    gap = scores[best_subject] - scores[worst_subject]
    if gap > 20:
        print(f"  • 注意平衡各科,避免偏科")

2.2 进步趋势分析

# 进步趋势分析
print("\n📈 进步趋势分析系统")
print("=" * 50)

def analyze_progress(scores_list):
    """分析成绩进步趋势"""
    if len(scores_list) < 2:
        return "需要至少两次成绩才能分析趋势"
    
    changes = []
    for i in range(1, len(scores_list)):
        change = scores_list[i] - scores_list[i-1]
        changes.append(change)
    
    total_change = sum(changes)
    avg_change = total_change / len(changes)
    max_improve = max(changes)
    max_decline = min(changes)
    
    return {
        "changes": changes,
        "total_change": total_change,
        "avg_change": avg_change,
        "max_improve": max_improve,
        "max_decline": max_decline,
        "count": len(scores_list)
    }

def get_trend_description(analysis):
    """获取趋势描述"""
    total = analysis["total_change"]
    
    if total > 30:
        return "🚀 飞速进步!太棒了!"
    elif total > 20:
        return "📈 明显进步!继续保持!"
    elif total > 10:
        return "👍 有所进步!继续加油!"
    elif total > 0:
        return "📊 小幅进步,再接再厉!"
    elif total == 0:
        return "➡️ 成绩稳定,寻求突破!"
    elif total > -10:
        return "📉 略有退步,需要重视!"
    elif total > -20:
        return "⬇️ 退步明显,找出原因!"
    else:
        return "🔻 大幅退步,紧急补救!"

# 输入多次成绩
print("欢迎使用进步趋势分析系统!")
print("请输入同一科目的多次考试成绩\n")

subject = input("科目名称:")
scores_list = []

print(f"请输入{subject}的各次考试成绩(输入-1结束):")
while True:
    try:
        score = float(input(f"第{len(scores_list)+1}次成绩:"))
        if score == -1:
            break
        if 0 <= score <= 100:
            scores_list.append(score)
        else:
            print("⚠️ 成绩应在0-100之间!")
    except ValueError:
        print("❌ 请输入数字!")

if len(scores_list) >= 2:
    analysis = analyze_progress(scores_list)
    
    print(f"\n{'='*50}")
    print(f"{'📊 进步趋势分析报告':^50}")
    print(f"{'='*50}")
    
    print(f"\n📝 科目:{subject}")
    print(f"📋 成绩记录:{scores_list}")
    
    print(f"\n📈 成绩变化:")
    for i, (before, after) in enumerate(zip(scores_list[:-1], scores_list[1:]), 1):
        change = after - before
        if change > 0:
            arrow = "↑"
            color = "📈"
        elif change < 0:
            arrow = "↓"
            color = "📉"
        else:
            arrow = "→"
            color = "➡️"
        print(f"  第{i}次→第{i+1}次:{before}→{after} {color} {arrow}{abs(change):.1f}分")
    
    print(f"\n📊 统计分析:")
    print(f"  总变化:{analysis['total_change']:+.1f}分")
    print(f"  平均每次变化:{analysis['avg_change']:+.1f}分")
    print(f"  最大进步:+{analysis['max_improve']:.1f}分")
    
    if analysis['max_decline'] < 0:
        print(f"  最大退步:{analysis['max_decline']:.1f}分")
    
    print(f"\n💬 总体评价:{get_trend_description(analysis)}")
    
    # 给出建议
    if analysis['total_change'] > 0:
        print(f"💡 建议:继续保持好的学习方法!")
    elif analysis['total_change'] == 0:
        print(f"💡 建议:尝试新的学习方法,寻求突破!")
    else:
        print(f"💡 建议:找出退步原因,调整学习策略!")
        if analysis['max_decline'] < -10:
            print(f"  特别注意:第{analysis['changes'].index(analysis['max_decline'])+1}次退步较大")
    
elif len(scores_list) == 1:
    print(f"\n📝 只有一次成绩:{scores_list[0]}分")
    print("💡 再多考几次才能分析趋势哦!")
else:
    print("❌ 没有输入有效成绩!")

🎯 第三部分:综合成绩管理系统

3.1 完整成绩管理系统

# 完整成绩管理系统
print("\n🏫 完整成绩管理系统")
print("=" * 50)

class GradeManager:
    """成绩管理器类"""
    
    def __init__(self, student_name, class_name):
        self.student_name = student_name
        self.class_name = class_name
        self.scores = {}
        self.subjects = []
    
    def add_subject(self, subject, score):
        """添加科目成绩"""
        if 0 <= score <= 100:
            self.scores[subject] = score
            if subject not in self.subjects:
                self.subjects.append(subject)
            return True
        return False
    
    def remove_subject(self, subject):
        """删除科目"""
        if subject in self.scores:
            del self.scores[subject]
            self.subjects.remove(subject)
            return True
        return False
    
    def update_score(self, subject, new_score):
        """更新成绩"""
        if subject in self.scores and 0 <= new_score <= 100:
            self.scores[subject] = new_score
            return True
        return False
    
    def get_total(self):
        """计算总分"""
        return sum(self.scores.values())
    
    def get_average(self):
        """计算平均分"""
        if not self.scores:
            return 0
        return self.get_total() / len(self.scores)
    
    def get_max_subject(self):
        """获取最高分科目"""
        if not self.scores:
            return None, 0
        subject = max(self.scores, key=self.scores.get)
        return subject, self.scores[subject]
    
    def get_min_subject(self):
        """获取最低分科目"""
        if not self.scores:
            return None, 0
        subject = min(self.scores, key=self.scores.get)
        return subject, self.scores[subject]
    
    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 "F", "不及格", "📚"
    
    def get_overall_evaluation(self):
        """获取总体评价"""
        avg = self.get_average()
        
        if avg >= 95:
            return "🏆 全能学霸!各科都非常优秀!"
        elif avg >= 90:
            return "🌟 非常优秀!继续保持!"
        elif avg >= 85:
            return "🎯 表现良好!再接再厉!"
        elif avg >= 80:
            return "👍 基础扎实!继续进步!"
        elif avg >= 75:
            return "💪 中等偏上!有提升空间!"
        elif avg >= 70:
            return "📈 中等水平!需要更多努力!"
        elif avg >= 60:
            return "📚 刚过及格线!要加油了!"
        else:
            return "💔 需要认真反思,加倍努力!"
    
    def display_report(self):
        """显示成绩报告"""
        print(f"\n{'='*60}")
        print(f"{'📋 学生成绩报告单':^60}")
        print(f"{'='*60}")
        
        print(f"\n👤 姓名:{self.student_name}")
        print(f"🏫 班级:{self.class_name}")
        print(f"📅 评定日期:2024年1月")
        
        print(f"\n{'='*60}")
        print(f"{'科目':<10} {'成绩':>8} {'等级':>6} {'评价':>12} {'建议':>20}")
        print(f"{'='*60}")
        
        for subject in self.subjects:
            score = self.scores[subject]
            grade, grade_name, emoji = self.get_grade_level(score)
            
            # 根据等级给出简短建议
            if grade == "A":
                advice = "继续保持!"
            elif grade == "B":
                advice = "争取优秀!"
            elif grade == "C":
                advice = "多多练习!"
            elif grade == "D":
                advice = "需要努力!"
            else:
                advice = "加紧补习!"
            
            print(f"{subject:<10} {score:>8.1f}分 {emoji} {grade:<4} {grade_name:<10} {advice:<12}")
        
        print(f"{'='*60}")
        
        # 统计信息
        avg = self.get_average()
        total = self.get_total()
        max_sub, max_score = self.get_max_subject()
        min_sub, min_score = self.get_min_subject()
        
        print(f"\n📊 统计信息:")
        print(f"  科目数:{len(self.subjects)}科")
        print(f"  总分:{total:.1f}分")
        print(f"  平均分:{avg:.1f}分")
        print(f"  最高分:{max_sub}({max_score:.1f}分)")
        print(f"  最低分:{min_sub}({min_score:.1f}分)")
        
        # 等级分布
        print(f"\n📈 等级分布:")
        for grade_name in ["优秀", "良好", "中等", "及格", "不及格"]:
            count = 0
            for subject in self.subjects:
                _, name, _ = self.get_grade_level(self.scores[subject])
                if name == grade_name:
                    count += 1
            if count > 0:
                bar = "█" * count
                print(f"  {grade_name}:{bar} {count}科")
        
        # 总体评价
        print(f"\n💬 总体评价:{self.get_overall_evaluation()}")
        
        # 学习建议
        print(f"\n💡 学习建议:")
        if min_score < 60:
            print(f"  • 重点关注{min_sub},需要补习基础")
        if max_score - min_score > 20:
            print(f"  • 注意平衡各科,避免偏科")
        if avg < 70:
            print(f"  • 建议制定每日学习计划")
            print(f"  • 多向老师和同学请教")
        elif avg < 80:
            print(f"  • 找出薄弱环节,针对性提高")
        else:
            print(f"  • 保持良好的学习状态")
            print(f"  • 挑战更高难度的内容")
        
        print(f"\n{'='*60}")
        print(f"{'祝学习进步!':^60}")
        print(f"{'='*60}")

# 使用成绩管理器
print("欢迎使用成绩管理系统!")
print("-" * 30)

name = input("学生姓名:")
class_name = input("班级:")

manager = GradeManager(name, class_name)

print("\n请输入各科成绩(输入-1结束):")
while True:
    subject = input(f"\n科目名称(输入-1结束):")
    if subject == "-1":
        break
    
    try:
        score = float(input(f"{subject}成绩:"))
        if score == -1:
            break
        if manager.add_subject(subject, score):
            print(f"✅ 已记录:{subject} {score}分")
        else:
            print("❌ 成绩无效(0-100)")
    except ValueError:
        print("❌ 请输入数字!")

if manager.subjects:
    manager.display_report()
    
    # 保存报告
    save = input("\n💾 是否保存成绩报告?(是/否):")
    if save == "是":
        filename = f"{name}_成绩报告.txt"
        with open(filename, "w", encoding="utf-8") as f:
            f.write(f"学生:{name}\n")
            f.write(f"班级:{class_name}\n\n")
            for subject in manager.subjects:
                f.write(f"{subject}:{manager.scores[subject]}分\n")
            f.write(f"\n平均分:{manager.get_average():.1f}分\n")
        print(f"✅ 已保存到:{filename}")
else:
    print("❌ 没有输入成绩!")

3.2 成绩预测系统

# 成绩预测系统
print("\n🔮 成绩预测系统")
print("=" * 50)

def predict_final_score(midterm_score, homework_avg, quiz_avg):
    """预测期末成绩"""
    # 权重分配
    midterm_weight = 0.4
    homework_weight = 0.3
    quiz_weight = 0.3
    
    predicted = (midterm_score * midterm_weight + 
                 homework_avg * homework_weight + 
                 quiz_avg * quiz_weight)
    
    return predicted

def get_prediction_advice(predicted, target):
    """根据预测给出建议"""
    gap = target - predicted
    
    if gap <= 0:
        return "🎯 目标可达!保持现状即可!"
    elif gap <= 5:
        return f"💪 只差{gap:.1f}分,稍微努力就能达到!"
    elif gap <= 10:
        return f"📈 还差{gap:.1f}分,需要加倍努力!"
    elif gap <= 20:
        return f"📚 差距较大({gap:.1f}分),需要制定详细计划!"
    else:
        return f"🚩 差距很大({gap:.1f}分),建议调整目标或全力冲刺!"

print("欢迎使用成绩预测系统!")
print("我可以根据期中成绩、作业和测验预测期末成绩\n")

try:
    midterm = float(input("期中考试成绩:"))
    homework = float(input("平时作业平均分:"))
    quiz = float(input("小测验平均分:"))
    target = float(input("目标期末成绩:"))
    
    if all(0 <= x <= 100 for x in [midterm, homework, quiz, target]):
        predicted = predict_final_score(midterm, homework, quiz)
        
        print(f"\n{'='*50}")
        print(f"{'🔮 成绩预测报告':^50}")
        print(f"{'='*50}")
        
        print(f"\n📊 输入数据:")
        print(f"  期中成绩:{midterm}分(权重40%)")
        print(f"  作业平均:{homework}分(权重30%)")
        print(f"  测验平均:{quiz}分(权重30%)")
        print(f"  目标成绩:{target}分")
        
        print(f"\n📈 预测结果:")
        print(f"  预测期末成绩:{predicted:.1f}分")
        
        grade, grade_name, emoji = get_grade_level(predicted)
        print(f"  预测等级:{emoji} {grade}({grade_name})")
        
        print(f"\n💡 建议:{get_prediction_advice(predicted, target)}")
        
        # 如果需要努力,给出具体建议
        if predicted < target:
            needed = target - predicted
            print(f"\n📋 提升计划:")
            print(f"  需要提高:{needed:.1f}分")
            
            # 建议提高哪方面
            if homework < 80:
                print(f"  • 提高作业质量:作业每提高10分,总分提高3分")
            if quiz < 80:
                print(f"  • 加强测验准备:测验每提高10分,总分提高3分")
            if midterm < 80:
                print(f"  • 复习期中内容:期中每提高10分,总分提高4分")
            
            print(f"  • 每天多花30分钟复习")
            print(f"  • 每周做一套模拟题")
    else:
        print("❌ 所有成绩应在0-100之间!")
        
except ValueError:
    print("❌ 请输入有效的数字!")

def get_grade_level(score):
    """辅助函数:获取等级"""
    if score >= 90:
        return "A", "优秀", "🌟"
    elif score >= 80:
        return "B", "良好", "👍"
    elif score >= 70:
        return "C", "中等", "💪"
    elif score >= 60:
        return "D", "及格", "📈"
    else:
        return "F", "不及格", "📚"

📅 下节课预告

第26课:简易计算器升级版——带错误处理的四则运算

下节课你将学习:

  1. 综合运用条件判断和错误处理
  2. 制作带异常处理的计算器
  3. 处理除零等特殊情况
  4. 优化用户交互体验
  5. 制作可连续运算的计算器

预习思考

  1. 计算器会遇到哪些错误情况?
  2. 如何优雅地处理程序错误?
  3. 怎样让计算器更易用?

💬 给家长的话

亲爱的家长

今天孩子制作了完整的成绩评定系统,这是综合运用条件判断知识的实践项目。通过这个项目,孩子学会了如何设计和实现一个完整的程序。

孩子今天学会了

  1. ✅ 设计多等级评定逻辑
  2. ✅ 根据分数给出详细评语和建议
  3. ✅ 制作多科目成绩管理系统
  4. ✅ 分析成绩进步趋势
  5. ✅ 预测期末成绩

成绩评定的教育价值

| 能力 | 在项目中的应用 | 培养价值 |

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

| 分类思维 | 划分成绩等级 | 逻辑分类 |

| 系统设计 | 设计完整系统 | 架构思维 |

| 数据分析 | 分析成绩趋势 | 数据思维 |

| 建议生成 | 给出学习建议 | 指导能力 |

| 预测分析 | 预测期末成绩 | 前瞻思维 |

您可以这样做

学习应用

  1. 实际使用:用程序管理孩子的真实成绩
  2. 目标设定:一起设定学习目标并跟踪
  3. 趋势分析:分析成绩变化趋势
  4. 学习计划:根据分析制定计划

温馨提示

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

🏆 今日成就

完成了今天的学习,你:

📊 制作了成绩评定系统

🏅 设计了多等级评定

📈 分析了进步趋势

🔮 实现了成绩预测

💡 给出了学习建议

挑战任务

  1. 添加更多评定维度(如态度、努力程度)
  2. 制作班级成绩排行榜
  3. 添加成绩可视化图表
  4. 实现成绩导出功能

🌟 编程心法

成绩是一面镜子
反映努力的成果
但分数不是终点
进步才是目标
用代码分析数据
用逻辑给出建议
让每一次评定
都成为成长的动力
让每一个建议
都指明前进的方向
学会用技术
帮助自己和他人
这是编程的意义
也是学习的价值

记住:成绩评定不是为了评判,而是为了帮助成长。用编程让学习更有方向,让进步更有力量!


第25课结束。你现在已经是一个成绩评定专家了!

实践任务:

1. 用程序管理真实成绩

2. 制作班级成绩系统

3. 分析进步趋势

4. 给出学习建议

下节课,让我们升级计算器,学习错误处理!

第26课见!