把「怎么解决这个问题」说给别人听,可以有很多种说法:用嘴描述、画一张图、写一段像代码又不是代码的草稿。算法描述就是这件事的正式说法,最常用的三种方式是:自然语言描述、流程图描述、伪代码描述。
程序流程图(简称流程图):用统一规定的标准符号,描述程序运行具体步骤的图形表示。它是程序设计最根本的依据——一张流程图把「先做什么、再做什么、什么条件下做什么」画得清清楚楚,符号和画法都有约定,谁画出来的意思都一样。
为什么值得单独学一节?因为:
按「认识符号 → 三种描述方式怎么选 → 三种基本结构怎么画 → 完整画一张」的顺序,本讲分四个知识块:
1. 流程图符号——六种标准符号,各画各的形状,不能混用;
2. 三种算法描述方式的取舍——自然语言 / 流程图 / 伪代码,各有优劣,看场景选;
3. 三种基本结构的画法——顺序、分支、循环,所有流程图都由它们搭出来;
4. 完整例子——把同一个算法用三种方式各描述一遍,一一对应着看。
⚠️ 只认识符号还不够:流程图题考的是顺着箭头把流程走一遍,把每走一步变量的值记下来,图读对了,答案自然出来。
| 符号 | 名称 | 功能 | 记忆点 |
|---|---|---|---|
| 圆角矩形 | 起止框 | 表示流程的开始或结束 | 一张图里「开始」「结束」各一个 |
| 平行四边形 | 输入输出框 | 表示输入输出功能 | 数据进出程序都走它 |
| 矩形 | 处理框 | 表示一般的处理功能(计算、赋值) | 最常见,一个框干一件事 |
| 菱形 | 判断框 | 对一个给定条件判断,按条件是否成立决定走哪个分支 | 一定有两个出口:是 / 否 |
| 带箭头线 | 流程线 | 表示流程的路径和方向 | 箭头指明「下一步去哪」 |
| 小圆圈 | 连接点 | 把画不下的流程接到另一处 | 图太大、跨页时用它对接 |
| 描述方式 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 自然语言 | 通俗易懂,不用学任何记号 | 算法一含判断、循环,或步骤一多,就冗长、容易产生歧义 | 向完全不懂的人解释思路 |
| 流程图 | 清晰地展现完整操作过程,方便在工作中检查和修改算法 | 有一套约定符号,绘制过程比较繁琐 | 梳理控制流程、初赛读图题 |
| 伪代码 | 结构清晰、代码简单、可读性好;不用拘泥于具体语言的语法限制,书写格式自由,意思表达清楚即可 | 不能直接运行;关键语句一般用英文单词,需要一点约定俗成 | 竞赛中快速打草稿、写题解 |
伪代码不必编译通过,也不属于任何一种编程语言:表达关键字的语句一般用英文单词(if、while、for、return),其他语句可以用英文句子也可以用中文句子。
所有流程图都由三种基本结构搭出来,每种结构都只有一个入口、一个出口:
两个画图细则:
i ≤ n、a = b、x > 0 都行;写「数值差不多就行」这种含糊话,流程图就没法走了。复合条件用「且」「或」连起来写清楚。例 1(循环结构):输入 n,求 1 + 2 + 3 + … + n 的和——三种描述方式各走一遍。
第一步:自然语言描述。
把计数器 i 置为 1,把累加器 s 置为 0。判断 i 是否不超过 n:如果不超过,把 i 加进 s,然后 i 增加 1,回到刚才的判断;如果超过,输出 s,结束。
读一遍就能感觉到:判断和循环一出现,纯文字已经开始绕了。
第二步:流程图描述。
┌──────────┐
│ 开 始 │ ← 起止框
└────┬─────┘
▼
┌─────────────┐
│ 输入 n │ ← 输入输出框
└──────┬──────┘
▼
┌─────────────┐
│ i=1, s=0 │ ← 处理框
└──────┬──────┘
▼
◇ i≤n ? ◇──否──→ ┌─────────┐
│是 │ 输出 s │──→ ┌──────┐
▼ └─────────┘ │ 结 束 │
┌─────────────┐ └──────┘
│ s = s + i │ ←┐
└──────┬──────┘ │ 循环体,执行完
▼ │ 绕回判断框
┌─────────────┐ │
│ i = i + 1 ─┼───┘
└─────────────┘菱形判断框两个出口一个标「是」一个标「否」;循环体处理完 i=i+1 后,流程线绕回判断框——这就是当型循环。
第三步:伪代码描述。
读入 n
i ← 1, s ← 0
while i ≤ n:
s ← s + i
i ← i + 1
输出 s第四步:翻译成 C++。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入输出框
int i = 1, s = 0; // 处理框:初始化
while (i <= n) { // 判断框(当型循环)
s = s + i; // 处理框:累加
i = i + 1; // 处理框:计数器加一
}
cout << s << endl; // 输出输出框
return 0;
}三张「图」逐块对应:伪代码的 while 对应流程图的菱形,s ← s + i 对应一个矩形处理框,cin >> n 对应平行四边形。会读图的人,看见流程图就能模拟出程序输出——初赛「读流程图求输出」的题就是这么做的:拿一张草稿纸,给每个变量开一列,顺着箭头一格一格走,循环几轮就把表填出来。
例 2(分支结构):输入两个整数 a、b,输出其中较大的那个。
流程图:开始 → 输入输出框「输入 a, b」→ 判断框 a ≥ b ? → 「是」出口接输出 a,「否」出口接输出 b → 两路汇合到结束。伪代码:
读入 a, b
if a ≥ b:
输出 a
else:
输出 b注意流程图里两条路是二选一的:走完其中一条,另一条碰都不碰。初赛题最爱在这里做文章——把「是 / 否」的标号对调,模拟时一走反,整道题的输出全错。
流程图本身不进复赛机考,但它出现在两处实打实的得分点上:
1. CSP-J 初赛与部分省市笔试的「流程图认读」:题目给一张流程图,问「输入某值时输出是多少」或「这个流程图算的是什么」。做法就是上面的填表模拟法,判断框的「是/否」出口千万别走反。
2. 编程题的打草稿方法:拿到一道顺序 / 分支 / 循环结构的入门题(比如下面练单里的「温度转换」「买文具」「手机电量显示」),先别急着写代码——先用三种方式各描述一遍:自然语言说步骤,画一张小流程图定分支和循环,再写成伪代码,最后翻译成 C++。练熟这条链路,写代码时就不会漏初始化、漏输出。
下面两个子模型给出符号细节和三种结构的画法,并配了对应结构的入门题,做完一题就回头看:这道题的流程图长什么样?
1. 判断框没标「是 / 否」两个出口:判断框必须有两个出口且各标明走向,只画一条线、或两条线都不标,读图的人不知道条件成立走哪条——考试里也最容易顺着箭头走错分支。
2. 符号混用:起止框画成矩形、输入输出画成矩形、判断画成矩形——形状是约定,混用等于说错话。最常犯的是把「输出 s」画成处理框:数据从程序里出来,要用平行四边形。
3. 流程线忘画箭头:没有箭头就分不清「往回绕(循环)」还是「往下走(顺序)」,循环结构直接失效。
4. 循环画成死循环:循环体执行完忘了让流程线绕回判断框,或绕回了但判断条件永远成立——检查每张循环流程图,确认存在一条「能走出循环」的路(如 i = i + 1 让 i ≤ n 终有一天不成立)。
5. 一个框塞好几件事:i=1, s=0 写在一个框里没问题,但把「输入、计算、输出」全塞进一个大矩形,流程图就失去了「一步一步看得清」的意义。一个框尽量只做一件事。
1. 六种流程图符号各自的形状是什么?「输入一个数」和「计算 a+b」分别该用哪种框?
2. 自然语言、流程图、伪代码三种描述方式各有一个主要缺点,分别是什么?写题解打草稿时一般选哪种?
3. 当型循环和直到型循环的判断时机有什么不同?为什么说「先判断」的循环可能一遍都不执行循环体?
4. 画出「输入两个数,输出其中较大的那个」的流程图:用了几个判断框、几条流程线?
5. 下面这段伪代码对应的是哪种基本结构?它有什么问题?
```
i ← 1
while i ≤ 10:
输出 i
```
(提示:顺着流程走一遍,程序会停吗?)
| 符号 | 名称 | 功能 | 常见错画 |
|---|---|---|---|
| 圆角矩形 | 起止框 | 流程的开始 / 结束 | 画成直角矩形 |
| 平行四边形 | 输入输出框 | 数据的输入、输出 | 画成矩形(和处理框混淆) |
| 矩形 | 处理框 | 计算、赋值等一般处理 | 把输入输出塞进来 |
| 菱形 | 判断框 | 按条件是否成立选路,两个出口标「是 / 否」 | 少画一个出口、不标是/否 |
| 带箭头线 | 流程线 | 流程的路径和方向 | 只画线忘画箭头 |
| 小圆圈 | 连接点 | 图太大跨页时,把断开的两处接起来 | 和别的符号混用 |
记忆口诀:圆头圆尾、菱形做主、方框干活、斜框进出——起止框两头圆,菱形负责判断,矩形负责计算,斜的(平行四边形)负责数据进出。
以「输入三角形三边 a、b、c,输出是否构成三角形」(条件:任意两边之和大于第三边)为例:
自然语言: 先读入三个数。如果 a 加 b 大于 c,并且 a 加 c 大于 b,并且 b 加 c 大于 a,三个条件都成立就输出「能」,否则输出「不能」。三个条件缺一不可,说的时候容易漏说、说歧义——这是自然语言的通病:判断一多就冗长、易歧义。
流程图: 一个输入输出框 → 一个判断框(条件 a+b>c 且 a+c>b 且 b+c>a,两个出口)→ 「是」出口接一个输出「能」的输入输出框,「否」出口接输出「不能」,两路汇合到结束。整体过程一图看清,也方便检查和修改,代价是画起来繁琐。
伪代码:
读入 a, b, c
if a+b>c 且 a+c>b 且 b+c>a:
输出 "能"
else:
输出 "不能"结构清晰、格式自由,不拘泥任何一种编程语言的语法;表达关键字的语句(if / else / while)一般用英文单词,其余可以用中文句子。竞赛里写题解、打草稿,伪代码最常用;真正落成代码前,先用它把逻辑走通。
| 场景 | 推荐 |
|---|---|
| 向完全没学过编程的人解释 | 自然语言 |
| 想看清分支与循环的走向、初赛读图题 | 流程图 |
| 写题解草稿、理思路 | 伪代码 |
下面三道题都是纯「输入 → 处理 → 输出」或带一个判断的入门题,做完每道题,回头把它对应的三种描述补全:
1. [B4062 温度转换](GESP 2024-12 一级):标准的顺序结构——一个输入框、一个处理框(套公式换算)、一个输出框。
2. [B3863 买文具](GESP 2023-09 一级):算总价、算找零,处理框连着处理框。
3. [B4409 商店折扣](GESP 2025-09 一级):总价达到门槛打折扣——一个判断框两个出口的分支结构。
任何流程图,无论多大,都由三种基本结构搭出来。每种结构都只有一个入口、一个出口——这是结构化程序设计的底线,保证了图不会绕成一团乱麻。
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 开 始 │──→│输入 a,b│──→│ c=a+b │──→│输出 c │──→│ 结 束 │
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘框自上而下排列,执行完上一个顺着流程线进入下一个,不需要判断框。日常的换算题(温度转换、单位换算、单价×数量)都是纯顺序结构。
┌──────────┐
──→ │ n ≥ 60 ? │
└──┬────┬──┘
是 │ │ 否
▼ ▼
┌────────┐ ┌────────┐
│输出「及格」│ │输出「不及格」│
└───┬────┘ └───┬────┘
└─────┬─────┘
▼ (两路汇合,一个出口)要点三条:判断框必须有两个出口;每个出口标注条件成立(是)与否(否);两条路最终汇合到同一出口,不能一条路通向结束、另一条路悬空。
多分支(如按分数段输出等级)就是多个菱形串联或嵌套,画的时候先把每个判断框的「是 / 否」写清楚,再连线。
当型(while):先判断,再干活。
┌──────┐
│ 开 始 │
└──┬───┘
▼
┌─────────┐
──→│ i ≤ 100 ?│────否──→(出口,去输出)
│ └────┬────┘
│ 是
│ ▼
│ ┌───────────┐
│ │ s = s + i │
│ └────┬──────┘
│ ▼
│ ┌─────────┐
└──┤ i = i+1 │
└─────────┘直到型(do-while):先干活,再判断。 循环体在判断框之前,条件不成立时才跳出(注意和当型相反:直到型是「满足就继续」还是「不满足就继续」取决于写法,do-while 是条件成立继续循环、不成立跳出时按「直到条件成立为止」的语义读题)。
两者最本质的区别是判断时机:当型先判断,条件一开始就不成立时,循环体一遍也不执行;直到型先执行,循环体至少跑一遍。 画循环图必须自查两件事:
1. 有没有一条流程线从循环体绕回判断框(没有就不叫循环);
2. 循环体里有没有让条件终有一天不成立的语句(如 i = i+1),否则是死循环。
初赛给图问输出,按三步走:
1. 给每个变量在草稿纸上开一列(值变了就新写一行,别覆盖);
2. 从「开始」顺着箭头走,每经过一个框就更新表格;
3. 走到「结束」,取输出变量的最后一行值。
循环多转几轮不可怕,表格不会骗人;最容易错的是判断框「是 / 否」走反,落笔前先圈出每个菱形的两个出口。
1. [B3847 当天的第几秒](GESP 样题 一级):给时、分、秒算当天第几秒——纯顺序结构。
2. [B4446 手机电量显示](GESP 2025-12 一级):按电量区间显示不同符号——多分支串联的判断框。
3. [B3923 小杨做题](GESP 2023-12 二级):做题数量逐天增长直到达标——当型循环,先判断再累加。
4. [B4574 棋盘上的奖赏](GESP 2026-09 一级):循环里套判断——循环体中含菱形,综合画一画。
学完这个考点,用历年真题检验一下
OI伴学 把「流程图与算法描述」在 CCF-GESP / CSP / NOIP 真题里出现过的题目汇总到一页,可按考点横向刷;每题都带答案、解题思维和常见错误。
看 流程图与算法描述 历年真题汇总 → 去平台刷题 →