
2.3 表示算法的多种方法
为了描述一个算法,可以采用许多不同的方法,常用的有自然语言、流程图、N-S流程图、伪代码和计算机语言等。其中,自然语言描述算法通俗易懂,但比较烦琐冗长,不直观,容易产生歧异;伪代码描述的算法与自然语言相比,比较紧凑;流程图表示的算法,通过图形描述,逻辑清楚、形象直观、容易理解,所以得到广泛的应用。但总体上各有特色,读者可自行选择,下面来分别说明。
2.3.1 用自然语言表示算法
自然语言表示算法,一般用于比较简单的问题;复杂一些的问题一般不用自然语言来表示算法。自然语言表示算法的例子见“2.1.2 算法举例”。
对于不复杂的简单问题,算法也可用文字来总体分析与叙述。
2.3.2 用流程图表示算法
算法的传统流程图表示法一直是算法表示的主流之一,相对于其他算法表示方法,流程图表示算法直观形象、易于理解。首先通过表2-1认识一下常用的传统流程图符号。
表2-1 流程图图形符号

根据这些图形符号,可以将前面用自然语言描述的算法,再用流程图表示成如下形式(读者不妨与自然语言描述的算法对比一下)。
【例2-6】 A和B数据互换,如图2-3所示。
【例2-7】求两个数A、B中的最大数,如图2-4所示。

图2-3 A和B两数交换的流程图

图2-4 求A、B两数中最大数的流程图
【例2-8】求n!(n≥1)的算法流程图,如图2-5所示。

图2-5 n!算法流程图
【例2-9】将【例2-4】的算法用流程图表示,如图2-6所示。
【例2-10】将【例2-5】(判定2000—2500年中的每一年是否闰年,将结果输出)的算法用流程图表示,如图2-7所示。

图2-6 例2-4流程图

图2-7 例2-5流程图
2.3.3 用N-S流程图表示算法
N-S图也被称为盒图或CHAPIN图,这种新型流程图是1973年美国学者I. Nassi和B. Shneiderman共同提出的,为此称为N-S图。
传统流程图由一些特定意义的图形、流程线及简要的文字说明构成,它能清晰明确地表示程序的运行过程。在使用过程中,人们发现流程线不一定是必需的,为此,人们设计了一种新的流程图,它把整个程序算法写在一个大框图内,这个大框图由若干个小的基本框图构成,这种流程图简称N-S图。
结构化程序设计提倡的3种基本程序结构的N-S图如图2-8所示。

图2-8 3种基本程序结构的N-S图
a)顺序结构 b)选择结构 c)当型循环结构 d)直到型循环结构
【例2-11】将例2-4的算法用N-S流程图表示,如图2-9所示。
【例2-12】将例2-5的算法用N-S流程图表示,如图2-10所示。

图2-9 例2-4N-S流程图

图2-10 例2-5 N-S流程图
2.3.4 用伪代码表示算法
伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法。伪代码表达算法不用图形符号,因此书写容易,格式紧凑,易改易懂,也便于向计算机语言算法(即程序)过渡。下面举一个例子来说明。
【例2-13】用伪代码表示求n!(n≥1)的算法。

从以上例子可知,伪代码书写格式比较自由,容易表达出设计者的思想,表达的算法也容易修改完善。读者在表达程序思路时可以根据需要与习惯选用。
2.3.5 用计算机语言表示算法
用计算机解题就是用计算机实现算法。用计算机语言表示算法,即可一步到位。计算机语言表示算法必须严格遵循所用语言的语法规则。初学者建议先用其他算法表示方法表示后,再用某计算机语言编写出程序。熟练或专业程序编写人员,面对简单或熟悉的算法问题是可以直接用程序语言来编写实现的。本书后续章节中有许多例题,是在给出解题思路或解题算法后,写出程序的。这里只给出一个例子以说明C语言的算法直接表示方法。
【例2-14】求n!(n≥1)的C语言程序。

