Files
hustoj/web/doc/4.0 流程图的画法与读法.md

376 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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。
- 再加 6sum 变成 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 = 0i = 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 条,流程图这一关就算真正入门了。