
2.2 算法的表示
一个算法可以用多种不同的方式表示,如自然语言、流程图、N-S图、伪代码和计算机语言。因此,常常根据需要选择合适的方法表示算法。
2.2.1 用自然语言表示算法
算法可以用自然语言表示,这是一种最简单的表示方法。自然语言就是人们日常生活中使用的语言。用自然语言表示算法就是把算法过程用人们熟知的语言表达出来。这种表示的优点是通俗易懂,但是使用文字叙述比较冗长,自然语言表达可能有多种含义,容易产生歧义,而且当算法较为复杂的时候,用自然语言表示算法容易表述不清楚,出现错误。因此,用自然语言表示算法适用于很小的算法或初学者。
【例2-1】输入3个不同的实数,找到其中最大的数并输出,用自然语言表达算法如下。
算法开始,输入3个不同的实数N1、N2、N3,比较N1和N2,若N1>N2,比较N1和N3,若N1>N3,打印N1,否则打印N3;若N1<N2,比较N2和N3,若N2>N3,打印N2,否则打印N3,算法结束。
2.2.2 用流程图表示算法
由例2-1可以看出,用自然语言表示算法不直观、不简洁,对于一个小问题的算法也可能需要用很长的一段自然语言表达,与用自然语言表示算法相比,用流程图表示算法更加简单直观、便于理解。流程图是算法的一种图形化表示方式,用一些规定的框图将算法的运算过程表达出来。美国国家标准化协会ANSI规定了一些常用的流程图符号,如图2-1所示,用统一的符号画流程图方便阅读和理解,节省了很多时间。
·起止框用圆角矩形表示,表示一个算法的开始和结束。
·输入输出框用平行四边形表示,表示一个算法的输入和输出信息。
·处理框用矩形表示,用于赋值和计算。
·判断框用菱形表示,判断某一个条件是否成立。
·流程线用箭头表示,表示执行步骤的路径,即流程图的方向。
【例2-2】计算5的阶乘并输出计算结果,将算法用流程图表示为图2-2所示。

图2-1 常用流程图符号

图2-2 计算5的阶乘的流程图
在使用流程图表达算法时,培养良好的作图习惯非常重要。注意简化框和线,使流程图尽可能简洁明了,尤其是流程线的使用,千万要避免使流程图随意地转来转去,既不美观,也不易读懂。
算法的流程图有三种结构:顺序结构、选择结构和循环结构。研究表明,任何算法流程图均可用这三种结构实现。
1.顺序结构
按照框图的先后顺序依次执行相应的指令。这是一种最简单的结构。如图2-3所示,先执行A框内的指令,然后执行B框内的指令。
2.选择结构
选择结构又称为分支结构,根据是否满足给定的条件而执行不同的指令。如图2-4所示,在选择结构中,先判断条件P是否成立,如果条件成立,执行指令A,如果条件不成立,则执行指令B。

图2-3 顺序结构

图2-4 选择结构
选择结构的A或B部分可以为空。在图2-5的左图中,若条件P成立,执行指令A,若不成立,绕过指令A执行后面的指令,右图同理。

图2-5 某一部分为空的选择结构
3.循环结构
循环结构也称为重复结构,即在一定条件下,重复执行某一部分的指令。循环结构可以分为直到型结构和当型结构。
(1)直到型结构
直到型结构是先执行某一部分操作,再进行判断。当条件P不成立时,继续循环,执行循环体中的指令;当条件P成立时,结束循环,执行循环后面的指令,如图2-6所示。
(2)当型结构
当型结构是先判断条件是否成立,再执行相应指令。当条件P成立时,执行循环体;当条件P不成立时,结束循环,执行循环结构后面的指令,如图2-7所示。
直到型结构的特点是先执行,再判断,循环体至少执行一次;当型结构的特点是先判断,再执行,可以不执行循环体中的指令。

图2-6 直到型结构

图2-7 当型结构
2.2.3 用N-S图表示算法
N-S图又称为盒图,由传统的流程图改进而来,是编程过程中经常使用的一种分析方法。N-S图具有流程图的优点,可以清晰明确地表示算法的执行过程。一般来说,N-S图的控制结构有4种:顺序结构、条件结构、循环结构和选择结构。
1.顺序结构
如图2-8所示,N-S图的顺序结构与流程图的顺序结构类似,依次执行指令即可。
2.条件结构
如图2-9所示,条件结构先判断条件语句是否成立,若条件成立,执行THEN后的指令,若条件不成立,执行ELSE后的指令。
3.循环结构
和流程图中的循环结构相同,N-S图也有两种循环结构。图2-10的左图与流程图的当型结构相似,先判断循环条件,条件成立时执行DO-WHILE中的指令;右图与流程图的直到型结构相似,先执行REPEAT-UNTIL中的指令,再判断循环条件,条件成立时跳出循环体。

图2-8 顺序结构

图2-9 条件结构

图2-10 循环结构
4.选择结构
如图2-11所示,选择结构根据指定参数的值,执行不同的指令。
使用这4种结构完全可以将一个算法清晰、完整地表示出来。在N-S图中,每个步骤都是用盒子表示的,可以多层嵌套,但是只能从上面进入,从下面输出,这就避免了流程图中的流程线带来的复杂性,使结构更加简单明了。N-S图中的盒子有两种:数据盒和模块盒(过程盒)。在画N-S图时,一般数据盒在上,模块盒在下,中间用一条线连接,如图2-12所示。
N-S图有很多优点:比较贴近程序思想,图形简单,形象直观,条件部分、循环部分、选择部分一目了然,容易理解,也容易设计;嵌套关系十分明显,可以很容易地看出模块的层次结构;不能随意转移,只能按顺序执行,提高了程序的质量。但是N-S图修改比较麻烦,应用不是很广泛。表2-3列出了两种图的结构对比和特点。

图2-11 选择结构

图2-12 数据盒和过程盒
表2-3 流程图和N-S图结构对比

2.2.4 用伪代码表示算法
伪代码类似于自然语言,介于自然语言和编程语言之间。使用伪代码表示算法可以有效地梳理逻辑,从而更快地用编程语言实现该算法。伪代码比较简单、结构清晰,而且具有良好的可读性。使用伪代码表示算法比流程图和N-S图更加方便,比自然语言更简洁准确,比程序更易理解,所以,伪代码的应用十分广泛。
为了提高伪代码的可读性,必须按照规定的语法规则书写伪代码,不能随意书写。
【例2-3】输入一个20以内的正整数z,计算z的阶乘并打印出来,用伪代码表示为算法2-1。
算法2-1 计算z的阶乘

在算法2-1中,do-while结构是流程图循环结构中的当型结构。
2.2.5 用计算机语言表示算法
用计算机语言表示算法即编程,将算法表示成计算机可执行的语言,并让计算机执行,输出其执行结果就是算法的结果。
【例2-4】将计算8的阶乘用计算机语言表示,如代码清单2-1所示。
代码清单2-1 计算8的阶乘

运行结果:

可能现在看这类代码还有一些困难,到后面会越来越熟练,要学好一门编程语言,动手练习是必不可少的。在自己动手练习的过程中,会遇到一些问题,解决这些问题能够加深记忆、更好地理解算法,也能真正地学会编程语言。由表2-4可以看出各种算法表示方法的优缺点。
表2-4 算法的表示方法总结
