C++魔法代码学院:第 7 课——否则怎么样(if-else 结构)

2026-01-20
42

—— 命运的双岔路口

  • 课时时长:90 分钟
  • 核心目标

    1. 掌握 if-else 双分支结构:非真即假,必选其一。
    2. 绝对重点:结合 % 运算,编写 “奇偶数判断器”(GESP 必考题)。
    3. 避坑指南:理解 else 后面不能加小括号(它不挑剔,剩下的全收)。
  • 所需教具:一个Y字形的火车轨道模型(或手绘图),两张卡片(一张写“KFC”,一张写“家务”)。

课程时间表

环节 时间 内容 教学隐喻/活动
复习 10 min if 与关系运算符 “真假手势舞”
引入 15 min 为什么要用 else “KFC vs 混合双打”
新知 20 min if-else 语法结构 “火车变轨器”
核心 25 min 奇偶数判断 (Mod 2) “数字分类帽”
实战 10 min 两个数比大小 谁是最大的?
总结 10 min 总结与纠错 语法找茬大赛

详细教学流程

1. 复习:真假手势舞 (10分钟)

  • 快速问答

    • 5 > 3 是真还是假?(学生做“真”的手势,如比心或OK)。
    • 10 == 10 是真还是假?
    • 10 = 10 对不对?(错!这是赋值,不是判断)。
  • 回顾 ifif 就像守卫,条件为真才开门,条件为假就什么都不发生。

2. 引入:KFC 还是“竹板炒肉”? (15分钟)

  • 情景模拟

    • 妈妈说:“如果你考了 100 分,带你去吃 KFC。”
    • 提问:那如果我考了 59 分,会发生什么?
    • 上节课的代码:程序会保持沉默(没有任何输出)。
    • 现实生活:妈妈肯定会奖励一顿“男子单打”或者让你“去洗碗”。
  • 笨办法(双 if)

    if (score == 100) { cout << "Eat KFC"; }
    if (score != 100) { cout << "Wash Dishes"; }
    

    • 吐槽:这也太麻烦了!要写两次判断。如果条件很复杂,写两次容易错。
  • 新办法

    • 我们需要一个词,代表“否则”、“要不然”
    • 这个词就是 else

3. 新知:火车变轨器 (20分钟)

  • 概念隐喻

    • if-else 就像一个 Y 字形的火车轨道
    • 火车开过来,必须选一条路走(左边或右边),绝对不可能停在中间,也不可能两条路都走。
    • if 是左边的路(满足条件走这里)。
    • else 是右边的路(不满足条件,统统被赶到这里)。
  • 语法结构

    if ( 条件 ) {
            // 如果是真的,做这件事
            cout << "KFC";
    } else {
            // 否则(也就是假的),做这件事
            cout << "洗碗";
    }
    

  • 高能预警(语法坑)

    • 老师在黑板上写一个巨大的 else
    • 强调else 后面没有小括号!它不讲条件,只要前面的 if 不要的,它全盘接收。
    • 错误示范else (score < 100) —— 画蛇添足,必错无疑!

4. 核心:数字分类帽——奇偶判断 (25分钟)

  • 背景:这是魔法学院的入学考试(也是 GESP 一级的必考题)。我们需要把数字分成“奇数队”和“偶数队”。
  • 逻辑回顾

    • 怎么判断一个数是奇数还是偶数? -> 看它除以 2 的余数
    • 偶数n % 2 == 0 (余数为0)。
    • 奇数n % 2 == 1 (余数为1)。
  • 代码构建

    int n;
    cout << "请输入一个数字: ";
    cin >> n;
    
    if (n % 2 == 0) {
            cout << n << " 是偶数 (Even)";
    } else {
            cout << n << " 是奇数 (Odd)";
    }
    

  • 逻辑推演

    • 只要不是偶数,一定是奇数吗?(是的,在整数世界里非奇即偶)。
    • 所以我们不需要在 else 后面再写 if (n % 2 == 1),直接用 else 兜底最省事。

5. 实战:谁是老大? (10分钟)

  • 任务:输入两个不同的数字 ab,输出其中较大的那个数。
  • 学生练习

    int a, b;
    cin >> a >> b;
    if (a > b) {
            cout << "最大的是: " << a;
    } else {
            cout << "最大的是: " << b;
    }
    

  • 思考:如果 ab 一样大,上面的代码会输出什么?(输出 b,因为 a > b 是假,走 else 分支。虽然逻辑上没问题,但可以引导学生思考)。

6. 总结与找茬 (10分钟)

  • 找茬大赛:请找出下面代码的 3 个错误。
    if (n % 2 = 0)         // 错误1:赋值号 = 应该是 ==
            cout << "偶数";
    else (n % 2 == 1)      // 错误2:else 后面不能加括号条件
    {
            cout << "奇数"     // 错误3:分号丢了
    }
    

课后作业:生活大爆炸

  1. 基础题:完善上面的“KFC 判断器”,输入分数,输出奖励或惩罚。
  2. 必做题(倍数判断)

    • 输入一个整数。
    • 判断它能不能被 5 整除(提示:n % 5 == 0)。
    • 如果能,输出 "Yes";否则输出 "No"。
  3. 挑战题(正负数)

    • 输入一个整数。
    • 如果它是正数(> 0),输出 "Positive"。
    • 否则... 哎呀,这里有问题!如果输入 0 怎么办?(引导学生思考:else 把 0 和负数都归为一类了。这没关系,下节课我们会学更厉害的逻辑)。

给教练的教学话术建议

  • 关于 else 的口语化:告诉学生 else 就是“捡漏王”。只要 if 不要的垃圾(False 情况),else 统统捡走。
  • 关于缩进格式

    • 强烈建议采用“埃及金字塔”式的写法(ifelse 对齐,大括号内的代码缩进)。
    • 哪怕只有一行代码,也要加上 { }。这是良好的竞赛习惯,防止以后加代码时出错。
  • 关于 % 2 == 1:虽然数学上是对的,但在 C++ 实战中,有些高阶写法会判断 n % 2 != 0。不过对于 GESP 一级,教 == 0 是偶数,else 是奇数,是最稳妥的路径。