当前位置:课程学习>>第五章>>知识讲解>>文本学习>>知识点四

第五章  详细设计



知识点四:面向数据结构的设计方法


计算机软件本质上是信息处理系统,因此,可以根据软件所处理的信息的特征来设计软件。第4章曾经介绍了面向数据流的设计方法,也就是根据数据流确定软件结构的方法,本节介绍面向数据结构的设计方法,也就是根据数据结构设计程序处理过程的方法。   

在许多应用领域中信息都有清楚的层次结构,输入数据、内部存储的信息(数据库或文件)以及输出数据都可能有独特的结构。数据结构既影响程序的结构又影响程序的处理过程,重复出现的数据通常由具有循环控制结构的程序来处理。选择数据(即,可能出现也可能不出现的信息)要用带有分支控制结构的程序来处理。层次的数据组织通常和使用这些数据的程序的层次结构十分相似。

面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。这种设计方法并不明显地使用软件结构的概念,模块是设计过程的副产品,对于模块独立原理也没有给予应有的重视。因此,这种方法最适合于在详细设计阶段使用,也就是说,在完成了软件结构设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。

Jackson方法和Warnier方法是最著名的两个面向数据结构的设计方法,本节结合一个简单例子扼要地介绍方法,目的是使读者对面向数据结构的设计方法有初步了解。

使用面向数据结构的设计方法,当然首先需要分析确定数据结构,并且用适当的工具清晰地描绘数据结构。本节先介绍Jackson方法的工具——Jackson图,然后介绍Jackson程序设计方法的基本步骤。

一、Jackson图

虽然程序中实际使用的数据结构种类繁多,但是它们的数据元素彼此间的逻辑关系却只有顺序、选择和重复3类,因此,逻辑数据结构也只有这3类。   

1.顺序结构

顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。

2.选择结构

选择结构的数据包含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。

3.重复结构

重复结构的数据,根据使用时的条件由一个数据元素出现零次或多次构成。

Jackson图有下述优点。

便于表示层次结构,而且是对结构进行自顶向下分解的有力工具。

形象直观可读性好。

既能表示数据结构也能表示程序结构(因为结构程序设计也只使用上述3种基本控制结构)。

二、改进的Jackson图

上一小节介绍的Jackson图的缺点是,用这种图形工具表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来,影响了图的表现能力,也不易直接把图翻译成程序,此外,框间连线为斜线,不易在行式打印机上输出。为了解决上述问题,本书建议使用图5.7中给出的改进的Jackson图。

虽然Jackson图和描绘软件结构的层次图形式相当类似,但是含义却很不同,即,层次图中的一个方框通常代表一个模块;而Jackson图即使在描绘程序结构时,一个方框也并不代表一个模块,通常一个方框只代表几个语句。层次图表现的是调用关系,通常一个模块除了调用下级模块外,还完成其他操作;而Jackson图表现的是组成关系,也就是说,一个方框中包括的操作仅仅由它下层框中的那些操作组成。

图5.7 改进的Jackson图

三、Jackson程序设计方法

 Jackson结构程序设计方法基本上由下述5个步骤组成。   

(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。

(2)找出输入数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元,重复的次序和次数必须都相同才可能有对应关系)。

(3)用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图。

第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应)。

第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。

第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。

总之,描绘程序结构的Jackson图应该综合输入数据结构和输出数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。

(4)列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。

(5)用伪码表示程序

Jackson方法中使用的伪码和图是完全对应的,下面是和3种基本结构对应的伪码。 顺序结构对应的伪码,其中seq和end是关键字:

A seq

B

C

D

A end

选择结构对应的伪码,其中select、or和end是关键字,cond1、cond2和cond3分别是执行B、C或D的条件:

A select cond1

B

A or cond2

C

A or cond3

D

A end

重复结构对应的伪码,其中iter、while和end是关键字(重复结构有until和while两种形式),cond是条件:

A iter until(或while)cond

B

A end

下面结合一个具体例子进一步说明Jackson结构程序设计方法。

[例] 一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。

对于这个简单例子而言,输入和输出数据的结构很容易确定。图5.8是用Jackson图描绘的输入输出数据结构。

图5.8 表示输入输出数据结构的Jackson图

(a)输入数据结构; (b)输出数据结构

确定了输入输出数据结构之后,第二步是分析确定在输入数据结构和输出数据结构中有对应关系的数据单元。在这个例子中哪些数据单元有对应关系呢?输出数据总是通过对输入数据的处理而得到的,因此在输入输出数据结构最高层次的两个单元(在这个例子中是“正文文件”和“输出表格”)总是有对应关系的。这一对单元将和程序结构图中最顶层的方框(代表程序)相对应,也就是说经过程序的处理由正文文件得到输出表格。下面还有哪些有对应关系的单元呢?因为每处理输入数据中一个“字符串”之后,就可以得到输出数据中一个“串信息”,它们都是重复出现的数据单元,而且出现次序和重复次数都完全相同,因此,“字符串”和“串信息”也是一对有对应关系的单元。

  

还有其他有对应关系的单元吗?为了回答这个问题,依次考察输入数据结构中余下的每个数据单元。“字符”不可能和多个字符组成的“字符串”对应,和输出数据结构中其他数据单元也不能对应。“空格”能和“空格数”对应吗?显然,单个空格并不能决定一个记录中包含的空格个数,因此没有对应关系。通过类似的考察发现,输入数据结构中余下的任何一个单元在输出数据结构中都找不到对应的单元,也就是说,在这个例子中输入输出数据结构中只有上述两对有对应关系的单元。在图5.9中用一对虚线箭头把有对应关系的数据单元连接起来,以突出表明这种对应关系。

图5.9 描绘统计空格程序结构的Jackson图

Jackson程序设计方法的第三步是从数据结构图导出程序结构图。按照前面已经讲述过的规则,这个步骤的大致过程如下:   

首先,在描绘程序结构的图的最顶层画一个处理框“统计空格”,它与“正文文件”和“输出表格”这对最顶层的数据单元相对应。但是接下来还不能立即画与另一对数据单元(“字符串”和“串信息”)相对应的处理框,因为在输出数据结构中“串信息”的上层还有“表格体”和“空格总数”两个数据单元,在程序结构图的第二层应该有与这两个单元对应的处理框——“程序体”和“印总数”。因此,在程序结构图的第三层才是与“字符串”和“串信息”相对应的处理框——“处理字符串”。在程序结构图的第四层似乎应该是和“字符串”、“字符”及“空格数”等数据单元对应的处理框“印字符串”、“分析字符”及“印空格数”,这3个处理是顺序执行的。但是,“字符”是重复出现的数据单元,因此“分析字符”也应该是重复执行的处理。改进的Jackson图规定顺序执行的处理中不允许混有重复执行或选择执行的处理,所以在“分析字符”这个处理框上面又增加了一个处理框“分析字符串”。最后得到的程序结构图为图5.13。

Jackson程序设计方法的第四步是列出所有操作和条件,并且把它们分配到程序结构土的适当位置。首先,列出统计空格个数需要的全部操作和条件如下:

(1)停止      (2)打开文件

(3)关闭文件            (4)打印字符串

(5)打出空格数目          (6)印出空格总数

(7)sum:=sum+1           (8)totalsum:=totalsum+sum

(9)读入字符串           (10)sum:=0

(11)totalsum:=0          (12)pointer1:=1

(13)pointer:=pointer+1       I(1)文件结束

I(2) 字符串结束           S(3) 字符是空格

在上面的操作表中,sum是保存空格个数的变量,totalsum是保存空格总数的变量,而pointer是用来指示当前分析的字符在字符串中的位置的变量。

经过简单分析不难把这些操作和条件分配到程序结构图的适当位置,结束为图5.10。

图5.10 把操作和条件分配到程序结构图的适当位置

 Jackson方法的最后一步是用伪码表示程序处理过程。因为Jackson使用的伪码和Jackson图之间存在简单的对应关系,所以从图5.10很容易得出下面的伪码:   

统计空格 seq

     打开文件

     读入字符串

     Totalsum:=0

     程序体 iter until 文件结束

        处理字符串 seq

        印字符串 seq

          印出字符串

        印字符串 end

        sum:=0

        pointer:=1

        分析字符串iter until字符串结束

        分析字符select字符是空格

        处理空格 seq

         sum:=sum+1

         pointer:=pointer+1

        处理空格 end

        分析字符 or 字符不是空格

        处理非空格 seq

         Pointer:=pointer+1

        处理空格end

        分析字符end

        分析字符串 end

        印空格数 seq

        印出空格数目

        印空格数 end

        totalsum:=totalsum+sum

        读入字符串

        处理字符串 end

     程序体end

     印总数 seq

        印出空格总数

     印总数 end

     关闭文件

     停止

统计空格 end

以上简单介绍了由美国人M.Jackson提出的结构程序设计方法。这个方法在设计比较简单的数据处理系统时特别方便,当设计比较复杂的程序时常常遇到输入数据可能有错、条件不能预先测试、数据结构冲突等问题。为了克服上述困难,把Jackson方法应用到更广阔的领域,需要采用一系列比较复杂的辅助技术,详细介绍这些技术已经超出本书的范围。

请同学们继续学习