376 lines
10 KiB
Markdown
376 lines
10 KiB
Markdown
# 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 条,流程图这一关就算真正入门了。 |