C++魔法代码学院:第 12 课——循环中的小插曲
—— 紧急刹车与跳跃前进
- 课时时长:90 分钟
-
核心目标:
- 理解
break:强行打断循环,彻底结束(全体撤离)。 - 理解
continue:跳过本次循环剩下的代码,直接进入下一轮(这次不算)。 - 核心难点:区分“立刻停止”和“跳过一次”的区别。
- 实战:编写经典的 “逢 7 过” (FizzBuzz 变体) 游戏。
- 理解
-
所需教具:一个红色的按钮(代表 break),一根跳绳。
课程时间表
| 环节 | 时间 | 内容 | 教学隐喻/活动 |
|---|---|---|---|
| 复习 | 10 min | for / while |
“无尽跑圈”回顾 |
| 新知 A | 20 min | break (中断) |
“火警响了,快跑!” |
| 新知 B | 20 min | continue (继续) |
“跳绳绊倒,重来!” |
| 辨析 | 10 min | 两者的区别 | 流程图/路线图对比 |
| 核心 | 25 min | 逢 7 过游戏 | “数字地雷阵” |
| 总结 | 5 min | 总结与作业 | 避坑指南 |
详细教学流程
1. 复习:无尽跑圈 (10分钟)
- 代码热身:写一个
for循环,打印 1 到 10。 - 提问:如果我想数到 5 就停下来,或者我想跳过 5 不数,现在的知识能做到吗?(学生可能说改条件,但如果条件很复杂呢?)
- 引入:我们需要两个超级控制器,专门用来处理循环中的“突发状况”。
2. 新知 A:紧急刹车——break (20分钟)
-
情景隐喻:
- 正在操场跑圈(循环)。
- 突然!火警铃响了(满足了特定条件)。
- 动作:不管你跑到第几圈,也不管后面还有没有圈没跑完,立刻停止,跑出操场!
- 这就是
break(打破/中断)。
-
代码演示(寻找宝藏):
- 任务:在 1 到 100 之间找数字,只要找到第一个能被 17 整除的数,就大喊“找到了”并停止寻找。
for (int i = 1; i <= 100; i++) { cout << "正在检查: " << i << endl; if (i % 17 == 0) { cout << "找到了!它是 " << i << endl; break; // 按下紧急按钮!循环立刻结束,后面的数字不看了 } } cout << "任务结束。"; -
观察结果:屏幕上只会打印到 17,后面的 18-100 统统不会出现。
3. 新知 B:这次不算——continue (20分钟)
-
情景隐喻:
- 正在跳绳比赛,计划跳 100 个。
- 跳到第 5 个时,脚绊到了绳子(满足了特定条件)。
- 动作:这一次成绩无效(下面的代码不执行),但比赛没结束!我们要调整呼吸,马上开始跳第 6 个。
- 这就是
continue(继续/跳过)。
-
代码演示(吃葡萄):
- 任务:吃 10 颗葡萄,但是第 3 颗是烂的。
for (int i = 1; i <= 10; i++) { if (i == 3) { cout << "呸!第 3 颗是烂的,扔掉!" << endl; continue; // ⏭️ 跳过本次循环剩下的语句,直接去 i++ } cout << "正在吃第 " << i << " 颗葡萄,真甜。" << endl; } -
观察结果:只有第 3 颗没说“真甜”,第 4 颗开始又继续吃了。
4. 辨析:路线图对比 (10分钟)
-
板书画图(非常重要):
- 画一个循环的圈圈跑道。
break:直接在跑道中间把墙砸开,人跑到了圈圈外面。continue:遇到了障碍物,人像弹簧一样弹回到了起点,准备跑下一圈。
-
口诀:
- Break 是撤离,彻底不玩了。
- Continue 是跳过,下把接着来。
5. 核心:逢 7 过游戏 (25分钟)
-
游戏规则:
- 从 1 数到 50。
- 遇到 7 的倍数(如 7, 14, 21...)。
- 或者 包含 7 的数字(如 17, 27, 37... 注:3-5年级通常只考虑个位是7的情况,毕竟范围只有50)。
- 这些数字不能喊出来,要喊“过”(在程序里就是不输出,直接 continue)。
- 其他数字正常输出。
-
逻辑构建:
- 循环
for (int i = 1; i <= 50; i++) -
判断是否踩雷:
- 是 7 的倍数:
i % 7 == 0 - 个位是 7:
i % 10 == 7 - 连接词:或者
||
- 是 7 的倍数:
-
如果是雷 ->
continue。 - 如果不是 ->
cout << i.
- 循环
-
代码实现:
for (int i = 1; i <= 50; i++) { // 检查是不是要跳过的数字 if (i % 7 == 0 || i % 10 == 7) { cout << "过 "; continue; // ⏭️ 遇到了 7,跳过后面的打印,进入下一轮 } // 正常的数字打印出来 cout << i << " "; } -
变式挑战:如果不输出“过”,直接跳过,怎么写?(删掉
cout << "过 ";即可)。
6. 总结与避坑 (5分钟)
- 避坑指南:
continue的陷阱:在while循环里用continue要特别小心!-
演示:
int i = 1; while (i <= 10) { if (i == 5) continue; // ❌ 死循环!因为跳过了下面的 i++ cout << i; i++; }- 修正:在
continue之前必须先把i++做了。这也是为什么初学者建议多用for循环的原因。
- 修正:在
-
课后作业:探险家日记
- 基础题:修改“逢 7 过”程序,范围改成 1 到 100。
-
应用题(寻找质数 - 初级版):
- 输入一个数字
n(比如 13)。 - 判断它是不是质数(只能被 1 和它自己整除)。
- 思路:用
for循环从 2 试到n-1。如果发现n % i == 0,说明除了 1 和它自己还有别的因数,它不是质数! - 这时候立刻用
break停止检查,并打印“不是质数”。
- 输入一个数字
-
脑洞题:
- 编写一个死循环
while(true),让用户一直输入数字。 - 只有当用户输入
0时,使用break结束程序。 - (这是很多游戏菜单的写法)。
- 编写一个死循环
给教练的教学话术建议
- 关于
break:可以比喻成游戏里的 "Game Over" 或者 "Mission Complete",任务一完成(或者一失败),马上退出关卡。 - 关于
continue:可以比喻成听歌时的 "切歌"。这首歌不好听(满足条件),切掉(continue),直接听下一首,播放列表并没有停止。 - 调试技巧:做“逢 7 过”时,建议先只写
i % 7 == 0,测试对了再加|| i % 10 == 7。分步调试是好习惯。