循环结构(三)
break 与 continue

从脉搏数据质控到素数判断与猜数游戏,理解循环流程的中途改变

循环一定要完整执行到条件变假吗?

while

由条件控制是否继续。

do-while

至少执行一次,再判断是否继续。

新问题

循环中途遇到特殊情况,能否提前离开或跳过本轮?

第3课时学习目标

知识目标

  • 理解 break 终止当前循环
  • 理解 continue 跳过本轮剩余语句
  • 理解循环多出口与标志变量

能力目标

  • 能判断特殊情况应该退出还是跳过
  • 能用 break 优化素数判断
  • 能分析 continue 在 for 与 while 中的差异
4.3 / break 与 continue
有些数据要跳过,
有些情况要终止
脉搏数据质控:无效值跳过,结束标志退出。
continuebreak控制流

脉搏数据流:跳过还是结束?

7207599970STOP68

无效记录

0、999:不参与统计,但后续数据仍要继续处理。

结束标志

STOP:本次采集结束,后续数据不再读取。

continue 与 break 的区别

continue

跳过本轮循环体中后面的语句,进入下一次循环判断。

本条不要,后面还要。

break

立即终止当前循环,执行循环之后的语句。

后面都不要了。

脉搏数据质控:代码骨架

while (1) {
    scanf("%d", &pulse);

    if (pulse == -1)
        break;

    if (pulse == 0 || pulse == 999)
        continue;

    sum += pulse;
    count++;
}

🤖 AI 协作互动:死循环陷阱排查

在 while 循环处理数据时,如果我在 if 条件满足时执行 continue,但把改变循环变量的语句放在了 continue 后面,程序会陷入死循环吗?请帮我画出正确的语句顺序。

💡 课堂互动:向 AI 提问 for 循环与 while 循环中 continue 跳过表达式的区别。

break 与 continue 路径比较

break与continue路径比较
教材例4-5
判断素数:
找到一个反例就可以停止
素数判断是理解 break 的经典例题。
素数因子break

教材例4-5 题面描述

📋 题目要求

输入一个正整数 \(m\),判断它是否为素数。
(注:素数指的是只能被 1 和自身整除的正整数,1 不是素数,2 是素数)

判断一个整数是否为素数

素数:只能被1和自身整除的正整数。1不是素数,2是素数。
情况 判断 循环动作
找到一个 i 使 m % i == 0 m 不是素数 立即 break
所有候选 i 都试完 m 是素数 自然结束

需要检查到哪里?

最直观

2 ~ m-1

容易理解,但检查次数多。

改进

2 ~ m/2

大于 m/2 的整数不可能整除 m。

常用

2 ~ sqrt(m)

若有因子,一定有一个不超过平方根。

素数判断:代码框架

flag = 1;
limit = sqrt(m);

for (i = 2; i <= limit; i++) {
    if (m % i == 0) {
        flag = 0;
        break;
    }
}

if (flag == 1)
    printf("yes\n");
else
    printf("no\n");

🤖 AI 协作互动:算法效率对比

在用循环判断正整数 n 是否为素数时,遇到能整除的数就执行 break 提前退出。请帮我推演:当 n = 1000000(合数)和 n = 997(素数)时,有 break 和无 break 的循环次数相差多少倍?

💡 课堂互动:通过 AI 的计算数据,直观感受提前退出对程序执行效率的巨大提升。

以 m = 9 和 m = 11 为例

m 检查过程 何时结束 结果
9 9 % 2 != 0,9 % 3 == 0 找到因子3,break 不是素数
11 11 % 2 != 0,11 % 3 != 0 候选因子试完 是素数
循环是否提前结束,本身也携带了重要信息。

常见错误:把“局部判断”当成“最终结论”

错误倾向

for (i = 2; i <= limit; i++) {
    if (m % i == 0)
        printf("no\n");
    else
        printf("yes\n");
}

为什么错?

  • 一次不能整除,只能说明当前 i 不是因子
  • 不能说明所有 i 都不是因子
  • 最终结论必须等循环结束后再输出
4.3.2 / continue
不是结束循环,
而是跳过本轮后续操作
continue在for和while中的影响不同,尤其要注意状态更新。
跳过本轮下一次判断防止死循环

continue:跳过本轮剩余语句

while (条件) {
    语句1;
    if (特殊情况)
        continue;
    语句2;
}

执行效果

  • 执行到 continue 时
  • 本轮后续语句不执行
  • 直接进入下一次循环判断

continue 在 for 与 while 中的差异

for循环

for (i = 100; i <= 200; i++) {
    if (i % 3 != 0)
        continue;
    printf("%d ", i);
}

执行 continue 后仍会执行 i++。

while循环

i = 100;
while (i <= 200) {
    if (i % 3 != 0)
        continue;
    printf("%d ", i);
    i++;
}

如果 continue 前没有更新 i,可能死循环。

如何修正 while 中的 continue?

i = 100;
while (i <= 200) {
    if (i % 3 != 0) {
        i++;
        continue;
    }
    printf("%d ", i);
    i++;
}
使用 continue 前,要确认循环变量仍然能够更新。
教材例4-6
猜数游戏:
循环有多个出口
最多猜7次;猜中时提前结束;超过次数则游戏结束。
计数控制提前结束flag

教材例4-6 题面描述

📋 题目要求

改写猜数游戏:输入你所猜的整数(规定为 1~100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜 7 次。

猜数游戏:两个结束原因

结束原因 程序表现 对应结构
猜中 立即停止 break
猜满7次 自然结束 while (count < 7)
结束后要区分原因 输出不同提示 flag

猜数游戏:代码框架

count = 0;
flag = 0;
mynumber = 38;

while (count < 7) {
    scanf("%d", &yournumber);
    count++;

    if (yournumber == mynumber) {
        printf("Lucky you!\n");
        flag = 1;
        break;
    } else if (yournumber > mynumber) {
        printf("Too big!\n");
    } else {
        printf("Too small!\n");
    }
}

if (flag == 0)
    printf("Game Over!\n");

🤖 AI 协作互动:双重出口逻辑审计

在猜数字游戏中,需要满足『最多猜 7 次』或『中途猜对即 break 退出』。请帮我检查我的双重出口控制逻辑,并提示如何根据循环结束后的状态区分是“成功猜中”还是“次数耗尽”?

💡 课堂互动:尝试用 AI 建议的 isFound 标记或 count <= 7 判定区分两种结局。

交互演示:break 与 continue 路径模拟器

🛑 D04-02 · break 与 continue 路径模拟器

本演示工具用于直观动态演练 C 语言中 break 与 continue 改变循环控制流的执行过程:

  • 数据队列单步跟踪:队列包含 72、0、75、999、70、STOP、68,点击“下一步”高亮当前数据。
  • 动作与流程同步:实时显示本轮动作(正常处理、continue 跳过、break 退出),并高亮右侧对应 C 语言代码行。
  • 状态变量实时监视:底端同步更新 sum、count 与循环状态说明。

本课总结:循环流程的三种结束/跳转

自然结束

循环条件变假。

break

当前循环立即结束。

continue

本轮后续语句跳过,进入下一轮。

先判断特殊情况属于“跳过本轮”还是“结束整体循环”,再决定使用 continue 或 break。

下次课预告:一个循环不够怎么办?

当问题中存在“两层重复关系”,就需要多重循环。

多名受试者
→
每人多次测量
→
外层循环
→
内层循环