CAPL 编程系列教程 - 第十三期:循环结构 (第一部分) - while 与 do-while

CAPL 编程系列教程的第十三期内容,开始讲解 CAPL 中的循环结构,本期重点是 while 循环do-while 循环,以及循环控制关键字 breakcontinue

CAPL 编程系列教程 - 第十三期:循环结构 (第一部分) - while 与 do-while

一、 课程回顾与本期目标

  • 回顾: 前面学习了 CAPL 的基础语法,包括数据类型、变量、运算符和分支结构 (if, switch)。
  • 循环结构: 程序流程控制的另一种重要方式,用于重复执行某段代码块。
  • 本期目标: 学习 CAPL 中的 whiledo-while 循环语句,以及如何在循环中使用 breakcontinue 控制流程。

二、 while 循环语句

  1. 语法:
    Code snippet
    while (condition) {
        // Loop body statements
        // (需要包含能改变 condition 的逻辑,以避免死循环)
    }
    
  • 关键字: while (当...的时候)。
  • 条件表达式 (condition):
    • 放在 while 后的小括号 () 内。
    • 决定是否执行或继续执行循环体。
    • 求值规则同 if非零即真
    • 可以是关系、逻辑或任何有效表达式。
  • 循环体 (Loop Body):
    • 花括号 {} 内的语句块。
    • 如果只有一条语句,花括号可省略(但不推荐)。
  • 执行逻辑 (先判断,后执行):
    • ① 判断条件: 首先判断 condition 是否为真 (非零)。
    • ② 执行/跳过:
      • 如果条件为真,则执行循环体内的所有语句。
      • 如果条件为假,则跳过循环体,直接执行 while 循环之后的语句。
    • ③ 重复: 执行完循环体后,返回步骤 ①,重新判断条件。
    • ④ 结束: 直到某次条件判断为假,循环结束。
  • 重要: 循环体内通常需要包含能够改变条件表达式结果的语句(如 i++),否则如果条件初始为真,将导致死循环 (Infinite Loop),程序会卡住。
  • 示例 (打印 1 到 3):
    Code snippet
    int i = 1;
    while (i <= 3) {
        write("i 的值为: %d", i);
        i++; // 改变 i 的值,使条件最终能变为假
    }
    write("程序结束了");
    
    • 注意: while (i <= 3) 这个条件实际判断了 4 次(i=1, 2, 3 时为真,i=4 时为假并退出)。

三、 do-while 循环语句

  1. 语法:
    Code snippet
    do {
        // Loop body statements
    } while (condition); // <-- 注意末尾的分号
    
  • 关键字: dowhile
  • 执行逻辑 (先执行,后判断):
    • ① 执行循环体: 首先无条件地执行一次 do 后面的花括号 {} 内的循环体语句。
    • ② 判断条件: 执行完循环体后,再判断 while 后面括号 () 内的 condition 是否为真。
    • ③ 重复/结束:
      • 如果条件为真,则返回步骤 ①,再次执行循环体。
      • 如果条件为假,则循环结束,执行 do-while 之后的语句。
  • 特点: 循环体至少会执行一次,即使初始条件就不满足。
  • 末尾分号: while (condition) 后面必须有一个分号 ;
  • 示例 (打印 0 到 4):
    Code snippet
    int j = 0;
    do {
        write("j 的值为: %d", j);
        j++;
    } while (j < 5);
    write("程序结束了");
    
  • while 的对比 (初始条件不满足时):
    • i = 100; while (i <= 3) { ... } -> 循环体一次都不执行。
    • j = 100; do { ... } while (j < 5); -> 循环体执行一次(会输出 "j 的值为: 100"),然后条件判断为假,循环结束。

四、 循环应用示例

  1. 计算 1 到 100 的和:
    Code snippet
    int i = 1;
    int sum = 0;
    while (i <= 100) {
        sum += i; // 等价于 sum = sum + i;
        i++;
    }
    write("总和为: %d", sum); // 输出 5050
    
  2. 计算 1 到 100 的偶数和:
    Code snippet
    int i = 2; // 从第一个偶数开始
    int sum = 0;
    while (i <= 100) {
        sum += i;
        i += 2; // 每次增加 2,跳到下一个偶数
    }
    write("偶数和为: %d", sum); // 输出 2550
    
  3. 输出 1-100 间能被 7 整除或以 7 结尾的数 (循环嵌套 if):
    Code snippet
    int i = 1;
    while (i <= 100) {
        if ( (i % 7 == 0) || (i % 10 == 7) ) { // i%7==0 (能被7整除) 或 i%10==7 (个位是7)
            write("满足条件的数: %d", i);
        }
        i++; // 每次都检查下一个数
    }
    

五、 循环控制关键字

  • 作用: 用于在循环体内部更精细地控制循环的执行流程。
  • break:
    • 功能: 立即强制退出当前所在的整个循环while, do-while, 或后续将学的 for 循环),不再执行循环体内 break 之后的语句,也不再进行后续的条件判断。程序将跳转到循环结构之后的第一条语句继续执行。
    • 也可用在 switch 语句中
    • 示例 (找到第一个能整除 N 的数后即停止): 在判断质数的例子中,找到一个因子 i (使得 N % i == 0) 后,输出结果并使用 break 退出 while 循环,避免不必要的后续检查。
  • continue:
    • 功能: 立即结束当前这一轮循环,跳过循环体中 continue 之后的剩余语句,并直接进入下一次循环的条件判断(对于 whiledo-while)或迭代步进(对于 for 循环)。
    • 只能用在循环体中
    • 示例 (打印 1-10 但跳过 7):
      Code snippet
      int i = 0;
      while (i < 10) {
          i++;
          if (i == 7) {
              continue; // 当 i 等于 7 时,跳过下面的 write 语句,直接开始下一次循环判断
          }
          write("i 的值为: %d", i); // 输出 1, 2, 3, 4, 5, 6, 8, 9, 10
      }
      

六、 综合示例:判断质数 (素数)

  • 逻辑: 判断数 N 是否为质数,可以通过检查从 2 到 N-1 之间是否存在能整除 N 的数 i
    • 如果找到任何一个 i 能整除 N (N % i == 0),则 N 不是质数,可以用 break 提前结束循环。
    • 如果循环正常结束(即 i 增长到了 N),说明在 2 到 N-1 之间没有找到因子,则 N 是质数。
  • 实现细节: 需要在循环外部判断循环是因为 break 退出还是正常结束,通常通过比较循环变量 i 的最终值与 N 的关系来确定。
    Code snippet
    int n = 13; // 要判断的数
    int i = 2;
    while (i < n) {
        if (n % i == 0) {
            write("%d 不是质数, 能被 %d 整除", n, i);
            break; // 找到因子,退出循环
        }
        i++;
    }
    // 循环结束后判断退出原因
    if (i == n) { // 如果 i 增长到了 n,说明循环是正常结束的
        write("%d 是质数", n);
    }
    

七、 总结与后续

  • 本期学习了 whiledo-while 两种循环结构的区别和用法,以及 breakcontinue 在循环中的作用。
  • 循环是实现重复操作和算法的基础。
  • 下一期将学习另一种常用的循环结构:for 循环。