# 4.0 流程图的画法与读法

---

## 一、这节课到底学什么？

很多同学觉得流程图难，不是因为图形多，而是因为总会犯下面几种错：

- 只盯着框看，不顺着箭头走。
- 只看条件，不看两条分支分别去哪。
- 看到回头箭头，没有意识到这是一段循环。
- 自己画图时，漏了初始化、漏了结束、漏了更新变量。

所以这份讲义不走“纯概念说明”路线，而是直接看图、读图、再学怎么手绘。

---

## 二、先看一张图，认识流程图里最常见的 4 种框

```mermaid
flowchart LR
    A([开始]) --> B[/输入一个数 n/]
    B --> C[把 n 加 1]
    C --> D{n 是偶数吗？}
    D -- 是 --> E[/输出 偶数/]
    D -- 否 --> F[/输出 奇数/]
    E --> G([结束])
    F --> G
```

这张图先不用细抠题意，只要认识图形就行：

- 圆角框：开始、结束。
- 平行四边形：输入、输出。
- 长方形：处理步骤，也就是“做一件事”。
- 菱形：判断，要从这里分路。

你可以先把流程图想成“做事路线图”：

- 框，表示现在做什么。
- 箭头，表示下一步去哪。

> 读流程图时，真正重要的不是图画得漂不漂亮，而是你能不能顺着箭头走清楚。

---

## 三、示范 1：最基础的单判断流程图

题目：输入一个整数，判断它是偶数还是奇数。

```mermaid
flowchart TD
    A([开始]) --> B[/输入 n/]
    B --> C{n 能被 2 整除吗？}
    C -- 是 --> D[/输出 偶数/]
    C -- 否 --> E[/输出 奇数/]
    D --> F([结束])
    E --> F
```

读这张图时，顺序应该这样说：

1. 从“开始”出发。
2. 输入一个整数 n。
3. 判断 n 能不能被 2 整除。
4. 如果能，就输出“偶数”。
5. 如果不能，就输出“奇数”。
6. 结束。

这类图最容易错的地方只有一个：

> 判断框一定要看两条路，不能只看条件本身。

也就是说，你看到菱形时，要同时问自己两句：

- 条件成立，往哪走？
- 条件不成立，往哪走？

---

## 四、示范 2：看到回头箭头，就要想到“循环”

题目：输入 n，求 1 到 n 的和。

```mermaid
flowchart TD
    A([开始]) --> B[/输入 n/]
    B --> C[sum = 0, i = 1]
    C --> D{i 还没超过 n 吗？}
    D -- 否 --> E[/输出 sum/]
    E --> F([结束])
    D -- 是 --> G[sum = sum + i]
    G --> H[i = i + 1]
    H --> D
```

这张图里，最关键的是最后那条回头箭头：

- 它从后面回到了前面的判断框。
- 这说明有一段步骤要重复做。
- 这就是循环。

### 拿一组小数据，顺着图走一遍

设 n = 4。

| 现在的 i | 做完以后 sum | 接下来去哪？ |
|:---:|:---:|:---|
| 1 | 1 | i 变成 2，回去继续判断 |
| 2 | 3 | i 变成 3，回去继续判断 |
| 3 | 6 | i 变成 4，回去继续判断 |
| 4 | 10 | i 变成 5，回去继续判断 |
| 5 | 不再累加 | 因为 5 已经超过 4，所以输出 10 |

这就是读流程图最稳的方法：

> 如果看图有点晕，就拿一组很小的数据，自己沿着箭头走一遍。

---

## 五、示范 3：有些流程会“提前停止”

题目：从 1 开始往上加，如果和第一次超过 20，就立刻输出并结束。

```mermaid
flowchart TD
    A([开始]) --> B[/输入 n/]
    B --> C[sum = 0, i = 1]
    C --> D{i 还没超过 n 吗？}
    D -- 否 --> E[/输出 sum/]
    E --> F([结束])
    D -- 是 --> G[sum = sum + i]
    G --> H{sum 已经大于 20 吗？}
    H -- 是 --> E
    H -- 否 --> I[i = i + 1]
    I --> D
```

这张图比上一张多了一个判断框。

它告诉你：

- 有时候流程不一定走到最下面才结束。
- 只要中途满足条件，就可以直接输出并结束。

### 为什么这类图容易读错？

因为很多同学会下意识地认为：

“图上有的步骤，都会执行。”

其实不是。

真正正确的想法是：

> 只有你顺着箭头真的能走到那一步，那一步才会执行。

比如 n = 10：

- 1 + 2 + 3 + 4 + 5 = 15。
- 再加 6，sum 变成 21。
- 这时已经大于 20，所以直接结束。
- 后面的 7、8、9、10 根本不会再处理。

---

## 六、示范 4：双重循环最容易把人绕晕

题目：老师给你一张 3 行 4 列的表，从左到右、从上到下寻找第一个 0，找到就立刻输出它的位置。

```mermaid
flowchart TD
    A([开始]) --> B[row = 1]
    B --> C{row 还在第 1 到第 3 行吗？}
    C -- 否 --> D[/输出 没找到/]
    D --> E([结束])
    C -- 是 --> F[col = 1]
    F --> G{col 还在第 1 到第 4 列吗？}
    G -- 否 --> H[row = row + 1]
    H --> C
    G -- 是 --> I[/读当前位置的数 x/]
    I --> J{x 是 0 吗？}
    J -- 是 --> K[/输出 row 和 col/]
    K --> E
    J -- 否 --> L[col = col + 1]
    L --> G
```

这一张图里，其实有两层重复：

- 外层：一行一行看。
- 内层：每一行里，一列一列看。

读双重循环时，一定要问清楚：

- 现在正在动的是哪一个变量？
- 这一条回边，是回到内层判断，还是回到外层判断？
- 找到答案以后，是结束一层，还是结束全部？

### 这题里有两种“结束”意思完全不同

第一种：一整行看完了。

- 这不是整张图结束。
- 只是 col 走完了。
- 所以下一步是 row 加 1，去下一行。

第二种：已经找到第一个 0。

- 这不是只结束当前一行。
- 而是整个过程直接输出并结束。

> 双重循环最容易错的地方，不是看不见箭头，而是分不清“结束一层”和“结束全部”。

---

## 七、示范 5：分支、循环、提前结束放在同一张图里

题目：输入 n，求 1 到 n 中所有 3 的倍数之和；如果和第一次超过 100，就立刻停止并输出。

```mermaid
flowchart TD
    A([开始]) --> B[/输入 n/]
    B --> C[sum = 0, i = 1]
    C --> D{i 还没超过 n 吗？}
    D -- 否 --> E[/输出 sum/]
    E --> F([结束])
    D -- 是 --> G{i 是 3 的倍数吗？}
    G -- 是 --> H[sum = sum + i]
    G -- 否 --> I[i = i + 1]
    H --> J{sum 已经大于 100 吗？}
    J -- 是 --> E
    J -- 否 --> I
    I --> D
```

这张图值得你重点观察 3 个地方：

1. 外面有一个循环，因为最后会回到“i 还没超过 n 吗”。
2. 中间有一个分支，因为要判断 i 是不是 3 的倍数。
3. 还有一个提前结束，因为 sum 超过 100 时可以直接停。

如果你能把这张图读顺，说明你已经不是只会看“最基础单流程”了。

---

## 八、自己手绘流程图，应该怎么下笔？

看到题目以后，不要一上来就急着画框。

更稳的顺序是下面这 6 步：

### 第 1 步：先把做法写成人话

例如：

1. 输入 n。
2. 令 sum = 0，i = 1。
3. 如果 i 已经超过 n，就输出 sum。
4. 如果 i 是 3 的倍数，就把它加到 sum 里。
5. 如果 sum 已经超过 100，就输出 sum。
6. 否则 i 加 1，再继续。

如果这几句话都说不顺，流程图通常也画不顺。

### 第 2 步：先找变量

最常见的几类变量是：

- 输入变量：题目给你的数。
- 循环变量：决定“做到第几个”的变量。
- 结果变量：最后要输出的量。
- 标记变量：比如“是否找到”。

### 第 3 步：先搭大骨架

很多流程图，骨架其实都差不多：

开始 → 输入 → 初始化 → 判断 → 处理 → 更新 → 回到判断 → 输出 → 结束

先把主干摆出来，再补细节，图就不会乱。

### 第 4 步：每个判断框都要有两条路

判断框不能只画一条路。

你必须写清楚：

- 是，去哪。
- 否，去哪。

### 第 5 步：循环的回边，通常回到判断框

很多同学会把箭头直接接回处理中间某一步，这很容易画错。

更常见、更稳的画法是：

- 处理完一轮。
- 更新变量。
- 回到“是否继续”的判断框。

### 第 6 步：画完以后，用小数据手推

这一招非常重要。

你可以拿最小的几组数据来试：

- n = 1 会怎样？
- n = 0 会怎样？
- 第一次就满足结束条件会怎样？

如果你自己都推不顺，说明图还得改。

---

## 九、手绘时最容易犯的错误

下面这些错，课堂上特别常见：

1. 漏掉开始和结束。
2. 忘了初始化变量。
3. 判断框只画出一条路。
4. 循环变量没有更新，结果图会一直转圈。
5. 回边接错位置，没有回到判断框。
6. 双重循环里，没有分清是结束一层还是结束全部。
7. 一个框里塞太多话，别人读不清楚。
8. 箭头方向不清，让人只能靠猜。

---

## 十、画完之后，按这张检查单自查

1. 有没有明确的开始和结束？
2. 输入和输出有没有写清楚？
3. 初始化有没有漏掉？
4. 每个判断框是不是都有两条路？
5. 每个循环变量有没有更新？
6. 回头箭头是不是回到了合适的位置？
7. 如果有提前停止，是不是画清楚了？
8. 如果有双重循环，是不是分清了结束一层和结束全部？
9. 能不能拿一组小数据，从头走到尾？

只要这 9 条都能过，这张图一般就比较靠谱了。

---

## 十一、课堂练习

下面 3 题，不要求你写代码，先试着手绘流程图：

### 练习 1

输入 n，输出 1 到 n 中偶数的个数。

### 练习 2

从左到右读一串数，遇到 0 就停止，输出前面所有数的和。

### 练习 3

读一个 3 行 4 列的表，找到第一个大于 100 的数，输出它的位置；如果没有找到，就输出“没有”。

做这 3 题时，请先写“人话步骤”，再画图。

---

## 十二、这一节最该记住的几句话

1. 流程图不是背图形，而是按顺序表达做事步骤。
2. 读图时，最重要的是顺着箭头走。
3. 看到菱形，就要同时看“是”和“否”两条路。
4. 看到回头箭头，通常就要想到循环。
5. 不是图上写了什么都会执行，要看箭头能不能真的走到那一步。
6. 画图前先把步骤说清楚，画完后再拿小数据手推。

如果你能做到这 6 条，流程图这一关就算真正入门了。