泡面编程 /第3章
程序的语法
本节我们将掌握程序语法的概念,并真正定义几条语法规则。
人类的语言被称为“自然语言”,汉语、英语、日语都属于自然语言。
我一岁半的儿子现在虽然还不会说,但是已经能够听懂不少话了。当我们问他:“你现在多沉了啊?”他就会屁颠屁颠地走到卧室,站到体重秤上,然后指着秤上的数字喊着“啊!啊!”的声音让我看。一岁半的婴儿就能够听懂,似乎人类的自然语言很简单,也很好理解。
实际上,人类的自然语言是很复杂的且难以理解的,至少对于计算机看来是这样的。例如,针对同样的含义,使用自然语言可能会有不同的表述。例如下面的多行语句中,各行的表述不同,但表示的意思都是一样的。
将方便面从袋子中取出,放到干净的碗中。
把从袋子中取出来的方便面放到干净的碗中。
在干净的碗中放入从袋子中取出的方便面。
并且人类对自然语言中错误的容忍性很高。有一个挺有趣的例子:
研表究明,汉字的序顺不影阅响读。
上述话是乱序的,但是你也可以理解上面的意思,甚至在第一遍阅读时都没有发现错误之处。
而计算机的本质是机器,很死板,所以写给他的语言必须要完全遵守约定好的规则。少些漏写哪怕一个字母、一个标点,计算机都会因为不认识而报错。所以我们上面列举这些情况,对于计算机而言过于复杂,很难理解。
因此,使用人类的自然语言控制计算机并不是一个好的选择1。
我们需要一种明确、易于被计算机接受的方式去控制计算机,于是就出现了“程序语言”。程序语言和自然语言相比,它有着严格的书写规则,这一套规则就是语法。
就像是数学一样,数学就规定了一整套的规则:解答时,先用“解:”开始,用“∵”表示“因为”,用“∴”表示所以,用“∈”表示集合中的“属于”,用“∥”表示“平行”等等。并且数学中对每个符号的含义进行了明确的定义,例如,集合中“∈”的定义是:
这套规则使得数学成了一门十分严谨的科学,如图 1所示,不同的人在阅读同一个数学证明时,就不会有歧义。

和计算机交流时,也要十分严谨,不能有歧义,因此和计算机交流要有明确的规则。刚刚我们已经说过,自然语言不是一种好的选择。流程图给出了一些标准的符号,比自然语言要严谨了一些,可画毕竟要比写麻烦不少,并不是特别适合用来编程2。十分有必要来定义一套新的规则,作为程序的语法。
既然程序都是由顺序结构、选择结构、循环结构这三种结构组成的,那我们十分有必要先定义下它们的语法。
提前说明一下,我们定义的语法中,凡是不带下划线的部分,都是语法规则设定的,这部分必须要一字不错,不能随意修改。凡是带有下划线的部分,是可以根据需要填入的。
下面图 2左侧是顺序结构的流程图,右侧是对应的程序语法。

顺序结构的程序语法非常简单,就是每一步占一行,依次向下写就好。
那图 3所示的泡面流程图中的顺序结构部分:

就可以用顺序结构的语法写出来:
将方便面从袋子中取出,放到干净的600ml容量的空碗中。
取出一包调料包,拆开,将调料倒入上述碗中。
下面图 4左侧是选择结构的流程图,右侧是对应的程序语法。

这里注意的是,我们在定义语法时使用了缩进,输入四个空格就可以实现这样的缩进。当然,也有人习惯在键盘上按一下“Tab”键来代替四个空格,这也是可以的,我们不做强制要求,但是要求保持统一,不能两种混合使用。
凡是缩进的内容,都属于该选项对应的操作,直到出现没有缩进的行为止。例如我们选择了“选项1”,那后面“选项1”对应的操作可以包含很多行,只要保持缩进就好,直到第一条没有缩进的语句出现的时候,表示“选项1”对应的操作结束了。
那图 5所示的泡面流程图中的选择结构部分:

就可以用选择结构的语法写出来:
若满足 喜欢硬的面 :
等待3分钟
否则若满足 喜欢软硬适中的面 :
等待4分钟
否则若满足 喜欢软的面 :
等待5分钟
下面图 6左侧是循环结构的流程图,右侧是对应的程序语法。

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

就可以用循环结构的程序语法写出来:
当符合 还有调料包 :
取出一包调料包,拆开,将调料倒入上述碗中。
掌握了三种结构的程序语法,接下来我们可以尝试将整个流程图都使用我们程序语法写出来。你可以先不看答案,尝试自己写一下,然后再和下面的答案作对比。
将方便面从袋子中取出,放到干净的600ml容量的空碗中。
取出一包调料包,拆开,将调料倒入上述碗中。
当符合 还有调料包 :
取出一包调料包,拆开,将调料倒入上述碗中。
向碗中注入500ml温度为100℃的水,并立刻用直径大于碗的碟子盖住碗。
若满足 喜欢硬的面 :
等待3分钟
否则若满足 喜欢软硬适中的面 :
等待4分钟
否则若满足 喜欢软的面 :
等待5分钟
打开盖住碗的碟子。
好了,可以参照上面,看下自己写的对不对。
我们已经使用三种结构的语法写出了泡面的步骤,不过要写出完整的程序,仅靠这三种结构的语法还不够,接下来,我们会在下一节再定义几个语法。然后你就可以真的写出程序了。