C++魔法代码学院:第 8 课——复杂的选择(逻辑运算符)

—— 严厉的守卫与宽容的向导

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

    1. 掌握 逻辑与 &&:全真才真,一假即假。
    2. 掌握 逻辑或 ||:一真即真,全假才假。
    3. 核心难点:学会组合使用 ( )%==!= 来解决复杂问题。
    4. 终极任务:攻克 GESP 经典考题——闰年判断
  • 所需教具:两把钥匙(道具),两张通行证,一块写着“&&”的红牌,一块写着“||”的绿牌。

课程时间表

环节 时间 内容 教学隐喻/活动
复习 10 min if-else% “奇偶数快速问答”
新知 A 15 min 逻辑与 && “严厉的老师”与双重锁
新知 B 15 min **逻辑或 `
难点 10 min 符号输入与优先级 寻找键盘上的“棍子”
核心 30 min 闰年判断算法 “时间魔法师的规则”
总结 10 min 总结与作业 逻辑组合拳

详细教学流程

1. 复习:热身 (10分钟)

  • 提问:怎么判断一个数是偶数?(n % 2 == 0)。
  • 引入:以前我们的守卫 if 很简单,只看一张通行证。但今天我们来到了魔法城堡的核心区,这里的守卫变多了,有时候需要同时满足两个条件才能通过。

2. 新知 A:严厉的老师——逻辑与 && (15分钟)

  • 情景引入

    • 遇到了一位“严厉的老师”。你想出去玩?必须满足两个条件:

      1. 作业写完了 (homework_done == true)
      2. 并且,考试考了100分 (score == 100)
    • 提问

      • 只写完作业,没考100分?-> 老师:不行!
      • 考了100分,作业没写?-> 老师:不行!
      • 两个都做到了?-> 老师:通过!
  • 代码符号

    • 在 C++ 里,“并且” 写作 && (Shift + 7,连按两次)。
    • 口诀:两个 & 手拉手,缺一不可一起走。
  • 代码演示

    if (homework == true && score == 100) {
            cout << "可以玩游戏!";
    }
    

  • 应用:判断一个数是不是两位数

    • 条件:它要 >= 10 并且 它要 <= 99
    • if (n >= 10 && n <= 99) ...

3. 新知 B:宽容的奶奶——逻辑或 || (15分钟)

  • 情景引入

    • 遇到了一位“宽容的奶奶”。你想吃冰淇淋?满足一个条件就行:
      1. 考了100分 (score == 100)
      2. 或者,帮奶奶洗了碗 (wash_dish == true)
  • 提问

    • 没考100分,但是洗碗了?-> 奶奶:吃吧吃吧。
    • 考了100分,没洗碗?-> 奶奶:吃吧吃吧。
    • 又考100分又洗碗了?-> 奶奶:太乖了,吃两个!
    • 啥都没干?-> 奶奶:那不行,不能吃。
  • 代码符号

    • 在 C++ 里,“或者” 写作 ||
    • 找符号(难点):在回车键上方,那根竖线。按住 Shift + \
    • 口诀:两根棍子竖起来,满足一个就开怀。
  • 代码演示

    if (score == 100 || wash_dish == true) {
            cout << "吃冰淇淋!";
    }
    

4. 难点:键盘特训与优先级 (10分钟)

  • 打字练习

    • 很多孩子找不到 |,或者打成了顿号 。老师需巡场确认每个人都能打出 ||
  • 逻辑混战

    • 如果 &&|| 混在一起用怎么办?
    • 黄金法则加括号! 就像数学运算先乘除后加减一样,逻辑运算也有顺序,但为了不搞错,把想作为一组的条件用 () 包起来

5. 核心:时间魔法师——闰年判断 (30分钟) <-- GESP 必考题

  • 背景故事

    • 地球公转一圈其实是 365.2422 天。多出来的 0.24 天,每 4 年凑成一天,就是 2月29日(闰年)。
    • 但是!凑多了怎么办?每 100 年又要扣掉一天。
    • 但是!!扣太多了怎么办?每 400 年又要加回来一天。
    • 学生:晕了晕了...
  • 规则拆解(三步走)

    1. 普通闰年:能被 4 整除。 (year % 4 == 0)
    2. 世纪灾难:如果是 100 的倍数,不是闰年! (year % 100 != 0)

      • 结合起来:能被4整除 并且 不能被100整除。
      • 代码(year % 4 == 0 && year % 100 != 0)
    3. 绝地反击:如果是 400 的倍数,它又是闰年! (year % 400 == 0)

      • 逻辑连接:满足上面的条件,或者,满足这第三个条件。
  • 终极公式构建

    • 让我们把这两个部分用“宽容的奶奶” || 连起来。
    • 板书
      int year;
      cin >> year;
      
      // 条件1:普通闰年 (能被4整除 且 不能被100整除)
      // 或者
      // 条件2:世纪闰年 (能被400整除)
      
      if ( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) {
              cout << "是闰年 (Leap Year)";
      } else {
              cout << "是平年 (Common Year)";
      }
      
  • 验证测试

    • 2024 -> 闰年 (满足左边:能被4整除,不能被100整除)
    • 1900 -> 平年 (被4整除,但也被100整除 -> 左边死;也不被400整除 -> 右边死。全死。)
    • 2000 -> 闰年 (左边死,但是满足右边能被400整除 -> 复活!)

6. 总结与作业 (10分钟)

  • 总结口诀
    • && 是挑剔鬼,全真才真。
    • || 是老好人,有真就真。
    • 闰年公式背下来:四且非百,或四百

课后作业:小小逻辑学家

  1. 基础题:输入一个数字,判断它是否“既是 3 的倍数,又是 5 的倍数”(例如 15, 30)。
  2. 应用题(优惠券)

    • 游乐园门票规则:
    • 如果身高 < 120 (height < 120),或者,年龄 > 60 (age > 60)。
    • 输出“免费进入”。
    • 否则,输出“买票”。
  3. 挑战题(区间判断)

    • 输入一个分数。
    • 如果分数在 90 到 100 之间(包含90和100),输出 "Excellent"。
    • 提示if (score >= 90 && score <= 100)
    • 避坑:千万不能写成数学写法 if (90 <= score <= 100) ❌,这是 C++ 大忌!

给教练的教学话术建议

  • 关于 90 <= x <= 100:这是小学生转 C++ 最容易翻车的点。

    • 原理:C++ 会先算 90 <= x,得到结果 1 (True),然后拿 1 去和 100 比,导致逻辑全错。
    • 纠正:告诉学生,C++ 的 if 一次只能比一场赛。要比两次,中间必须请“严厉的老师 &&”来连接。
  • 关于闰年:如果学生觉得公式太长记不住,可以教他们分层写:

    if (year % 400 == 0) { cout << "闰年"; }
    else if (year % 4 == 0 && year % 100 != 0) { cout << "闰年"; }
    else { cout << "平年"; }
    

(虽然这是嵌套逻辑,但对部分孩子来说可能更好理解,不过 GESP 考题通常考那个长长的单行公式)。