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

10 KiB
Raw Blame History

4.0 流程图的画法与读法


一、这节课到底学什么?

这节课只抓 3 件事:

  1. 看到流程图,能顺着箭头说出每一步在干什么。
  2. 看到判断框,能分清“是”走哪条路,“否”走哪条路。
  3. 能把一道题的做法,手绘成清楚的流程图。

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

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

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


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

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

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

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

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

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

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


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

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

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 的和。

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就立刻输出并结束。

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找到就立刻输出它的位置。

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就立刻停止并输出。

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