
程序流程图是用标准符号把一段程序的执行逻辑画出来的图,横竖三件事:算什么、在哪儿分岔、哪儿要绕回去。
它和业务流程图看着像,规矩却严得多——符号由国家标准规定,判断框必须两个出口,循环必须回连到确定位置。考试扣分和评审被打回,几乎都出在这些硬规矩上,不是画得好不好看。
一、和业务流程图不是一回事
| 程序流程图 | 业务流程图 | |
|---|---|---|
| 描述对象 | 一段程序或算法的执行逻辑 | 一项业务的办理过程 |
| 符号 | 国标 GB/T 1526(等同 ISO 5807) | 约定俗成,可自定义 |
| 判断框出口 | 必须恰好两个 | 可以多路分支 |
| 典型场景 | 算法说明、课程设计、软考、二级 | 审批流、报销流、办理流程 |
最实质的区别是自由度。 业务流程图里加个自定义图形、让判断分出三条路,通常没人计较;程序流程图不行。要画部门之间怎么流转,那该看流程图怎么画,本文的规矩对你过严了。
二、六个标准符号
| 符号 | 形状 | 用途 | 出入口 |
|---|---|---|---|
| 起止框 | 圆角矩形或椭圆 | 程序的开始和结束 | 开始只出,结束只入 |
| 处理框 | 矩形 | 赋值、计算等动作 | 1 入 1 出 |
| 判断框 | 菱形 | 条件判断 | 1 入 2 出 |
| 输入输出框 | 平行四边形 | 读入数据、输出结果 | 1 入 1 出 |
| 预定义处理 | 双竖边矩形 | 调用子程序或已有函数 | 1 入 1 出 |
| 连接符 | 小圆圈,内标字母 | 跨页续接流程线 | 成对出现 |
再加上流程线——带箭头的直线。三个最常见的错误:
- 用矩形当判断框。条件判断必须用菱形,写成
if x > 0塞进矩形不算 - 判断框只引出一条线。菱形必须两个出口且都标注"是/否"。只画满足条件的那条路等于没写 else
- 输入输出用了处理框。
scanf/print/ 读文件用平行四边形,计算和赋值才用矩形
还有一条常被忽略的规矩:一张图只能有一个"开始",但可以有多个"结束"。多个入口是逻辑错误,多个出口不是。
三、三种基本结构
结构化程序设计的结论是:任何程序都能由三种基本结构组合而成。图的合法性就是看能不能拆成这三种结构的嵌套。

顺序结构——处理框自上而下串联,没有分岔。
选择结构——一个判断框引出两条路,在下方汇合再继续往下。双分支对应 if-else;单分支是一条路有处理、另一条空着直接到汇合点;多分支(switch-case)的标准画法是多个判断框串联,而不是从一个菱形引出四五条线。
循环结构——判断框的一个出口经过若干处理后,用流程线回连到确定位置。分两种:
当型循环(while 型、前测试)先判断后执行,条件一开始不成立就一次都不执行,判断框在循环体上方;直到型循环(until 型、后测试、do-while)先执行一次再判断,最少执行一次,判断框在循环体下方。
"最少执行几次"是两者唯一实质的区别,也是考试最爱考的点。 写代码时随手就选了,画图时必须明确表达。
四、从代码到流程图的对照规则
代码结构和图形结构一一对应:
| 代码 | 图形 |
|---|---|
scanf() / input() / print() |
输入输出框 |
if (cond) { A } |
判断框,"是"走 A,"否"直接到汇合点 |
if (cond) { A } else { B } |
判断框两个出口分别走 A 和 B,下方汇合 |
while (cond) { A } |
判断框在上,末尾回连到判断框上方 |
do { A } while (cond); |
A 在上,判断框在下,"是"回连到 A 上方 |
for (i=0; i<n; i++) { A } |
拆成三块:i=0 处理框、i<n 判断框、A 加 i++ 循环体 |
for 循环最容易画错。 代码里是一行,图里必须拆成三部分:初始化在循环之前,条件判断在循环顶部,自增在循环体末尾。i++ 漏掉或放错位置,图上就是死循环。
五、先定粒度,再动笔
同一段代码可粗可细,粒度选错图就废了。依据是"这张图给谁看":
- 讲算法思路——粗粒度。一个处理框对应一个逻辑步骤
- 课程设计、软考、二级考试——中粒度。每个框对应一到两条语句,判断条件写成可执行表达式(
i < n而不是"还没遍历完") - 代码评审、交接文档——按函数粒度。一个函数一个预定义处理框,细节留在子图里
自查标准:一张图控制在 15 到 20 个框以内。超过就把一段逻辑收成预定义处理框,另开子图展开。硬塞在一张图里流程线会交叉,一多就没人读得下去。
六、循环回连线怎么画不容易错
循环是唯一需要"往回画"的地方,线最容易乱:
第一,回连线走图形外侧,不穿过任何框。 三段折线:从循环体末尾横向拉出,竖直向上,水平接回,不走斜线。
第二,回连点必须明确。 当型回到判断框的上方入口,直到型回到循环体第一个框上方。接到判断框侧面,会看不出这是循环还是分支。
第三,continue 和 break 方向相反。 continue 回连到循环体开头或判断框,break 是跳出循环、连到循环结构汇合点之后。画反逻辑就全错。
三层以上嵌套时回连线必然交叉,不要硬画——用连接符在断点和续接处画一对同字母小圆圈,或把内层循环抽成子程序。
七、七个高频扣分点
- 判断框只有一个出口——必须两个,且都标注是/否
- 判断条件写成自然语言——写"数据合法吗"不如写
x >= 0 && x <= 100 - 处理框里塞了三行代码——一个框一件事,多了就拆
- 流程线没有箭头——所有流程线必须带箭头,即使方向"显而易见"
- 分支不汇合就各自接结束框——后面还有逻辑的,必须先汇合再往下
- for 循环漏掉自增——
i++必须作为处理框出现在循环体末尾 - 开始框有入口、结束框有出口——开始只能出,结束只能进
八、N-S 图和 PAD 图:什么时候换一种画法
程序流程图有个先天问题:流程线可以随便连,所以画得出非结构化的程序。为此出现过两种替代画法:
- N-S 图(盒图)——取消流程线,用嵌套矩形块表示结构,物理上就画不出跳转
- PAD 图——二维树形结构,从左向右展开层次,纵向表示顺序,适合深度嵌套
逻辑清晰、嵌套不深用程序流程图;要强制检查结构化程度用 N-S 图;教学和逐步求精用 PAD 图。实际工作中程序流程图仍是默认选择,门槛最低。
九、从伪代码快速出图
手工拖拽很慢——加一个判断框,下面所有图形都要往下挪。更快的是先用文本描述结构,再转成图。Mermaid 的 flowchart 语法可以直接表达:
flowchart TD
S([开始]) --> I[/输入 n/]
I --> A["i = 1, sum = 0"]
A --> C{i <= n?}
C -- 是 --> B["sum = sum + i"]
B --> D["i = i + 1"]
D --> C
C -- 否 --> O[/输出 sum/]
O --> E([结束])
形状语法:([文字]) 圆角起止框,[文字] 处理框,{文字} 判断框,[/文字/] 输入输出框。D --> C 就是循环的回连线。

文本语法改得快、能进版本管理,缺点是版式不可控。所以常见做法是两步走:用文本把逻辑写对,再导入画布调布局。英飞·思想家支持把 Mermaid 代码转成可编辑图形,每个框都能单独拖动、改大小和配色,见Mermaid 转图表。
纸上的草稿可以拍照后用手绘转图表数字化;要表达模块之间的调用往来而非单段逻辑,那该换成时序图。
常见问题
程序流程图和业务流程图有什么区别?
程序流程图描述一段程序的执行逻辑,符号由国标 GB/T 1526 约定,判断框恰好两个出口;业务流程图描述业务办理过程,符号约定俗成,允许多路分支,通常体现部门或岗位。
判断框可以有三个出口吗?
不可以,标准判断框是一进两出。多分支(switch-case)的正确画法是多个判断框串联。
当型循环和直到型循环怎么区分?
当型(while)先判断后执行,条件一开始不成立就一次都不执行;直到型(do-while)先执行一次再判断,最少执行一次。
for 循环怎么画成流程图?
拆成三部分:初始化画成循环之前的独立处理框,条件判断画成循环顶部的判断框,自增画成循环体末尾的处理框。漏掉自增就是死循环。
一张程序流程图画多少个框合适?
15 到 20 个以内。超过就把一段逻辑收成预定义处理框,另开子图展开。框太多流程线会交叉,图就读不下去。
结语
程序流程图的规矩比业务流程图严,但也就几条:符号按国标用、判断框两个出口、三种基本结构不许破、分支必须汇合、循环回连点要明确。守住这五条,图就是对的。
画之前先定粒度——给谁看决定了一个框该装多少内容。先用文本把逻辑写通,再进画布调版式,比一开始拖图形省下大量返工。