C++魔法代码学院:第 12 课——循环中的小插曲

2026-01-20
37

—— 紧急刹车与跳跃前进

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

    1. 理解 break:强行打断循环,彻底结束(全体撤离)。
    2. 理解 continue:跳过本次循环剩下的代码,直接进入下一轮(这次不算)。
    3. 核心难点:区分“立刻停止”和“跳过一次”的区别。
    4. 实战:编写经典的 “逢 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)。
    • 其他数字正常输出。
  • 逻辑构建

    1. 循环 for (int i = 1; i <= 50; i++)
    2. 判断是否踩雷:

      • 是 7 的倍数:i % 7 == 0
      • 个位是 7:i % 10 == 7
      • 连接词:或者 ||
    3. 如果是雷 -> continue

    4. 如果不是 -> 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 循环的原因。

课后作业:探险家日记

  1. 基础题:修改“逢 7 过”程序,范围改成 1 到 100。
  2. 应用题(寻找质数 - 初级版)

    • 输入一个数字 n(比如 13)。
    • 判断它是不是质数(只能被 1 和它自己整除)。
    • 思路:用 for 循环从 2 试到 n-1。如果发现 n % i == 0,说明除了 1 和它自己还有别的因数,它不是质数
    • 这时候立刻用 break 停止检查,并打印“不是质数”。
  3. 脑洞题

    • 编写一个死循环 while(true),让用户一直输入数字。
    • 只有当用户输入 0 时,使用 break 结束程序。
    • (这是很多游戏菜单的写法)。

给教练的教学话术建议

  • 关于 break:可以比喻成游戏里的 "Game Over" 或者 "Mission Complete",任务一完成(或者一失败),马上退出关卡。
  • 关于 continue:可以比喻成听歌时的 "切歌"。这首歌不好听(满足条件),切掉(continue),直接听下一首,播放列表并没有停止。
  • 调试技巧:做“逢 7 过”时,建议先只写 i % 7 == 0,测试对了再加 || i % 10 == 7。分步调试是好习惯。