C++魔法代码学院:第 11 课——如果不满足就一直做(while 循环)
—— 贪吃蛇的无尽盛宴与数字拆解术
- 课时时长:90 分钟
-
核心目标:
- 理解
while循环:基于条件的重复(只要...就...)。 - 辨析
for与while的区别:知道次数用for,只知条件用while。 - 核心难点(GESP 必考):掌握利用
while (n > 0)配合%10和/10拆解任意位数的整数。
- 理解
-
所需教具:一包饼干(或小馒头),一个乐高积木塔(5层高)。
课程时间表
| 环节 | 时间 | 内容 | 教学隐喻/活动 |
|---|---|---|---|
| 复习 | 10 min | for 循环与累加 |
1加到100回顾 |
| 引入 | 15 min | 为什么要用 while? |
“吃包子比赛” |
| 新知 | 20 min | while 语法结构 |
“守门员的回头路” |
| 核心 | 25 min | 任意数位分离 | “乐高塔拆除工程” |
| 实战 | 15 min | 数字反转程序 | 输入 12345 输出 54321 |
| 总结 | 5 min | 总结与避坑 | 死循环(忘记吃包子) |
详细教学流程
1. 复习:定数循环 (10分钟)
- 提问:如果我要大家在操场跑 10 圈,用什么魔法?
- 回答:
for循环!因为我们知道是 10 圈。 - 引入:那如果体育老师说:“一直跑,直到下雨为止。” 请问要跑几圈?没人知道,可能是 1 圈,也可能是 100 圈。这时候
for循环就不好用了。
2. 引入:吃包子比赛 (15分钟)
-
情景模拟:
- 老师扮演大胃王,桌上有一堆无限的空气包子。
- 规则:只要肚子没饱,就一直吃下一个。
-
逻辑拆解:
- Step 1 (判断):肚子饱了吗?(没饱/True)。
- Step 2 (行动):吃一个包子。
- Step 3 (循环):回到 Step 1,再问自己:饱了吗?
- ...
- Step N:肚子饱了吗?(饱了/False)。 -> 停止!
-
对比:
for:吃 10 个包子。(关注数量)while:吃到饱为止。(关注条件)
3. 新知:守门员的回头路 (20分钟)
-
语法结构:
while ( 条件 ) { // 只要条件是真的,就一直做这里的事 } -
隐喻:
- 还记得
if那个守门员吗?while是他的双胞胎弟弟。 if放你进去后,你走完就走了。while放你进去后,等你走完里面的路,会有一条传送带把你送回大门口,守门员会再次检查你的证件。
- 还记得
-
简单练习:倒计时
- 用
while实现火箭发射(从 10 数到 1)。
int i = 10; // 1. 初始状态 while (i >= 1) { // 2. 门口检查:还大于1吗? cout << i << endl; i--; // 3. 变化:变小一点(非常重要!) } - 用
4. 核心:乐高塔拆除工程——数位分离 (25分钟) <-- GESP 必考重难点
- 挑战:第 5 课我们学过拆 3 位数。那如果我输入一个 10 位数?或者 1 位数?怎么写通用的代码?
-
道具演示(乐高塔):
- 老师拿出一个由 5 块积木拼成的塔(代表数字
12345)。 - 每一块积木代表一位数。
- 老师拿出一个由 5 块积木拼成的塔(代表数字
-
拆塔步骤(循环逻辑):
-
只要塔还存在 (n > 0),我们就一直拆:
- 取塔顶 (
% 10):把最上面那块拿下来看看是多少。(得到 5) - 扔垃圾 (
/ 10):把这块积木扔掉,塔变矮了。(剩下 1234) - 循环:回到步骤 1,看塔还在不在?还在,继续拆顶上的 4...
- 取塔顶 (
-
结束:最后一块拆完,地上空了 (
n == 0),工人下班。
-
-
代码板书(背诵级代码):
int n; cin >> n; // 比如输入 12345 while (n > 0) { int digit = n % 10; // 1. 取出最后一位 (5) cout << digit; // 2. 打印它 n = n / 10; // 3. 砍掉最后一位 (变成1234) }
5. 实战:数字反转 (15分钟)
- 任务:输入一个整数
12345,利用刚才的逻辑,在屏幕上打印54321。 -
Trace Table(人肉模拟):
- 带着学生一步步走:
轮次 门口检查 (n>0?) 取位 (n%10) 打印 砍头 (n/10) 1 True (12345) 5 5 1234 2 True (1234) 4 4 123 3 True (123) 3 3 12 4 True (12) 2 2 1 5 True (1) 1 1 0 6 False (0) - - 结束
6. 总结与避坑 (5分钟)
- 天坑警告——死循环:
- 很多小朋友写
while循环时,会忘记写n = n / 10;或者i--。 - 隐喻:这就像吃包子比赛,只张嘴不吞下去,肚子永远不会饱,你会一直吃到天荒地老,电脑死机!
- 检查口诀:写完
while,先找变化量(让循环停下来的那行代码)。
- 很多小朋友写
课后作业:数字魔法师
- 基础题:使用
while循环计算 1 到 100 的和。(对比一下for循环,看看哪个写起来更方便?——通常for更方便,但while也能做)。 -
必做题(数位求和):
- 输入一个任意整数(比如
2024)。 - 计算各位数字之和(
2+0+2+4 = 8)。 - 提示:在
while循环里,把取出来的digit加到sum存钱罐里。
- 输入一个任意整数(比如
-
挑战题(统计 0 的个数):
- 输入一个整数(比如
10500)。 - 统计里面有几个
0? - 提示:拆每一位出来,用
if (digit == 0)判断,如果是就计数器加 1。
- 输入一个整数(比如
给教练的教学话术建议
- 关于数位分离:这是算法的基石。一定要强调 “模10取余,除10去尾” 这个八字真言。
-
关于
n > 0:有学生会问“为什么不是n >= 0?”- 解释:如果是
0,说明塔已经没了,再拆就没有积木了。而且0 % 10是 0,0 / 10还是 0,这会导致死循环(塔永远拆不完)。
- 解释:如果是
-
调试技巧:如果程序运行后没反应(死循环),教学生按
Ctrl + C强制停止。告诉他们:“恭喜你,你制造了时间静止的魔法,现在我们要打破它。”