泡面编程 /第2章

流程图

本节我们了解编程过程中一个重要的工具——流程图。

现在,你的朋友应该正在泡方便面了。那我们也可以梳理下咱们的泡面算法了:

  • 第①步:将方便面从袋子中取出,放到干净的600ml容量的空碗中。
  • 第②步:取出调料包,拆开,将调料倒入上述碗中。
  • 第③步:检查是否还有调料包。如果有,重复第②步;如果没有,进入下一步。
  • 第④步:向碗中注入500ml温度为100℃的水,并立刻用直径大于碗的碟子盖住碗。
  • 第⑤步:如果喜欢硬一点的面,则等3分钟;如果喜欢软硬适中的面,则等4分钟;如果喜欢软一点的面,则等5分钟。
  • 第⑥步:时间一到就打开盖住碗的碟子,就可以吃面了。

可以看出,整个算法的主体结构就是从第①步到第⑥步顺序执行,没什么难度。

但是也有两处存在一些特殊的操作。

最明显的是第⑤步,这里会根据朋友的选择,产生多种情况。

还有第③步,这里如果有多个调料包,则要回到第②步。而如果方便面中的调料包很多的话,则会一直在②③步之间循环。直到所有的调料包都被拆完。

以上,其实体现了三种结构:

  • 顺序结构:按照步骤顺序依次执行。
  • 选择结构:进行某些条件进行判断,并根据判断结果执行不同的步骤。
  • 循环结构:不断地重复一些步骤,直到最后满足一定条件后,才停止重复。

以上这些结构也可以用图形表示出来,那样会更加直观一些。

顺序结构最为简单,就是按照步骤顺序依次执行,如图 1所示。

顺序结构
图 1:顺序结构

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

选择结构
图 2:选择结构

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

循环结构
图 3:循环结构

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

泡方便面流程图
图 4:泡方便面流程图

这就是流程图,它和我们文字版本的泡面算法是等价的。但显然流程图的表现力更强,能够将算法的结构更为清晰地展现出来。

刚才我们只介绍了算法和流程图中的三种结构,即顺序结构、选择结构、循环结构,然后就只用这三种结构便画出了我们的泡面算法。可我们的泡面算法毕竟是很简单的,会不会有一些复杂的算法只靠这三种结构是无法实现的?

可以确切地告诉你,这三种结构就完全足够了。无论多复杂的程序都可以只用这三种结构组合而成。科学家们早已经证明了这一点1

因此,流程图并不复杂,核心就是上面介绍的三种结构。下表展示了常用的几个符号,我们在前面都已经用过了:

流程图常用符号

当我们在设计算法时,可以画出算法的流程图,它真的很有用。有经验的程序员就经常画流程图来帮助自己理清算法思路,或者用来向其他程序员传达自己的算法思路。如果你参与到程序员们的日常讨论中,说不定会遇到他们对着一张流程图激烈地讨论。

而只要能画出算法的流程图,就真的离写出电脑运行的程序很近了!

事实上,只要将流程图中的内容用程序语法写出来,就得到了程序。

可什么是程序的语法呢?

我们下节就回答这个问题。


  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. ↩︎