C++魔法代码学院:第 8 课——复杂的选择(逻辑运算符)
—— 严厉的守卫与宽容的向导
- 课时时长:90 分钟
-
核心目标:
- 掌握 逻辑与
&&:全真才真,一假即假。 - 掌握 逻辑或
||:一真即真,全假才假。 - 核心难点:学会组合使用
( )、%、==、!=来解决复杂问题。 - 终极任务:攻克 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分钟)
-
情景引入:
-
遇到了一位“严厉的老师”。你想出去玩?必须满足两个条件:
- 作业写完了 (
homework_done == true) - 并且,考试考了100分 (
score == 100)
- 作业写完了 (
-
提问:
- 只写完作业,没考100分?-> 老师:不行!
- 考了100分,作业没写?-> 老师:不行!
- 两个都做到了?-> 老师:通过!
-
-
代码符号:
- 在 C++ 里,“并且” 写作
&&(Shift + 7,连按两次)。 - 口诀:两个
&手拉手,缺一不可一起走。
- 在 C++ 里,“并且” 写作
-
代码演示:
if (homework == true && score == 100) { cout << "可以玩游戏!"; } -
应用:判断一个数是不是两位数?
- 条件:它要
>= 10并且 它要<= 99。 if (n >= 10 && n <= 99) ...
- 条件:它要
3. 新知 B:宽容的奶奶——逻辑或 || (15分钟)
-
情景引入:
- 遇到了一位“宽容的奶奶”。你想吃冰淇淋?满足一个条件就行:
- 考了100分 (
score == 100) - 或者,帮奶奶洗了碗 (
wash_dish == true)
- 考了100分 (
- 遇到了一位“宽容的奶奶”。你想吃冰淇淋?满足一个条件就行:
-
提问:
- 没考100分,但是洗碗了?-> 奶奶:吃吧吃吧。
- 考了100分,没洗碗?-> 奶奶:吃吧吃吧。
- 又考100分又洗碗了?-> 奶奶:太乖了,吃两个!
- 啥都没干?-> 奶奶:那不行,不能吃。
-
代码符号:
- 在 C++ 里,“或者” 写作
||。 - 找符号(难点):在回车键上方,那根竖线。按住
Shift + \。 - 口诀:两根棍子竖起来,满足一个就开怀。
- 在 C++ 里,“或者” 写作
-
代码演示:
if (score == 100 || wash_dish == true) { cout << "吃冰淇淋!"; }
4. 难点:键盘特训与优先级 (10分钟)
-
打字练习:
- 很多孩子找不到
|,或者打成了顿号、。老师需巡场确认每个人都能打出||。
- 很多孩子找不到
-
逻辑混战:
- 如果
&&和||混在一起用怎么办? - 黄金法则:加括号! 就像数学运算先乘除后加减一样,逻辑运算也有顺序,但为了不搞错,把想作为一组的条件用
()包起来。
- 如果
5. 核心:时间魔法师——闰年判断 (30分钟) <-- GESP 必考题
-
背景故事:
- 地球公转一圈其实是 365.2422 天。多出来的 0.24 天,每 4 年凑成一天,就是 2月29日(闰年)。
- 但是!凑多了怎么办?每 100 年又要扣掉一天。
- 但是!!扣太多了怎么办?每 400 年又要加回来一天。
- 学生:晕了晕了...
-
规则拆解(三步走):
- 普通闰年:能被 4 整除。 (
year % 4 == 0) -
世纪灾难:如果是 100 的倍数,不是闰年! (
year % 100 != 0)- 结合起来:能被4整除 并且 不能被100整除。
- 代码:
(year % 4 == 0 && year % 100 != 0)
-
绝地反击:如果是 400 的倍数,它又是闰年! (
year % 400 == 0)- 逻辑连接:满足上面的条件,或者,满足这第三个条件。
- 普通闰年:能被 4 整除。 (
-
终极公式构建:
- 让我们把这两个部分用“宽容的奶奶”
||连起来。 - 板书:
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分钟)
- 总结口诀:
&&是挑剔鬼,全真才真。||是老好人,有真就真。- 闰年公式背下来:四且非百,或四百。
课后作业:小小逻辑学家
- 基础题:输入一个数字,判断它是否“既是 3 的倍数,又是 5 的倍数”(例如 15, 30)。
-
应用题(优惠券):
- 游乐园门票规则:
- 如果身高 < 120 (
height < 120),或者,年龄 > 60 (age > 60)。 - 输出“免费进入”。
- 否则,输出“买票”。
-
挑战题(区间判断):
- 输入一个分数。
- 如果分数在 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一次只能比一场赛。要比两次,中间必须请“严厉的老师&&”来连接。
- 原理:C++ 会先算
-
关于闰年:如果学生觉得公式太长记不住,可以教他们分层写:
if (year % 400 == 0) { cout << "闰年"; } else if (year % 4 == 0 && year % 100 != 0) { cout << "闰年"; } else { cout << "平年"; }
(虽然这是嵌套逻辑,但对部分孩子来说可能更好理解,不过 GESP 考题通常考那个长长的单行公式)。