C++魔法代码学院:第 7 课——否则怎么样(if-else 结构)
—— 命运的双岔路口
- 课时时长:90 分钟
-
核心目标:
- 掌握
if-else双分支结构:非真即假,必选其一。 - 绝对重点:结合
%运算,编写 “奇偶数判断器”(GESP 必考题)。 - 避坑指南:理解
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对不对?(错!这是赋值,不是判断)。
-
回顾
if:if就像守卫,条件为真才开门,条件为假就什么都不发生。
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分钟)
- 任务:输入两个不同的数字
a和b,输出其中较大的那个数。 -
学生练习:
int a, b; cin >> a >> b; if (a > b) { cout << "最大的是: " << a; } else { cout << "最大的是: " << b; } -
思考:如果
a和b一样大,上面的代码会输出什么?(输出b,因为a > b是假,走 else 分支。虽然逻辑上没问题,但可以引导学生思考)。
6. 总结与找茬 (10分钟)
- 找茬大赛:请找出下面代码的 3 个错误。
if (n % 2 = 0) // 错误1:赋值号 = 应该是 == cout << "偶数"; else (n % 2 == 1) // 错误2:else 后面不能加括号条件 { cout << "奇数" // 错误3:分号丢了 }
课后作业:生活大爆炸
- 基础题:完善上面的“KFC 判断器”,输入分数,输出奖励或惩罚。
-
必做题(倍数判断):
- 输入一个整数。
- 判断它能不能被 5 整除(提示:
n % 5 == 0)。 - 如果能,输出 "Yes";否则输出 "No"。
-
挑战题(正负数):
- 输入一个整数。
- 如果它是正数(
> 0),输出 "Positive"。 - 否则... 哎呀,这里有问题!如果输入
0怎么办?(引导学生思考:else把 0 和负数都归为一类了。这没关系,下节课我们会学更厉害的逻辑)。
给教练的教学话术建议
- 关于
else的口语化:告诉学生else就是“捡漏王”。只要if不要的垃圾(False 情况),else统统捡走。 -
关于缩进格式:
- 强烈建议采用“埃及金字塔”式的写法(
if和else对齐,大括号内的代码缩进)。 - 哪怕只有一行代码,也要加上
{ }。这是良好的竞赛习惯,防止以后加代码时出错。
- 强烈建议采用“埃及金字塔”式的写法(
-
关于
% 2 == 1:虽然数学上是对的,但在 C++ 实战中,有些高阶写法会判断n % 2 != 0。不过对于 GESP 一级,教== 0是偶数,else是奇数,是最稳妥的路径。