泡面编程 /第2章
流程图
本节我们了解编程过程中一个重要的工具——流程图。
现在,你的朋友应该正在泡方便面了。那我们也可以梳理下咱们的泡面算法了:
- 第①步:将方便面从袋子中取出,放到干净的600ml容量的空碗中。
- 第②步:取出调料包,拆开,将调料倒入上述碗中。
- 第③步:检查是否还有调料包。如果有,重复第②步;如果没有,进入下一步。
- 第④步:向碗中注入500ml温度为100℃的水,并立刻用直径大于碗的碟子盖住碗。
- 第⑤步:如果喜欢硬一点的面,则等3分钟;如果喜欢软硬适中的面,则等4分钟;如果喜欢软一点的面,则等5分钟。
- 第⑥步:时间一到就打开盖住碗的碟子,就可以吃面了。
可以看出,整个算法的主体结构就是从第①步到第⑥步顺序执行,没什么难度。
但是也有两处存在一些特殊的操作。
最明显的是第⑤步,这里会根据朋友的选择,产生多种情况。
还有第③步,这里如果有多个调料包,则要回到第②步。而如果方便面中的调料包很多的话,则会一直在②③步之间循环。直到所有的调料包都被拆完。
以上,其实体现了三种结构:
- 顺序结构:按照步骤顺序依次执行。
- 选择结构:进行某些条件进行判断,并根据判断结果执行不同的步骤。
- 循环结构:不断地重复一些步骤,直到最后满足一定条件后,才停止重复。
以上这些结构也可以用图形表示出来,那样会更加直观一些。
顺序结构最为简单,就是按照步骤顺序依次执行,如图 1所示。

选择结构也不难,就是进行某些条件进行判断,并根据判断结果执行不同的步骤。如图 2所示,在图中的特点就是存在执行步骤的分叉。

循环结构稍微复杂一点,它同样存在一个判断模块,如果判断满足循环条件则继续循环,如果不满足循环条件,则跳出循环执行后面的步骤,如图 3所示。要注意的是,每一次循环结束后,都会再判断一下是继续循环还是退出。

既然我们可以用图的形式将以上三种结构画出来,那肯定也可以将整个泡面算法画出来。这个过程并不复杂,就是上面三种结构的混合使用,结果如图 4。

这就是流程图,它和我们文字版本的泡面算法是等价的。但显然流程图的表现力更强,能够将算法的结构更为清晰地展现出来。
刚才我们只介绍了算法和流程图中的三种结构,即顺序结构、选择结构、循环结构,然后就只用这三种结构便画出了我们的泡面算法。可我们的泡面算法毕竟是很简单的,会不会有一些复杂的算法只靠这三种结构是无法实现的?
可以确切地告诉你,这三种结构就完全足够了。无论多复杂的程序都可以只用这三种结构组合而成。科学家们早已经证明了这一点1。
因此,流程图并不复杂,核心就是上面介绍的三种结构。下表展示了常用的几个符号,我们在前面都已经用过了:
当我们在设计算法时,可以画出算法的流程图,它真的很有用。有经验的程序员就经常画流程图来帮助自己理清算法思路,或者用来向其他程序员传达自己的算法思路。如果你参与到程序员们的日常讨论中,说不定会遇到他们对着一张流程图激烈地讨论。
而只要能画出算法的流程图,就真的离写出电脑运行的程序很近了!
事实上,只要将流程图中的内容用程序语法写出来,就得到了程序。
可什么是程序的语法呢?
我们下节就回答这个问题。
-
1966年,计算机科学家Bohm和Jacopini已经在下面的论文中证明了这一点。Bohm C., Jacopini G. “Flow diagrams, Turing machines and languages with only two formation rules.” Communications of the Association for Computing Machinery, Vol.9, pp. 366–371. 1966. ↩︎