泡面编程 /第3章

程序的语法

本节我们将掌握程序语法的概念,并真正定义几条语法规则。

人类的语言被称为“自然语言”,汉语、英语、日语都属于自然语言。

我一岁半的儿子现在虽然还不会说,但是已经能够听懂不少话了。当我们问他:“你现在多沉了啊?”他就会屁颠屁颠地走到卧室,站到体重秤上,然后指着秤上的数字喊着“啊!啊!”的声音让我看。一岁半的婴儿就能够听懂,似乎人类的自然语言很简单,也很好理解。

实际上,人类的自然语言是很复杂的且难以理解的,至少对于计算机看来是这样的。例如,针对同样的含义,使用自然语言可能会有不同的表述。例如下面的多行语句中,各行的表述不同,但表示的意思都是一样的。

将方便面从袋子中取出,放到干净的碗中。

把从袋子中取出来的方便面放到干净的碗中。

在干净的碗中放入从袋子中取出的方便面。

并且人类对自然语言中错误的容忍性很高。有一个挺有趣的例子:

研表究明,汉字的序顺不影阅响读。

上述话是乱序的,但是你也可以理解上面的意思,甚至在第一遍阅读时都没有发现错误之处。

而计算机的本质是机器,很死板,所以写给他的语言必须要完全遵守约定好的规则。少些漏写哪怕一个字母、一个标点,计算机都会因为不认识而报错。所以我们上面列举这些情况,对于计算机而言过于复杂,很难理解。

因此,使用人类的自然语言控制计算机并不是一个好的选择1。

我们需要一种明确、易于被计算机接受的方式去控制计算机,于是就出现了“程序语言”。程序语言和自然语言相比,它有着严格的书写规则,这一套规则就是语法。

就像是数学一样,数学就规定了一整套的规则:解答时,先用“解:”开始,用“∵”表示“因为”,用“∴”表示所以,用“∈”表示集合中的“属于”,用“∥”表示“平行”等等。并且数学中对每个符号的含义进行了明确的定义,例如,集合中“∈”的定义是:

如果a是集合A的元素,就说a属于集合A,记作a∈A。

这套规则使得数学成了一门十分严谨的科学,如图 1所示,不同的人在阅读同一个数学证明时,就不会有歧义。

数学证明过程
图 1:数学证明过程

和计算机交流时,也要十分严谨,不能有歧义,因此和计算机交流要有明确的规则。刚刚我们已经说过,自然语言不是一种好的选择。流程图给出了一些标准的符号,比自然语言要严谨了一些,可画毕竟要比写麻烦不少,并不是特别适合用来编程2。十分有必要来定义一套新的规则,作为程序的语法。

既然程序都是由顺序结构、选择结构、循环结构这三种结构组成的,那我们十分有必要先定义下它们的语法。

提前说明一下,我们定义的语法中,凡是不带下划线的部分,都是语法规则设定的,这部分必须要一字不错,不能随意修改。凡是带有下划线的部分,是可以根据需要填入的。

下面图 2左侧是顺序结构的流程图,右侧是对应的程序语法。

顺序结构的流程图与程序语法
图 2:顺序结构的流程图与程序语法

顺序结构的程序语法非常简单,就是每一步占一行,依次向下写就好。

那图 3所示的泡面流程图中的顺序结构部分:

泡面流程图中的顺序结构
图 3:泡面流程图中的顺序结构

就可以用顺序结构的语法写出来:

将方便面从袋子中取出,放到干净的600ml容量的空碗中。
取出一包调料包,拆开,将调料倒入上述碗中。

下面图 4左侧是选择结构的流程图,右侧是对应的程序语法。

选择结构的流程图与程序语法
图 4:选择结构的流程图与程序语法

这里注意的是,我们在定义语法时使用了缩进,输入四个空格就可以实现这样的缩进。当然,也有人习惯在键盘上按一下“Tab”键来代替四个空格,这也是可以的,我们不做强制要求,但是要求保持统一,不能两种混合使用。

凡是缩进的内容,都属于该选项对应的操作,直到出现没有缩进的行为止。例如我们选择了“选项1”,那后面“选项1”对应的操作可以包含很多行,只要保持缩进就好,直到第一条没有缩进的语句出现的时候,表示“选项1”对应的操作结束了。

那图 5所示的泡面流程图中的选择结构部分:

泡面流程图中的选择结构
图 5:泡面流程图中的选择结构

就可以用选择结构的语法写出来:

若满足 喜欢硬的面 :
    等待3分钟
否则若满足 喜欢软硬适中的面 :
    等待4分钟
否则若满足 喜欢软的面 :
    等待5分钟

下面图 6左侧是循环结构的流程图,右侧是对应的程序语法。

循环结构的流程图与程序语法
图 6:循环结构的流程图与程序语法

这里同样也用到了缩进,缩进的内容都是属于循环的一部分,每一次循环中,都会将这些操作依次执行完,然后再回到最上面的判断部分,去判断是不是继续下一次执行。

那图 7所示的泡面流程图中的循环结构这部分:

泡面流程图中的循环结构
图 7:泡面流程图中的循环结构

就可以用循环结构的程序语法写出来:

当符合 还有调料包 :
    取出一包调料包,拆开,将调料倒入上述碗中。

掌握了三种结构的程序语法,接下来我们可以尝试将整个流程图都使用我们程序语法写出来。你可以先不看答案,尝试自己写一下,然后再和下面的答案作对比。

将方便面从袋子中取出,放到干净的600ml容量的空碗中。
取出一包调料包,拆开,将调料倒入上述碗中。
当符合 还有调料包 :
    取出一包调料包,拆开,将调料倒入上述碗中。
向碗中注入500ml温度为100℃的水,并立刻用直径大于碗的碟子盖住碗。
若满足 喜欢硬的面 :
    等待3分钟
否则若满足 喜欢软硬适中的面 :
    等待4分钟
否则若满足 喜欢软的面 :
    等待5分钟
打开盖住碗的碟子。

好了,可以参照上面,看下自己写的对不对。

我们已经使用三种结构的语法写出了泡面的步骤,不过要写出完整的程序,仅靠这三种结构的语法还不够,接下来,我们会在下一节再定义几个语法。然后你就可以真的写出程序了。


  1. 近些年AI技术的发展为这创造了可能,现在的计算机已经可以和我们流畅地进行多轮对话,并回答我们提出的问题了。在后面的章节我们会介绍这一切是如何做到的。 ↩︎

  2. 确实有些场景可以使用流程图来实现编程。典型的,Scratch语言就支持使用类似流程图的形式编程,只需要拖拖拽拽就可以完成一些简单的编程操作,非常适合小朋友们学习。 ↩︎