CAPL 编程系列教程的第十三期内容,开始讲解 CAPL 中的循环结构,本期重点是 while 循环 和 do-while 循环,以及循环控制关键字 break 和 continue。
CAPL 编程系列教程 - 第十三期:循环结构 (第一部分) - while 与 do-while
一、 课程回顾与本期目标
- 回顾: 前面学习了 CAPL 的基础语法,包括数据类型、变量、运算符和分支结构 (
if,switch)。 - 循环结构: 程序流程控制的另一种重要方式,用于重复执行某段代码块。
- 本期目标: 学习 CAPL 中的
while和do-while循环语句,以及如何在循环中使用break和continue控制流程。
二、 while 循环语句
- 语法:
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 循环语句
- 语法:
Code snippet
do { // Loop body statements } while (condition); // <-- 注意末尾的分号
- 关键字:
do和while。 - 执行逻辑 (先执行,后判断):
- ① 执行循环体: 首先无条件地执行一次
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 到 100 的和:
Code snippet
int i = 1; int sum = 0; while (i <= 100) { sum += i; // 等价于 sum = sum + i; i++; } write("总和为: %d", sum); // 输出 5050 - 计算 1 到 100 的偶数和:
Code snippet
int i = 2; // 从第一个偶数开始 int sum = 0; while (i <= 100) { sum += i; i += 2; // 每次增加 2,跳到下一个偶数 } write("偶数和为: %d", sum); // 输出 2550 - 输出 1-100 间能被 7 整除或以 7 结尾的数 (循环嵌套
if):Code snippetint 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之后的剩余语句,并直接进入下一次循环的条件判断(对于while和do-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 snippetint 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); }
七、 总结与后续
- 本期学习了
while和do-while两种循环结构的区别和用法,以及break和continue在循环中的作用。 - 循环是实现重复操作和算法的基础。
- 下一期将学习另一种常用的循环结构:
for循环。