第6章 详细设计
一、详细设计概述
1.目标
(1)详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统,即经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
(2)详细设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。
2.工作任务
详细设计阶段的任务是要设计出程序的“蓝图”,以后程序员将根据这个“蓝图”写出实际的程序代码。
3.关键技术
详细设计的结果基本上决定了最终的程序代码的质量。结构程序设计技术是实现详细设计目标的关键技术,也是详细设计的逻辑基础。
二、结构程序设计
1.控制结构
(1)基本控制结构
三种基本的控制结构是“顺序”、“选择”和“循环”,它们的流程图分别为图6-1(a),6-1(b)和6-1(c)。实际上使用顺序结构和循环结构完全可以实现选择结构,因此,理论上最基本的控制结构只有两种。
图6-1 三种基本的控制结构
(2)扩展的控制结构
DO UNTIL和DO CASE
DO UNTIL和DO CASE的流程图分别是图6-2(a)和图6-2(b)。
图6-2 其他常用的控制结构
(3)修正的控制结构
LEAVE和BREAK
LEAVE或BREAK结构是受限制的前向GO TO语句,用于转移到循环结构后面的语句。当需要立即从循环(甚至是嵌套的循环)中转移出来时,使用LEAVE或BREAK结构,不仅方便而且会使效率提高很多。
(4)分类
①经典的结构程序设计
只允许使用顺序、IF THEN ELSE型分支和DO WHILE型循环这三种基本控制结构。
②扩展的结构程序设计
除了基本控制结构之外,还允许使用DO CASE型多分支结构和DO UNTIL型循环结构。
③修正的结构程序设计
除了扩展的结构程序设计之外,再允许使用LEAVE(或BREAK)结构。
2.定义
(1)经典定义
如果一个程序的代码块仅仅通过顺序、选择和循环这三种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
(2)改进的定义
结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句。
三、人机界面设计
1.重要性
(1)人机界面设计是接口设计的一个重要的组成部分。对于交互式系统来说,人机界面设计和数据设计、体系结构设计及过程设计一样重要。
(2)人机界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命。
2.设计问题
在设计人机界面的过程中,几乎总会遇到下述4个问题:系统响应时间、用户帮助设施、出错信息处理和命令交互。
(1)系统响应时间
①定义
系统响应时间指从用户完成某个控制动作,到软件给出预期的响应之间的这段时间。是许多交互式系统用户经常抱怨的问题。
②属性
系统响应时间有两个重要属性,分别是长度和易变性。
a.长度:如果系统响应时间过长,用户就会感到紧张和沮丧。但是,当用户工作速度是由人机界面决定的时候,系统响应时间过短也不好,这会迫使用户加快操作节奏,从而可能会犯错误。
b.易变性:指系统响应时间相对于平均响应时间的偏差,在许多情况下,这是系统响应时间的更重要的属性。即使系统响应时间较长,响应时间易变性低也有助于用户建立起稳定的工作节奏。
(2)用户帮助设施
①意义
交互式系统的每个用户几乎都需要帮助,当遇到复杂问题时需要查看用户手册以寻找答案。通过使用用户帮助设施,使得用户无须离开用户界面就能解决自己的问题。
②分类
常见的帮助设施可分为集成的和附加的两类,普遍认为,集成的帮助设施优于附加的帮助设施。
a.集成的
集成的帮助设施从一开始就设计在软件里面,通常,它对用户工作内容是敏感的,因此用户可以从与刚刚完成的操作有关的主题中选择一个请求帮助。显然,这可以缩短用户获得帮助的时间,增加界面的友好性。集成的帮助设施优于附加的帮助设施
b.附加的
附加的帮助设施是在系统建成后再添加到软件中的,在多数情况下它实际上是一种查询能力有限的联机用户手册。
③设计时需解决的问题
具体设计帮助设施时,必须解决下述的一系列问题:
a.在用户与系统交互期间,是否在任何时候都能获得关于系统任何功能的帮助信息?有两种选择:提供部分功能的帮助信息和提供全部功能的帮助信息。
b.用户怎样请求帮助?有3种选择:帮助菜单,特殊功能键和HELP命令。
c.怎样显示帮助信息?有3种选择:在独立的窗口中,指出参考某个文档(不理想)和在屏幕固定位置显示简短提示。
d.用户怎样返回到正常的交互方式中?有两种选择:屏幕上的返回按钮和功能键。
e.怎样组织帮助信息?有3种选择:平面结构(所有信息都通过关键字访问),信息的层次结构(用户可在该结构中查到更详细的信息)和超文本结构。
(3)出错信息处理
①定义
出错信息和警告信息,是出现问题时交互式系统给出的“坏消息”。出错信息设计得不好,将向用户提供无用的甚至误导的信息,反而会加重用户的挫折感。
②属性
交互式系统给出的出错信息或警告信息,应该具有下述属性:
a.信息应该用用户可以理解的术语描述问题。
b.信息应该提供有助于从错误中恢复的建设性意见。
c.信息应该指出错误可能导致哪些负面后果,以便用户检查是否出现了这些问题,并在确实出现问题时及时解决。
d.信息应该伴随着听觉上或视觉上的提示。
e.信息不能带有指责色彩,也就是说,不能责怪用户。
注意:当确实出现了问题的时候,有效的出错信息能提高交互式系统的质量,减轻用户的挫折感。
(4)命令交互
命令行曾经是用户和系统软件交互的最常用的方式,并且也曾经广泛地用于各种应用软件中。
①设计时需解决的问题
在提供命令交互时,需要考虑的问题如下:
a.是否每个菜单选项都有对应的命令?
b.采用何种命令形式?有3种选择:控制序列(例如,Ctrl+P),功能键和输入命令。
c.学习和记忆命令的难度有多大?忘记了命令怎么办?
d.用户是否可以定制或缩写命令?
②命令宏机制
利用命令宏机制,用户可以用自己定义的名字代表一个常用的命令序列。需要使用这个命令序列时,用户无须依次输入每个命令,只需输入命令宏的名字就可以顺序执行它所代表的全部命令。
3.设计过程
用户界面设计是一个迭代的过程,也就是说,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户意见进行修改。
(1)设计流程
①创建第一级原型;
②用户试用并评估该原型,直接向设计者表述对界面的评价;
③设计者根据用户意见修改设计并实现下一级原型;
④持续进行上述过程,直到用户感到满意,不需要再修改界面设计时为止。
(2)评估标准
①系统及其界面的规格说明书的长度和复杂程度,预示了用户学习使用该系统所需要的工作量。
②命令或动作的数量、命令的平均参数个数或动作中单个操作的个数,预示了系统的交互时间和总体效率。
③设计模型中包含的动作、命令和系统状态的数量,预示了用户学习使用该系统时需要记忆的内容的多少。
④界面风格、帮助设施和出错处理协议,预示了界面的复杂程度及用户接受该界面的程度。
4.人机界面设计指南
用户界面设计主要依靠设计者的经验,总结众多设计者的经验得出的设计指南,有助于设计者设计出友好、高效的人机界面。人机设计指南主要包括一般交互指南、信息显示指南、数据输入指南。
(1)一般交互指南(全局性的)
一般交互指南涉及信息显示、数据输入和系统整体控制,因此,这类指南是全局性的,忽略它们将承担较大风险。一般的交互指南如下:
①保持一致性
应该为人机界面中的菜单选择、命令输入、数据显示以及众多的其他功能,使用一致的格式。
②提供有意义的反馈
应向用户提供视觉的和听觉的反馈,以保证在用户和系统之间建立双向通信。
③在执行有较大破坏性的动作之前要求用户确认
如果用户要删除一个文件,或覆盖一些重要信息,或终止一个程序的运行,应该给出“您是否确实要……”的信息,以请求用户确认他的命令。
④允许取消绝大多数操作
UNDO或REVERSE功能曾经使众多终端用户避免了大量时间浪费。每个交互式系统都应该能方便地取消已完成的操作。
⑤减少在两次操作之间必须记忆的信息量
不应该期望用户能记住在下一步操作中需使用的一大串数字或标识符。应该尽量减少记忆量。
⑥提高对话、移动和思考的效率
应该尽量减少用户按键的次数,设计屏幕布局时应该考虑尽量减少鼠标移动的距离,应该尽量避免出现用户问“这是什么意思”的情况。
⑦允许犯错误
系统应该能保护自己不受严重错误的破坏。
⑧按功能对动作分类,并据此设计屏幕布局
下拉菜单的一个主要优点就是能按动作类型组织命令。实际上,设计者应该尽力提高命令和动作组织的“内聚性”。
⑨提供对用户工作内容敏感的帮助设施
⑩用简单动词或动词短语作为命令名
过长的命令名难于识别和记忆,也会占用过多的菜单空间。
(2)信息显示指南
如果人机界面显示的信息是不完整的、含糊的或难于理解的。则该应用系统显然不能满足用户的需求。可以用多种不同方式“显示”信息:用文字、图形和声音;按位置、移动和大小;使用颜色、分辨率和省略。信息显示的设计指南如下:
①只显示与当前工作内容有关的信息。
②不要用数据淹没用户,应该用便于用户迅速吸取信息的方式来表示数据。
③使用一致的标记、标准的缩写和可预知的颜色。
④允许用户保持可视化的语境。
⑤产生有意义的出错信息。
⑥使用大小写、缩进和文本分组以帮助理解。
⑦使用窗口分隔不同类型的信息。
⑧使用“模拟”显示方式表示信息,以使信息更容易被用户提取。
⑨高效率地使用显示屏。
(3)数据输入指南
用户的大部分时间用在选择命令、输入数据和向系统提供输入。在许多应用系统中,键盘仍然是主要的输入介质,但是,鼠标、数字化仪和语音识别系统正迅速地成为重要的输入手段。数据输入指南如下:
①尽量减少用户的输入动作。
②保持信息显示和数据输入之间的一致性。
③允许用户自定义输入。
④交互应该是灵活的,并且可调整成用户最喜欢的输入方式。
⑤使在当前动作语境中不适用的命令不起作用。
⑥让用户控制交互流。
⑦对所有输入动作都提供帮助。
⑧消除冗余的输入。
四、过程设计的工具
1.定义
描述程序处理过程的工具称为过程设计的工具,它们可以分为图形、表格和语言3类。基本要求是能提供对设计的无歧义的描述,即应该能指明控制流程、处理功能、数据组织以及其他方面的实现细节,从而在编码阶段能把对设计的描述直接翻译成程序代码。
2.分类
(1)程序流程图
①符号表示
程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法,然而它也是用得最混乱的一种方法。程序流程图中使用的符号表示如图6-3所示。
图6-3 程序流程图中使用的符号
各个符号代表的含义如下:
(a)选择(分支);
(b)注释;
(c)预先定义的处理;
(d)多分支;
(e)开始或停止;
(f)准备;
(g)循环上界限;
(h)循环下界限;
(i)虚线;
(j)省略符;
(k)并行方式;
(1)处理;
(m)输入输出;
(n)连接;
(o)换页连接;
(p)控制流。
②优点
对控制流程的描绘很直观,便于初学者掌握。
③缺点
a.程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
b.程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。
c.程序流程图不易表示数据结构。
(2)盒图(N-S图)
①特点
出于要有一种不允许违背结构程序设计精神的图形工具的考虑,Nassi和Shneiderman提出了盒图,又称为N-S图。它有下述特点:
a.功能域明确,可以从盒图上一眼就看出来;
b.不可能任意转移控制;
c.很容易确定局部和全程数据的作用域;
d.很容易表现嵌套关系,也可以表示模块的层次结构。
②表示
图6-4给出了结构化控制结构的盒图表示,也给出了调用子程序的盒图表示方法。
图6-4 盒图的基本符号
其中各个图形代表的人结构如下:
(a)顺序结构;
(b)IF_THEN_ELSE型分支;
(c)CASE型多分支;
(d)循环结构;
(e)调用子程序A。
③优点
盒图没有箭头,因此不允许随意转移控制。坚持使用盒图作为详细设计的工具,可以使程序员逐步养成用结构化的方式思考问题和解决问题的习惯。
(3)PAD图
①符号表示
PAD是问题分析图(problem analysis diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广。它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。图6-5给出PAD图的基本符号。
图6-5 PAD图的基本符号
各个符号代表的含义如下:
(a)顺序(先执行Pl后执行P2);
(b)选择(IF C THEN Pl ELSE P2);
(c)CASE型多分支;
(d)WHILE型循环(WHILE C DO P);
(e)UNTIL型循环(REPEAT P UNTIL C);
(f)语句标号;
(g)定义。
②优点
a.使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序。
b.PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数。
c.用PAD图表现程序逻辑,易读、易懂、易记。PAD图是二维树形结构的图形,程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点。
d.容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。
e.即可用于表示程序逻辑,也可用于描绘数据结构。
f.PAD图的符号支持自顶向下、逐步求精方法的使用。开始时设计者可以定义一个抽象的程序,随着设计工作的深入而使用def符号逐步增加细节,直至完成详细设计(如图6-6所示,图6-6(a)表示初始的PAD图;6-6(b)表示使用def符号细化处理框P2)。
图6-6 使用PAD图提供的定义功能来逐步求精的例子
(4)判定表
①适用性
算法中包含多重嵌套的条件选择时,判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。
②组成
一张判定表由四部分组成:
a.左上部列出所有条件;
b.左下部是所有可能做的动作;
c.右上部是表示各种条件组合的一个矩阵;
d.右下部是和每种条件组合相对应的动作。
注意:判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。
③实例分析
假设某航空公司规定,乘客可以免费托运重量不超过30kg的行李。当行李重量超过30kg时,对头等舱的国内乘客超重部分每公斤收费4元,对其他舱的国内乘客超重部分每公斤收费6元,对外国乘客超重部分每公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。
表6-1 用判定表表示计算行李费的算法
【解析】如表6-1所示。在表的右上部分中T表示它左边那个条件成立,F表示条件不成立,空白表示这个条件成立与否并不影响对动作的选择。判定表右下部分中画×表示做它左边的那项动作,空白表示不做这项动作。只要行李重量不超过30kg,不论这位乘客持有何种机票,是中国人还是外国人,是残疾人还是正常人,一律免收行李费,这就是表右部第一列(规则l)表示的内容。当行李重量超过30kg时,根据乘客机票的等级、乘客国籍及是否残疾人而使用不同算法计算行李费,这就是从规则2到规则9所表示的内容。
④优点
a.判定表能够简洁而又无歧义地描述处理规则。
b.判定表和布尔代数或卡诺图结合起来使用,可以更加直观、简洁、清晰的描述规则。
⑤缺点
a.不能同时清晰地表示出问题的顺序性和重复性。
b.初次接触这种工具的人理解它需要有一个学习过程。
c.数据元素增多时,判定表的简洁程度大幅下降。
(5)判定树
判定树是判定表的变种,是一种比较常用的系统分析和设计的工具,它的优缺点如下:
①优点
a.判定树能清晰地表示复杂的条件组合与应做的动作之间的对应关系。
b.判定树的形式简单到不需任何说明,一眼就能看出其含义,易于掌握和使用。
②缺点
a.简洁性差
如图6-7所示,数据元素的同一个值往往要重复写多遍,越接近树的叶端重复次数越多。
b.画判定树时分枝的次序可能对最终画出的判定树的简洁程度有较大影响。
如图6-7所示,如果不是把行李重量做为第一个分枝,而是将它作为最后一个分枝,则画出的判定树将有16片树叶而不是只有9片树叶。
图6-7 用判定树表示计算行李费的算法
(6)过程设计语言
①定义
过程设计语言(PDL),即伪码,它是用正文形式表示数据和处理过程的设计工具。PDL具有严格的关键字外部语法,用于定义控制结构和数据结构。PDL表示实际操作和条件的内部语法通常又是灵活自由的,可以适应各种工程项目的需要。
②特点
a.关键字的固定语法,它提供了结构化控制结构、数据说明和模块化的特点。
b.自然语言的自由语法,它描述处理特点。
c.数据说明的手段。应该既包括简单的数据结构,又包括复杂的数据结构表或层次的。
d.模块定义和调用的技术,应该提供各种接口描述模式。
③优点
a.可作为注释直接插在源程序中。有助于保持文档和程序的一致性,提高文档的质量。
b.可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。
c.已经有自动处理PDL的程序存在,且可以自动由PDL生成程序代码。
④缺点
不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,较复杂,不如判定表清晰简单。
五、面向数据结构的设计方法
1.相关概念
(1)目的
面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。
(2)适用性
面向数据结构的设计方法最适合于在详细设计阶段使用,即在完成了软件结构设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。
2.Jackson图
(1)分类
Jackson方法和Warnier方法是最著名的两个面向数据结构的设计方法,Jackson图根据程序中数据元素彼此间的逻辑关系可分为顺序结构、选择结构和重复结构3类,具体如下:
①顺序结构
顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。图6-8是表示顺序结构的Jackson图的一个例子。
图6-8 A由B、C、D3个元素顺序组成
注意:图中每个元素只出现一次,出现的次序依次是B、C和D。
②选择结构
选择结构的数据包含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。图6-9是表示3个中选1个结构的Jackson图。
图6-9 根据条件A是B或C或D中的某一个
注意:在B、C和D的右上角有小圆圈做标记。
③重复结构
重复结构的数据,根据使用时的条件由一个数据元素出现零次或多次构成。图6-10是表示重复结构的Jackson图。
图6-10 A由B出现N次(N≥O)组成
注意:在B的右上角有星号标记。
(2)优点
Jackson图有下述优点:
①便于表示层次结构,而且是对结构进行自顶向下分解的有力工具。
②形象直观可读性好。
③既能表示数据结构也能表示程序结构。
(3)缺点
①用这种图形工具表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来,影响了图的表达能力,也不易直接把图翻译成程序。
②框间连线为斜线,不易在行式打印机上输出。
3.改进的Jackson图
(1)表示
图6-11中给出了改进的Jackson图。
图6-11 改进的Jackson图
①顺序结构
如图6-11(a)所示,B、C、D中任一个都不能是选择出现或重复出现的数据元素。
②选择结构
如图6-11(b)所示,S右面括号中的数字i是分支条件的编号。
③可选结构
如图6-11(c)所示,A或者是元素B或者不出现。
④重复结构
如图6-11(d)所示,循环结束条件的编号为i。
(2)与层次图的比较
①层次图中的一个方框代表一个模块;而Jackson图即使在描绘程序结构时,一个方框也并不代表一个模块。
②层次图表现的是调用关系,通常一个模块除了调用下级模块外,还完成其他操作;而Jackson图表现的是组成关系。
4.Jackson方法
(1)设计步骤
Jackson结构程序设计方法基本上由下述5个步骤组成:
①分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。
②找出输入数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元。
③用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图。
a.为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框。
b.根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
c.根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
注意:描绘程序结构的Jackson图应该综合输入数据结构和输出数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。
④列出所有操作和条件,并且把它们分配到程序结构图的适当位置。
⑤用伪码表示程序(与Jackson图完全对应)。
(2)伪码
Jackson方法中使用的伪码和Jackson图是完全对应的,顺序、选择、重复结构对应的伪码如下:
①图6-11(a)所示的顺序结构对应的伪码如下,其中seq和end是关键字:
A seq
B
C
D
A end
②图6-11(b)所示的选择结构对应的伪码如下,其中select、or和end是关键字,cond1、cond2和cond3分别是执行B、C或D的条件:
A select cond1
B
A or cond2
C
A or cond3
D
A end
③图6-11(d)所示的重复结构对应的伪码如下,其中iter、until、while和end是关键字,cond是条件:
A iter until(或while)cond
B
A end
(3)实例分析
一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。
图6-12 表示输入输出数据结构的Jackson图
(a)输入数据结构;(b)输出数据结构
【解析】
①确定输入和输出数据的结构,如图6-12所示
②分析确定在输入数据结构和输出数据结构中有对应关系的数据单元
a.输出数据总是通过对输入数据的处理而得到的,因此在输入输出数据结构最高层次的两个单元(在这个例子中是“正文文件”和“输出表格”)总是有对应关系的。这一对单元将和程序结构图中最顶层的方框相对应。
b.每处理输入数据中一个“字符串”之后,就可以得到输出数据中一个“串信息”,它们都是重复出现的数据单元,而且出现次序和重复次数都完全相同,故“字符串”和“串信息”也是一对有对应关系的单元。
c.“字符”不可能和多个字符组成的“字符串”对应,和输出数据结构中其他数据单元也不能对应。单个空格并不能决定一个记录中包含的空格个数,因此没有对应关系。输入数据结构中余下的任何一个单元在输出数据结构中都找不到对应的单元。
d.在图6-12中用一对虚线箭头把有对应关系的数据单元连接起来,以突出表明这种对应关系。
③从数据结构图导出程序结构图
a.“统计空格”是在程序结构图的最顶层与“正文文件”和“输出表格”对应的处理框。
b.“程序体”和“印总数”是在程序结构图的第二层与“表格体”和“空格总数”对应的处理框。
c.“处理字符串”是在程序结构图的第三层与“字符串”和“串信息”对应的处理框。
d.“印字符串”、“分析字符”及“印空格数”在程序结构图的第四层与“字符串”、“字符”及“空格数”对应的处理框。由于“字符”是重复出现的数据单元,因此“分析字符”也应该是重复执行的处理。在“分析字符”这个处理框上面又增加了一个处理框“分析字符串”。
e.最后得到的程序结构图为图6-13所示。
图6-13 描绘统计空格程序结构的Jackson图
④列出所有操作和条件,并且把它们分配到程序结构图的适当位置
图6-14 把操作和条件分配到程序结构图的适当位置
把需要的操作和条件分配到程序结构图的适当位置,结果为图6-14。统计空格个数需要的全部操作和条件如下:
a.停止;
b.打开文件;
c.关闭文件;
d.印出字符串;
e.印出空格数目;
f.印出空格总数;
g.sum:=sum+1;
h.totalsum=totalsum+sum;
i.读入字符串;
g.sum:=0;
k.totalsum:=0;
l.pointer:=l;
m.pointer=pointer+11;
n.文件结束;
o.字符串结束;
p.字符是空格。
⑤用伪码表示程序处理过程
统计空格
打开文件
读入字符串
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
六、程序复杂程度的定量度量
1.价值
(1)把程序的复杂程度乘以适当数可估算出软件中错误的数量以及开发需要的工作量。
(2)定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣。
(3)程序的定量的复杂程度可以作为模块规模的精确限度。
2.McCabe方法
(1)流图
①定义
流图实质上是“退化了的”程序流程图,它仅仅仅描绘程序的控制流程,完全不表现对数据具体操作以及分支或循环的具体条件,流图通常被用来突出表示程序的控制流。
②程序流程图映射成流图
图6-15说明了把程序流程图映射成流图的方法。
图6-15 把程序流程图映射成流图
(a)程序流程图;(b)流图
a.流图中用圆表示结点,一个圆代表一条或多条语句。程序流程图中的一个顺序的处理框序列和一个菱形判定框,可以映射成流图中的一个结点。
b.流图中的箭头线称为边,代表控制流。流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句。
c.由边和结点围成的面积称为区域,计算区域数时应包括图外部未被围起来的区域。
③PDL翻译成流图
a.基本情况
图6-16是用PDL表示的处理过程及与之对应的流图。
图6-16 由PDL翻译成的流图
b.包含复合条件
复合条件,就是在条件中包含了一个或多个布尔运算符。在这种情况下,应把复合条件分解为若干个简单条件,每个简单条件对应流图中一个结点。包含条件的结点称为判定节点,从每个判定结点引出两条或多条边。图6-17是由包含复合条件的PDL片断翻译成的流图。
图6-17 由包含复合条件的PDL映射成的流图
(2)环形复杂度
①定义
McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。
②计算方法
环形复杂度定量度量程序的逻辑复杂度,可以用下述3种方法中的任何一种来计算环形复杂度:
a.流图中线性无关的区域数等于环形复杂度。
b.流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
c.流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
③环形复杂度的用途
程序的环形复杂度取决于程序控制流的复杂程度,即取决于程序结构的复杂程度。当程序内分支数或循环个数增加时,环形复杂度也随之增加,因此它是对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。
④环形复杂度的规模
环形复杂度高的程序往往是最困难、最容易出问题的程序。模块规模以V(G)≤10为宜,即V(G)=10是模块规模的一个科学精确的上限。
3.Halstead方法
(1)定义
Halstead方法是根据程序中运算符和操作数的总数来度量程序的复杂程度。
(2)方法
①程序长度N定义(N1为程序中运算符出现的总次数,N2为操作数出现的总次数):
N=N1+N2
②预测程序长度的公式(使用的不同运算符的个数n1,不同操作数的个数n2):
H=n1 log2 n1+n2 log2 n2
③预测程序中包含错误的个数的公式:
E=N log2(n1+n2)/3000