C++魔法代码学院:第 11 课——如果不满足就一直做(while 循环)

2026-01-20
38

—— 贪吃蛇的无尽盛宴与数字拆解术

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

    1. 理解 while 循环:基于条件的重复(只要...就...)。
    2. 辨析 forwhile 的区别:知道次数用 for,只知条件用 while
    3. 核心难点(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)。
    • 每一块积木代表一位数。
  • 拆塔步骤(循环逻辑)

    • 只要塔还存在 (n > 0),我们就一直拆:

      1. 取塔顶 (% 10):把最上面那块拿下来看看是多少。(得到 5)
      2. 扔垃圾 (/ 10):把这块积木扔掉,塔变矮了。(剩下 1234)
      3. 循环:回到步骤 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,先找变化量(让循环停下来的那行代码)。

课后作业:数字魔法师

  1. 基础题:使用 while 循环计算 1 到 100 的和。(对比一下 for 循环,看看哪个写起来更方便?——通常 for 更方便,但 while 也能做)。
  2. 必做题(数位求和)

    • 输入一个任意整数(比如 2024)。
    • 计算各位数字之和(2+0+2+4 = 8)。
    • 提示:在 while 循环里,把取出来的 digit 加到 sum 存钱罐里。
  3. 挑战题(统计 0 的个数)

    • 输入一个整数(比如 10500)。
    • 统计里面有几个 0
    • 提示:拆每一位出来,用 if (digit == 0) 判断,如果是就计数器加 1。

给教练的教学话术建议

  • 关于数位分离:这是算法的基石。一定要强调 “模10取余,除10去尾” 这个八字真言。
  • 关于 n > 0:有学生会问“为什么不是 n >= 0?”

    • 解释:如果是 0,说明塔已经没了,再拆就没有积木了。而且 0 % 10 是 0,0 / 10 还是 0,这会导致死循环(塔永远拆不完)。
  • 调试技巧:如果程序运行后没反应(死循环),教学生按 Ctrl + C 强制停止。告诉他们:“恭喜你,你制造了时间静止的魔法,现在我们要打破它。”