# 控制流结构

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u11-control-flow-structures/

本模块介绍过程式编程的三种核心控制流结构：顺序、选择和迭代。我们将为CIE 9618考试讲解语法、常见用例，以及如何避免嵌套结构中的逻辑错误。

**先修:** [基础编程语法和变量](https://www.owlsprep.com/zh/study/cie-9618-u11-basic-programming-concepts/); [布尔逻辑和表达式](https://www.owlsprep.com/zh/study/cie-9618-u10-boolean-logic/)

## 学习目标

- 对过程式编程中的三种核心控制流结构进行分类
- 为顺序、选择和迭代编写语法和逻辑正确的代码
- 识别并修复嵌套控制结构中的常见错误
- 根据给定问题需求匹配正确的循环/选择类型

## 1. 顺序控制流

顺序执行是所有过程式编程语言的默认行为。除非被其他控制结构显式修改，否则语句会按照源代码中的编写顺序依次执行。

**顺序结构** — 一种线性控制流结构，每个语句按照其在源代码中出现的顺序恰好执行一次。

*例:* 读取用户输入、计算结果、然后输出结果

**例题:** 编写一个顺序伪代码块，计算给定半径$r$的圆的面积。

1. 1. 声明并读取输入的半径值：
2. `INPUT r`
3. 2. 使用公式$area = \pi r^2$计算面积：
4. `area = 3.14159 * r * r`
5. 3. 输出最终计算得到的面积：
6. `OUTPUT area`

> **考试提示:** 务必检查，绝对不要在变量赋值前使用它——这是顺序代码中最常见的错误。

## 2. 选择（条件）控制流

选择结构根据布尔条件的真假执行不同代码块，改变默认的执行顺序。CIE 9618认可四种常用形式：单分支`IF`、双分支`IF-ELSE`、多分支`IF-ELSE IF-ELSE`和`SWITCH-CASE`。

**选择结构** — 一种控制流结构，根据一个或多个布尔条件的结果，从两个或多个互斥代码块中选择一个执行。

**例题:** 编写一个选择代码块：分数≥80输出等级'A'，70-79输出'B'，低于70输出'F'。

1. 首先从最高分数段的外层IF开始：
2. `IF mark >= 80 THEN
  OUTPUT "A"`
3. 添加下一个分数段的ELSE IF：
4. `ELSE IF mark >= 70 THEN
  OUTPUT "B"`
5. 添加不及格分数的最终ELSE并结束结构：
6. `ELSE
  OUTPUT "F"
ENDIF`

**概念自测**

上述代码中，当`mark = 70`时输出是什么？

1. 输出是什么？

   - A
   - B
   - F
   - Syntax error

   *解析:* 条件按顺序检查：第一个条件`mark >= 80`不成立，因此检查第二个条件`mark >= 70`，条件成立，输出B。

## 3. 迭代（循环）控制流

迭代结构（循环）在继续执行条件满足时，重复执行代码块多次。CIE 9618区分三种核心循环类型，各自有不同的使用场景。

| 循环类型 | 条件检查时机 | 最小迭代次数 | 常见用例 |
| --- | --- | --- | --- |
| 计数循环（FOR） | 每次迭代前 | 0 | 遍历固定范围 |
| 前置条件循环（WHILE） | 每次迭代前 | 0 | 验证用户输入 |
| 后置条件循环（REPEAT-UNTIL） | 每次迭代后 | 1 | 按精度要求进行近似计算 |

**例题:** 编写一个WHILE循环，计算2到10之间所有偶数的和。

1. 在循环开始前初始化总和和计数器变量：
2. `total = 0
current = 2`
3. 定义WHILE循环的继续执行条件：
4. `WHILE current <= 10 DO`
5. 在循环内更新总和并递增计数器：
6. `total = total + current
current = current + 2`
7. 结束循环并输出结果：
8. `ENDWHILE
OUTPUT total`

> **tip**
>
> 务必在循环内更新循环退出条件。忘记这一步会导致死循环，在CIE考试中会被扣掉大量分数。

## 4. 嵌套控制结构

任何控制流结构都可以嵌套在另一个结构内部，例如IF语句内嵌套循环，或IF内嵌套另一个IF。嵌套结构遵循与顶层结构相同的规则：只有当外层结构的路径被选中时，内层结构才会执行。

> **缩进最佳实践**
>
> 始终将内层嵌套块统一缩进一级。这可以更轻松地将开始关键字（IF、WHILE）与对应的结束关键字（ENDIF、ENDWHILE）匹配。

**例题:** 编写一个嵌套控制块，输出2到20之间的所有素数。

1. 1. 外层循环遍历2到20之间的每个候选数：
2. `FOR candidate FROM 2 TO 20 DO`
3. 2. 嵌套选择结构检查候选数是否为素数：
4. `IF isPrime(candidate) = TRUE THEN
  OUTPUT candidate
ENDIF`
5. 3. 结束外层for循环：
6. `ENDFOR`

## 常见错误

- **错误做法:** 忘记为嵌套控制结构添加结束关键字（例如遗漏ENDIF/ENDWHILE）
  - 原因: 未闭合的结构会导致整个程序出现语法错误和意外行为
  - 正确做法: 写完开始关键字后立即写下结束关键字，然后在两者之间添加内层代码。使用缩进匹配配对。
- **错误做法:** 需要WHILE循环时误用了REPEAT-UNTIL循环，反之亦然
  - 原因: REPEAT-UNTIL总是至少执行一次，而WHILE可以执行零次，这会改变边界情况的输出结果
  - 正确做法: 检查代码块是否必须至少执行一次：如果是，使用REPEAT-UNTIL，否则使用WHILE。
- **错误做法:** 忘记在WHILE循环内更新循环计数器
  - 原因: 这会导致退出条件始终为真，产生无限循环（死循环）
  - 正确做法: 在循环前初始化计数器，在循环体内部最后一步更新计数器。
- **错误做法:** 在IF条件中使用错误的比较运算符（例如用=代替>=）
  - 原因: 边界条件的差一错误非常常见，会丢掉本应拿到的分数
  - 正确做法: 反复检查所有边界值（例如及格分40），确认你的条件符合题目要求。
- **错误做法:** 颠倒顺序代码中的步骤顺序
  - 原因: 在变量赋值前使用它会导致运行时错误或错误结果
  - 正确做法: 在编写代码前先在纸上梳理运算顺序，确保所有值在使用前都已定义。

## 速查表

| 控制流类型 | 核心特征 | 常见用例 |
| --- | --- | --- |
| 顺序结构 | 默认逐行执行 | 简单的输入-处理-输出流程 |
| 单IF | 一条可选代码路径 | 条件为真时触发一个操作 |
| IF-ELSE | 两条互斥路径 | 二元通过/不通过或是/否检查 |
| FOR循环 | 固定迭代次数 | 遍历已知范围的值 |
| WHILE循环 | 前置检查条件，迭代次数可变 | 验证用户输入直到输入有效 |
| REPEAT-UNTIL | 后置检查条件，至少执行1次 | 按精度要求进行近似计算 |

## 下一步

控制流是你在CIE 9618中接触到的所有过程式编程的基础。现在掌握这些核心结构，会让你在课程后续学习中更容易调试复杂程序中的逻辑错误。接下来，你可以学习如何将可复用的控制流块封装到子程序中，以及使用嵌套循环处理二维数组这类多维数据结构——这是考试中常见的考点。

- [过程、函数与参数](https://www.owlsprep.com/zh/study/cie-9618-u11-procedures-functions-and-parameters/)
- [文件处理](https://www.owlsprep.com/zh/study/cie-9618-u11-file-handling/)
- [面向对象编程概念](https://www.owlsprep.com/zh/study/cie-9618-u11-object-oriented-programming-concepts/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u11-control-flow-structures/
