描述程序处理过程的工具称为过程设计的工具,它们可以分为图形、表格和语言3类。不论哪类工具,对它们的基本要求都是能提供对设计的无歧义的描述,也就是应该能指明控制流程、处理功能、数据组织以及其他方面的实现细节,从而在编码阶段能把对设计的描述直接翻译成程序代码。
程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法,然而它也是用得最混乱的一种方法。
在5.1节中已经用程序流程图描绘了一些常用的控制结构,相信读者对程序流程图中使用的基本符号已经有了一些了解。图5.3中列出了程序流程图中使用的各种符号。
从20世纪40年代末到70年代中期,程序流程图一直视软件设计的主要工具。它的主要优点是对控制流程的描绘很直观,便于初学者掌握。由于程序流程图历史悠久,为最广泛的人所熟悉,尽管它有种种缺点,许多人建议停止使用它,但至今仍在广泛使用着。不过总的趋势是越来越多的人不再使用程序流程图了。
程序流程图的主要特点如下。
程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。
程序流程图不易表示数据结构。
图5.3 程序流程图中使用的符号
(a)选择(分支);(b)注释;(c)预先定义的处理;(d)多分支(e)开始或停止
(f)准备;(g)循环上界限;(h)循环下界限;(i)虚线;(j)省略号;
(k)并行方式;(l)处理;(m)输入输出;(n)链接;(o)换页链接;(p)控制流
处于要有一种不允许违背结构程序设计精神的图形工具的考虑,Nassi和Shneiderman提出了盒图,又称为N-S图。它由下述特点。
功能域(即,一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。
不可能任意转移控制。
很容易确定局部和全程数据的作用域。
很容易表现嵌套关系,也可以表示模块的层次结构。
图5.4给出了结构化控制结构的盒图表示,也给出了调用子过程的盒图表示方法。
盒图没有箭头,因此不允许随意转移控制。坚持使用盒图作为详细设计的工具,可以使程序员逐步养成用结构化的方式思考问题和解决问题的习惯。
图5.4 盒图的基本符号
(a)顺序;(b)IF_THEN_ELSE型分支;(c)CASE型多分支;
(d)循环;(e)调用子程序A
PAD是问题分析图(problem analysis diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广。它用二维数结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。图5.5给出PAD图的基本符号。
图5.5 PAD图的基本符号
(a)顺序(先执行P1后执行P2);(b)选择(IF C THEN P1 ELSE P2)a;
(c)CASE型多分支;(d)WHILE型循环(WHILE C DO P);
(e)UNTIL型循环(REPEAT P UNTIL C);(f)语句标号;(g)定义
PAD图的主要优点如下:
使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序。
PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数。
用PAD图表现程序逻辑,易读、易懂、易记。PAD图是二维树形结构的图形,程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点。
容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。
即可用于表示程序逻辑,也可用于描绘数据结构。
PAD图的符号支持自顶向下、逐步求精方法的使用。开始时设计者可以定义一个抽象的过程,随着设计工作的深入而使用def符号逐步增加细节,直至完成详细设计,如图5.6所示。
图5.6 使用PAD图提供的定义功能来逐步求精的例子
(a)初期的PAD图;(b)使用def符号细化处理框P2;
PAD图示面向高级程序设计语言的,为FORTRAN,COBOL和PASCAL等每种常用的高级程序设计语言都提供了一整套相应的图形符号。由于每种控制语句都有一个图形符号与之对应,显然将PAD图转换成与之对应的高级语言程序比较容易。
当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图或后面即将介绍的过程设计语言(PDL)都不易清楚地描述。然而判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。
一张判定表由4部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。判定表右半部的每一类实质上是一条规则,规定了与特定的条件组合相对应的动作。
从上面这个例子可以看出,判定表能够简洁而又无歧义地描述处理规则。当把判定表和布尔代数或卡诺图结合起来使用时,可以对判定表进行校验或化简。但是,判定表并不适于作为一种通用的设计工具,没有一种简单的方法使它能同时清晰地表示顺序和重复等处理特性。
判定表虽然能清晰地表示复杂的条件组合与应做的动作之间的对应关系,但其含义却不是一眼就能看出来的,初次接触这种工具的人理解它需要有一个简短的学习过程。此外,当数据元素的值多余两个时(例如,5.3.4例如中假设对机票需细分为头等舱、二等舱和经济舱等多种级别时),判定表的简洁程度也将下降。
判定树是判定表的变种,它也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。判定树的优点在于,它的形式简单到不需任何说明,一眼就可以看出其含义,因此易于掌握和使用。多年来判定树一直受到人们的重视,是一种比较常用的系统分析和设计的工具。
过程设计语言(PDL)也称为伪码,这是一个笼统的名称,现在有许多种不同的过程设计语言在使用。它是用正文形式表示数据和处理过程的设计工具。
PDL具有严格的关键字外部语法,用于定义控制结构和数据结构;另外,PDL表示实际操作和条件的内部语法通常又是灵活自由的,可以适应各种工程项目的需要。因此,一般来说,PDL是一种“混杂”语言。它使用一种语言(通常是某种自然语言)的词汇,同时却使用另一种语言(某种结构化的程序设计语言)的语法。
PDL应该具有下述特点。
(1)关键字的固定语法,它提供了结构化控制结构、数据说明和模块化的特点。为了使结构清晰和可读性好,通常在所有可能嵌套使用的控制结构的头和尾都有关键字,例如,if…fi(或endif)等等。
(2)自然语言的自由语法,它描述处理特点。
(3)数据说明的手段。应该既包括简单的数据结构(例如纯量和数组),又包括复杂的数据结构(例如,链表或层次的数据结构)。
(4)模块定义和调用的技术,应该提供各种接口描述模式。
PDL作为一种设计工具有如下一些优点。
(1)可以作为注释直接插在源程序中间。这样做能促使维护人员在修改程序代码的同时也相应地修改PDL注释,因此有助于保持文档和程序的一致性,提高了文档的质量。
(2)可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。
(3)己经有自动处理PDL的程序存在,而且可以自动由PDL生成程序代码。
PDL的缺点是不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单。