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

760 lines
17 KiB
Markdown
Raw 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 流程图的画法与读法
---
## 一、这一节要学什么?
这一节不讲编程语法,也不讲电脑里怎么画图。
这一节只做两件事:
- 学会读懂别人已经画好的流程图;
- 学会把自己的做题步骤,手绘成一张清楚的流程图。
很多同学觉得流程图“好像会看一点”,但真到题目里,还是容易出现这些问题:
- 看着箭头走着走着就乱了;
- 判断框只看条件,不看“是”和“否”分别去哪;
- 一碰到循环就分不清到底什么时候停;
- 自己画图时,框倒是画了不少,但别人根本看不懂。
所以这节课的目标很明确:
> 看到一张流程图,能按顺序说出它每一步在做什么;
> 想好一道题的做法,能把它画成一张条理清楚的手绘流程图。
只要这两件事学会了,后面的模拟题、分支题、循环题都会更容易做对。
---
## 二、先把流程图想成“做事路线图”
流程图不是图画比赛,它最重要的作用只有一个:
> 把“做题步骤”按执行顺序画出来。
你可以把它想成一张路线图。
- 框,表示“现在这一步要做什么”;
- 箭头,表示“下一步走到哪里去”。
所以读流程图时,最关键的不是“这个图形漂不漂亮”,而是:
- 现在在哪一步;
- 下一步往哪里走;
- 什么时候会换路;
- 什么时候会回头重复;
- 什么时候整个过程结束。
只要抓住这五件事,流程图就不神秘了。
---
## 三、手绘流程图常见的几种图形
流程图里最常见的图形不多,课堂上先记住下面这几种就够了。
### 1. 开始和结束
通常画成圆角框或椭圆。
里面常写:
- 开始
- 结束
它表示:
- 从哪里出发;
- 在哪里停止。
### 2. 输入和输出
通常画成平行四边形。
里面常写:
- 输入 n
- 输入 a, b
- 输出 sum
- 输出答案
它表示:
- 从外面拿数据进来;
- 把最后结果送出去。
### 3. 处理步骤
通常画成长方形。
里面常写:
- sum = 0
- i = i + 1
- cnt = cnt + 1
- 把当前数加入答案
它表示:
- 做计算;
- 改变量;
- 更新状态。
### 4. 判断条件
通常画成菱形。
里面常写:
- i <= n ?
- x == 0 ?
- sum > 100 ?
- 是否找到答案?
它表示:
- 到了一个要“分路走”的地方;
- 条件不同,走的方向不同。
### 5. 箭头
箭头很重要。
因为流程图真正表示顺序的,不是框,而是箭头。
箭头的作用是告诉你:
- 下一步去哪;
- 是继续往下;
- 还是回到前面重新做;
- 还是直接结束。
所以手绘时,箭头一定要方向明确,不能含糊。
### 6. 一个最简单的记忆法
可以记成下面四句话:
- 开始结束用圆框;
- 输入输出用斜框;
- 处理步骤用方框;
- 判断分路用菱形。
---
## 四、读流程图,先看什么,再看什么?
很多同学读流程图时,喜欢盯着某个判断框反复看,结果越看越乱。
更稳的方法是按顺序读。
### 第 1 步:先找开始和结束
先确认:
- 这张图从哪里开始;
- 最后可能从哪里结束。
如果一张图连开始和结束都找不清,后面就很容易走偏。
### 第 2 步:再找输入和输出
要先知道:
- 题目给了什么;
- 最后要求什么。
例如:
- 输入一个整数 n
- 输入一行数;
- 输出最大值;
- 输出计数结果。
这一点非常重要,因为它决定了你后面到底在盯哪个量。
### 第 3 步:看初始化
初始化就是“一开始先把变量定成什么值”。
最常见的有:
- sum = 0
- cnt = 0
- i = 1
- best = 0
- found = 否
如果你漏看了初始化,后面很容易整张图都理解错。
比如:
- `sum = 0` 表示还没开始累计;
- `cnt = 0` 表示还没数到任何东西;
- `i = 1` 表示从第一个开始;
- `found = 否` 表示现在还没有找到答案。
### 第 4 步:遇到判断框,一定要看两条路
判断框不是只看条件本身,而是要一起看:
- 条件成立时去哪;
- 条件不成立时去哪。
例如看到:
```text
x == 0 ?
```
你不能只记住“它在判断 x 是不是 0”还要看清
- 是 0 时,是不是直接结束;
- 不是 0 时,是继续处理,还是进入下一个判断。
这是读流程图最容易出错的地方。
### 第 5 步:看到回头箭头,就想到“循环”
只要箭头从后面又回到了前面的某个判断框,通常就说明:
> 这几步要重复做。
也就是说,这就是循环。
例如:
- 每次处理完一个数,再回去判断还有没有下一个数;
- 每次处理完一行,再回去判断还有没有下一行。
这时候你就要特别注意:
- 循环变量是谁;
- 它在哪里更新;
- 什么时候停止。
### 第 6 步:最后看有没有“提前结束”
有些流程不是一定走到最下面才结束。
它可能中途就停。
例如:
- 一旦遇到 0 就停止;
- 一旦找到答案就停止;
- 一旦和超过 100 就停止。
这种情况一定要特别注意,因为它常常会让后面的步骤根本不执行。
---
## 五、读流程图时,真正要盯住什么?
读流程图时,最该盯住的是“变量怎么变”。
因为流程图虽然看起来是一张图,但本质上其实是:
> 变量的值,顺着箭头一步一步发生变化。
所以一张图里,下面这些内容尤其要留心:
- sum = sum + x
- cnt = cnt + 1
- i = i + 1
- best 变大
- found 变成“是”
你可以这样想:
- 输入,是把数据拿进来;
- 处理框,是在改数据;
- 判断框,是根据数据决定下一步;
- 箭头,是让这些变化连起来。
只要你能跟住变量变化,读图就会稳很多。
---
## 六、读流程图最可靠的方法:拿小数据手推
如果一张图你读着有点晕,不要硬看。
最有效的方法就是:
> 拿一组很小很小的数据,自己顺着箭头走一遍。
例如有这样一个流程:
- 输入 n 和一列数;
- 从第一个数开始处理;
- 如果当前数是 0就结束
- 如果当前数是偶数,就把它的一半加入 sum
- 如果当前数是奇数,就把它的两倍加入 sum
- 每处理一个数cnt 加 1
- 如果 sum 达到目标值 k就结束
- 否则继续处理下一个数。
设:
```text
n = 6
k = 20
这一列数是583092
```
我们就顺着流程一步一步推:
| 当前数 | 怎么处理 | sum | cnt | 下一步 |
|:---:|:---|:---:|:---:|:---|
| 5 | 奇数,加 10 | 10 | 1 | 继续 |
| 8 | 偶数,加 4 | 14 | 2 | 继续 |
| 3 | 奇数,加 6 | 20 | 3 | 结束 |
这时就停了。
注意:
- 第 4 个数确实是 0
- 但根本还没轮到它;
- 因为第 3 个数处理完以后sum 已经达到目标了。
所以读图时一定要记住:
> 不是图上写了什么都会执行,而是要看你顺着箭头能不能真的走到那一步。
---
## 七、自己手绘流程图,正确顺序是什么?
很多同学画流程图时,最大的问题不是不会画框,而是:
- 一边想一边乱画;
- 画到后面才发现漏了步骤;
- 箭头接得很乱;
- 别人根本看不懂。
最稳的办法是下面这 5 步。
### 第 1 步:先把做法写成“人话步骤”
不要一上来就画图。
先用最普通的话,把步骤写下来。
例如:
1. 输入 n。
2. 令 sum = 0i = 1。
3. 如果 i 大于 n就输出 sum。
4. 如果 i 是 3 的倍数,就把 i 加入 sum。
5. 如果 sum 已经超过 100就输出 sum。
6. 否则让 i 加 1。
7. 回到第 3 步。
如果这几句话都说不顺,流程图也很难画清楚。
### 第 2 步:找出图里有哪些变量
一般先分成三类:
- 输入变量
- 循环变量
- 统计结果的变量
有时还会有:
- 标记变量
例如:
- 输入变量n
- 循环变量i
- 结果变量sum
- 标记变量:是否找到答案
先把角色分清,图就好画很多。
### 第 3 步:先搭大骨架
大多数流程图,骨架其实就四种:
1. 顺序做下去
2. 遇到条件分路
3. 走完一轮再回来重复
4. 中途直接结束
所以你画图时,先不要急着填细节,先看这题属于哪几种结构拼起来。
例如:
- “依次看每个数”通常是循环;
- “如果满足条件就这样,否则那样”通常是分支;
- “找到答案就停止”通常是提前结束。
### 第 4 步:每个判断框都必须有两条路
这是手绘时最容易漏掉的地方。
判断框只要出现,就必须想清楚:
- 是,去哪;
- 否,去哪。
不能只画一条。
如果只画一条,图基本就是不完整的。
### 第 5 步:把回头箭头接对地方
循环画错,大多数不是错在“要不要回去”,而是错在“回到哪里”。
通常应该回到:
- 循环条件判断框。
而不是:
- 回到循环体中间某一步。
比如单循环通常应画成:
```text
初始化 -> 判断 -> 处理 -> 更新 -> 回到判断
```
如果把箭头接回“处理”那里,就很容易少掉下一轮该不该继续的判断。
---
## 八、手绘时,图应该怎么摆才清楚?
就算步骤都对,如果摆放得乱,图也会很难读。
下面是最实用的几个手绘习惯。
### 1. 尽量从上往下画
最清楚的布局通常是:
- 开始在上面;
- 结束在下面;
- 中间顺着往下走。
这样别人一眼就知道阅读方向。
### 2. “是”和“否”要标清楚
从判断框出来的两条路,最好直接标:
-
-
或者:
- 满足
- 不满足
总之不要让人猜。
### 3. 一步只写一件主要的事
一个框里不要塞太多句子。
例如:
- 好:`sum = sum + x`
- 好:`i = i + 1`
- 不太好:把整段说明话塞进去
流程图不是作文,框里要短、准、清楚。
### 4. 复杂流程要留空位
如果知道后面还有分支或回边,画的时候就不要把框挤得太紧。
留出位置,箭头才不会绕成一团。
### 5. 双重循环要分层画
例如“按行扫描,再按列扫描”时:
- 外层一层是一圈;
- 内层一层再包一圈;
- 不要把所有箭头都挤在同一块。
你可以把它想成:
- 先把大圈画清;
- 再在里面补小圈。
---
## 九、单循环怎么手绘?
单循环是最基础的一类。
它的常见骨架就是:
```text
开始
输入
初始化
是否继续?
├─ 是 → 处理当前内容 → 更新变量 → 回到“是否继续?”
└─ 否 → 输出 → 结束
```
如果中途还可能提前结束,那么通常会在循环体中间多一个判断:
```text
开始
输入
初始化
是否继续?
├─ 否 → 输出 → 结束
└─ 是 → 读当前数据
是否提前结束?
├─ 是 → 输出 → 结束
└─ 否 → 处理 → 更新 → 回到“是否继续?”
```
这类图画顺了,很多基础题都会简单很多。
---
## 十、双重循环怎么手绘?
双重循环是流程图里最容易乱的地方。
因为这时你其实同时在处理两层“重复”。
例如:
- 先一行一行处理;
- 每一行里再一个一个处理。
这时你一定要分清:
- 外层变量是谁;
- 内层变量是谁;
- 一层结束后回哪;
- 两层都结束后回哪。
一个最基本的样子可以写成:
```text
开始
输入
外层初始化
外层是否继续?
├─ 否 → 输出 → 结束
└─ 是 → 内层初始化
内层是否继续?
├─ 否 → 外层更新 → 回到“外层是否继续?”
└─ 是 → 处理当前内容 → 内层更新 → 回到“内层是否继续?”
```
这张骨架图里最重要的是:
- 内层结束,不代表整张图结束;
- 内层结束之后,通常是回到外层继续;
- 只有外层也结束了,才真正走到输出和结束。
---
## 十一、最容易弄混的地方:结束一层,还是结束全部?
这是初学流程图时最常见的大问题。
例如题目说:
> 每一行从左往右看,遇到 0 就停止这一行。
这句话的意思一般是:
- 当前这一行后面的内容不看了;
- 但是下一行还要继续。
这只是:
> 结束内层。
再比如题目说:
> 一旦找到答案,整个过程结束。
这就表示:
- 当前这一行不继续;
- 后面的行也不继续;
- 整张流程图直接走向输出和结束。
这才是:
> 结束全部。
所以你读图或画图时,一定要问清楚:
- 这个箭头,是退出一小层;
- 还是退出整个过程。
---
## 十二、从文字步骤到手绘流程图,示范一次
题目:输入一个整数 n求 1 到 n 中所有 3 的倍数之和;如果和第一次超过 100就立刻停止并输出。
### 1. 先写做人话步骤
1. 输入 n。
2. 令 sum = 0i = 1。
3. 如果 i 大于 n输出 sum。
4. 如果 i 是 3 的倍数,就把 i 加入 sum。
5. 如果 sum 大于 100输出 sum。
6. 否则让 i 加 1。
7. 回到第 3 步。
### 2. 再整理成手绘流程
画图时可以按下面顺序摆:
```text
[开始]
[输入 n]
[sum = 0, i = 1]
<i <= n ?>
├─ 否 → [输出 sum] → [结束]
└─ 是 → <i 是 3 的倍数 ?>
├─ 是 → [sum = sum + i]
└─ 否 → 不加
<sum > 100 ?>
├─ 是 → [输出 sum] → [结束]
└─ 否 → [i = i + 1] → 回到 <i <= n ?>
```
从这张图里,你应该能看出三件事:
1. 外面有一个循环,因为最后会回到 `i <= n ?`
2. 中间有一个分支,因为要判断 `i` 是不是 3 的倍数。
3. 还有一个提前结束,因为 `sum > 100` 时不用继续往下做了。
---
## 十三、画流程图时最常见的错误
### 1. 漏掉开始和结束
有些同学上来就画处理步骤,却没写清楚从哪开始,到哪结束。
这样的图不完整。
### 2. 漏掉初始化
例如图里有 `i <= n ?`,却没有说明 `i` 一开始是多少。
别人就没法准确读图。
### 3. 判断框只画一条路
判断框至少应有两条路:
- 是 / 否
- 满足 / 不满足
如果只画一边,基本就是漏了步骤。
### 4. 忘了更新循环变量
例如有 `i <= n ?`,却没有 `i = i + 1`
这样很容易变成永远转圈的图。
### 5. 回边接错地方
循环一轮做完以后,通常应该回到“是否继续”的判断框。
如果回到了中间某一步,流程往往就变味了。
### 6. 分不清结束一层和结束全部
双重循环里尤其容易犯这个错。
你一定要分清:
- 是只停止当前这一层;
- 还是整个流程直接停止。
### 7. 一个框里塞太多内容
流程图要清楚,不要把整段话都塞在同一个框里。
一个框最好只写一步主要操作。
### 8. 箭头方向不清楚
如果别人需要猜箭头是往哪走,那这张图就已经不够清楚了。
---
## 十四、画完以后,怎样自查?
一张流程图画完后,可以按下面这张检查单自己过一遍:
1. 有没有明确的开始和结束?
2. 输入和输出有没有写清楚?
3. 需要的初始化有没有漏掉?
4. 每个判断框是不是都画出了两条路?
5. 每个循环变量有没有更新?
6. 回头箭头是不是回到了正确的位置?
7. 中途停止时,是停一层还是停全部,有没有画清楚?
8. 能不能拿一组小数据,从头到尾手推一遍?
只要这 8 条都能过,流程图一般就比较靠谱了。
---
## 十五、这一节最该记住的几句话
最后把最重要的内容收成几句:
1. 流程图本质上是做事步骤的路线图。
2. 读流程图时,要顺着箭头走,不要跳着猜。
3. 判断框不能只看条件,还要看两条路分别去哪。
4. 箭头回到前面,通常就是循环。
5. 中途直接走向输出或结束,通常就是提前停止。
6. 画流程图前,先把步骤用人话写清楚。
7. 双重循环最容易错的地方,是没有分清“结束一层”和“结束全部”。
8. 检查流程图最可靠的方法,是拿小数据手推。
---
## 十六、课后练习建议
如果你想真正把这节学会,建议按下面顺序练:
1. 先练最基础的“顺序 + 单判断”流程图。
2. 再练“单循环 + 中途停止”流程图。
3. 最后练“按行按列处理”的双重循环流程图。
练的时候,不要只看答案。
最好自己先画,再让同学按你的图读一遍。
如果别人能顺着你的图完整说出步骤,那说明你真的画清楚了。