1、第六章,详细设计,详细设计要提供关于算法的更多的细节,例如:总体设计可以声明一个模块的作用是对一个表进行排序,详细设计则要确定使用哪种排序算法。在详细设计阶段为每个模块增加了足够的细节后,程序员才能够以相当直接的方式进行下一阶段的编码工作。,详细设计以总体设计阶段的工作为基础的,但又不同于总体设计,主要表现为:,详细设计阶段的目的与任务,详细设计的目的: 为软件结构图 (SC) 中的每一个模块确定采用的算法和模块内 数据结构,用某种选定的表达工具给出清 晰的描述,从而在编码阶段可把这个描述直接翻译成用某种程序设计语言书写的程序。,详细设计阶段的主要任务:设计出程序的“蓝图”,以后程序员将根据这
2、个蓝图写出实际的程序代码。因此详细设计的结果基本上决定了最终的程序代码的质量。,详细设计阶段的主要任务,详细设计的的原则(1)模块的逻辑描述正确可靠、清晰易读。(2)采用结构化程序设计方法,改善控制结构,降低程序复杂度,提高程序的可读性、可测试性和可维护性。,6.1 结构化程序设计,结构化程序设计技术是一种设计程序的技术,它采用自顶向下、逐步求精的设计方法和单入口单出口的控制结构,并且只包含顺序、选择和循环三种控制结构。,用顺序和循环结构完全可以实现选择结构,1、顺序型,几个连续的加工依次序排列,2、选择型,由某个判断式的取值决定选择两个加工中的一个。,3、当型循环型DO_WHILE,当循环控
3、制条件成立时,重复执行特定的加工。,4、直到型循环型 DO_UNTIL,重复执行特定的加工,直到循环控制条件成立时。,5、多分支结构 DO_CASE,经典的结构程序设计:顺序,选择,当型循环扩展的结构程序设计:顺序,选择+多分支,当型循环+直到型循环修正的结构程序设计:顺序,选择+多分支,当型循环+直到型循环,break结构,结构程序设计,使用结构程序设计技术的好处:,(1)自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,可显著提高软件开发的成功率和生产率 (2)先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序有清晰的层次结构。(3)使用单入口单出口的控制结构而不使用G
4、OTO语句,使得程序的静态结构和其动态执行情况比较一致(4)控制结构有确定的逻辑模式,编写程序代码只限于使用很少几种直截了当的方式。(5)程序清晰和模块化使得在修改和重新设计一个软件时可以重用的代码量最大。(6)程序的逻辑结构清晰,有利于程序正确性证明。,人机界面设计是接口设计的一个重要的组成部分。近年来,人机界面在系统中所占的比例越来越大,在个别系统中人机界面的设计工作量甚至占总设计量的一半以上。 人机界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命,因此,必须对人机界面设计给予足够重视。,6.2 人机界面设计,6.2.1 设计问题,在设计人机界面的过程中,会遇到
5、下述4个问题:系统响应时间、用户帮助设施、出错信息处理和命令交互。 最好在设计初期就把这些问题作为重要的设计问题来考虑,这时修改比较容易,代价也低。,1. 系统响应时间,指从用户完成某个控制动作(例如,按回车键或点击鼠标),到软件给出预期的响应(输出信息或做动作)之间的这段时间。两个重要属性:长度和易变性。长度:系统响应时间不能过长。当用户工作速度是由人机界面决定的时候,系统响应时间过短也不好,这会迫使用户加快操作节奏,从而可能会犯错误。,易变性:指系统响应时间相对于平均响应时间的偏差,在许多情况下,这是系统响应时间的更重要的属性。响应时间易变性低也有助于用户建立起稳定的工作节奏。例如,稳定在
6、1秒的响应时间比从0.1秒到2.5秒变化的响应时间要好。响应时间变化过大用户往往担心这暗示系统工作出现了异常。,2. 用户帮助设施,大多数现代软件都提供联机帮助设施,这使得用户无须离开用户界面就能解决自己的问题。常见的帮助设施可分为两类。集成的:一开始就设计在软件里面,通常它对用户工作内容是敏感的,因此用户可以从与刚刚完成的操作有关的主题中选择一个请求帮助。显然,这可以缩短用户获得帮助的时间,增加界面的友好性。附加的:在系统建成后再添加到软件中的,在多数情况下它实际上是一种查询能力有限的联机用户手册。,(1) 在用户与系统交互期间,是否在任何时候都能获得关于系统任何功能的帮助信息:提供部分功能
7、的帮助信息和提供全部功能的帮助信息。(2) 用户怎样请求帮助:帮助菜单,特殊功能键F1和HELP命令。(3) 怎样显示帮助信息:在独立的窗口中,指出参考某个文档(不理想)和在屏幕固定位置显示简短提示。(4) 用户怎样返回到正常的交互方式中:屏幕上的返回按钮和功能键(大型网络游戏)。(5) 怎样组织帮助信息:平面结构,信息的层次结构和超文本结构。,设计时应考虑的问题:,3. 出错信息处理,出错或警告信息应该具有下述属性:(1) 信息应该用用户可以理解的术语描述问题。(2) 信息应该提供有助于从错误中恢复的建设性意见。如:不要用“选课失败”,给出失败的原因。(3) 信息应该指出错误可能导致哪些负面
8、后果(例如,破坏数据文件),以便用户检查是否出现了这些问题,并在确实出现问题时及时解决。(4) 信息应伴随着听觉或视觉上的提示:如发出警告铃声、用闪烁方式或表示出错的颜色显示信息。如:网络防火墙,网络连接图标等(5) 信息不能带有指责色彩,即不能责怪用户。当确实出现了问题的时候,有效的出错信息能提高交互式系统的质量,减轻用户的挫折感。,4. 命令交互,现在用户既可以从菜单中选择软件功能,也可通过键盘命令序列调用软件功能。在提供命令交互方式时,必须考虑下列设计问题。(1) 是否每个菜单选项都有对应的命令(2) 采用何种命令形式:控制序列(例如,Ctrl+P),功能键和键入命令。(3) 学习和记忆
9、命令的难度有多大,忘记了命令怎么办?(4) 用户是否可以定制或缩写命令?命令宏机制:用户可以用自己定义的名字代表一个常用的命令序列。用户只需输入命令宏的名字就可以顺序执行它所代表的全部命令。,6.2.2 设计过程,用户界面设计是一个迭代的过程:通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户意见进行修改。用户界面工具箱或用户界面开发系统:用于界面设计和原型开发,为简化窗口、菜单、设备交互、出错信息、命令及交互环境的许多其他元素的创建,提供了各种例程或对象。,用户界面的评估周期:完成初步设计之后就创建第一级原型;用户试用并评估该原型即确定其是否满足需求,直接向设计者
10、表述对界面的评价;设计者根据用户意见修改设计并实现下一级原型。上述评估过程持续进行下去,直到用户感到满意,不需要再修改界面设计时为止。,6.2.3 人机界面设计指南,设计指南:众多设计者的经验得出,有助于设计出友好、高效的人机界面。下面介绍3类设计指南:1. 一般交互指南涉及信息显示、数据输入和系统整体控制,因此,这类指南是全局性的,忽略它们将承担较大风险。(1) 保持一致性:应为人机界面中的菜单选择、命令输入、数据显示及众多的其他功能,使用一致的格式。(2) 提供有意义的反馈:应向用户提供视觉的和听觉的反馈,以保证在用户和系统之间建立双向通信。,(3) 在执行有较大破坏性的动作之前要求用户确
11、认:如果用户要删除一个文件,或覆盖一些重要信息,或终止一个程序的运行。(4) 允许取消绝大多数操作:UNDO或REVERSE功能曾经使众多终端用户避免了大量时间浪费。(5) 减少在两次操作之间必须记忆的信息量。(6) 提高对话、移动和思考的效率:减少用户击键的次数,设计屏幕布局时应考虑减少鼠标移动的距离,(7) 允许犯错误:系统应该能保护自己不受严重错误的破坏。不允许删除重要系统文件(8) 按功能对动作分类,并据此设计屏幕布局:尽力提高命令和动作组织的“内聚性”,下拉菜单的就是按动作类型组织命令。 (9) 提供对用户工作内容敏感的帮助设施(参见6.2.1节)。(10) 用简单动词或动词短语作为
12、命令名。过长的命令名难于识别和记忆,也会占用过多的菜单空间。,下面是关于信息显示的设计指南。(1) 只显示与当前工作内容有关的信息:用户在获得有关系统的特定功能的信息时,不必看到与之无关的数据、菜单和图形。如windows提供多种显示方式。(2) 应该用便于用户迅速吸取信息的方式来表示数据:例如,可以用图形或图表来取代庞大的表格。(3) 使用一致的标记、标准的缩写和可预知的颜色:显示的含义应该非常明确,用户无须参照其他信息源就能理解。如点击过的链接用红色显示。,2. 信息显示指南,(4) 允许用户保持可视化的语境:如果对所显示的图形进行缩放,原始的图像应该一直显示着(以缩小的形式放在显示屏的一
13、角),以使用户知道当前看到的图像部分在原图中所处的相对位置。(5) 产生有意义的出错信息(参见6.2.1节)。(6) 使用大小写、缩进和文本分组以帮助理解:人机界面显示的信息大部分是文字,文字的布局和形式对用户从中提取信息的难易程度有很大影响。,(7) 使用窗口分隔不同类型的信息:利用窗口用户能够方便地“保存”多种不同类型的信息。(8) 使用“模拟”显示方式表示信息,以使信息更容易被用户提取:例如,显示炼油厂储油罐的压力时,用类似温度计的形式来表示压力,用垂直移动和颜色变化来指示危险的压力状况,就容易引起用户的警觉。如任务管理器。(9) 高效率地使用显示屏:当使用多窗口时,应该有足够的空间使得
14、每个窗口至少都能显示出一部分。,3. 数据输入指南,下面是关于数据输入的设计指南。(1) 尽量减少用户的输入动作:用鼠标从预定义的一组输入中选一个; (2) 保持信息显示和数据输入之间的一致性。显示的视觉特征(颜色、文字大小)应该与输入域一致。(3) 允许用户自定义输入:专家级用户可能希望定义自己专用的命令或略去某些警告信息和动作确认。(4) 交互应该是灵活的,并且可调整成用户最喜欢的输入方式:例如,秘书可能非常喜欢键盘输入,而经理可能更喜欢使用鼠标之类的点击设备。,(5) 使在当前动作语境中不适用的命令不起作用:这可使得用户不去做那些肯定会导致错误的动作。(6) 让用户控制交互流:用户应能够
15、跳过不必要的动作,在不退出程序的情况下从错误状态中恢复正常。(7) 对所有输入动作都提供帮助(参见6.2.1节)。(8) 消除冗余的输入:除非可能发生误解,否则不要要求用户指定输入数据的单位;尽可能提供默认值;绝对不要要求用户提供程序可以自动获得或计算出来的信息。,6.3 过程设计的工具,6.3.1 程序流程图,6.3.2 盒图,6.3.3 PAD图,6.3.6 过程设计语言,6.3.4 判定表,6.3.5 判定树,过程设计,从软件开发的工程化观点来看,在使用程序设计语言编制程序以前,需要对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰的表达。这就是过程设计的任务。在过程设
16、计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做过程设计工具,它可以分为以下三类: 图形工具 表格工具 语言工具,6.3.1 程序流程图,程序流程图中常用的符号,程序流程图也称为程序框图,是历史最悠久、使用最广泛的一种描述工具,它独立于任何一种程序设计语言,主要优点是对控制流程的描绘比较直观,便于掌握。,流程符号的使用规则,1、循环符号的使用,循环体,- 循环流程符号的使用,2、判断有一个入口,但也允许有多个可选出口,- 多出口判断流程符号的使用,请利用程序流程图描述下列问题的程序结构,某汽车修配厂,有一个存有汽车零件的仓库,其中存有若干种零件,请编写一个查询
17、程序,用于查询该库中某零件的库存量为多少。,程序流程图的随意性和灵活性使它存在一些缺点:,(1)由于程序流程图诱使程序员容易过早地考虑程序的具体控制流程,而忽略了程序的全局结构,它本身并不是逐步求精的好工具;,(2)程序流程图中用箭头代表控制流,这样使得程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制;,(3)程序流程图在表示数据结构方面存在不足。,练习 131页4,6.3.2 盒图(N-S图),N-S图的基本符号,N-S图有以下一些特点:,(1)功能域(即某一个特定控制结构的作用域)有明确的规定,并且可以很直观地从N-S图上看出来;,(2)它的控制转移不能任意规定,必须遵守结
18、构化程序设计的要求;,(3)很容易确定局部数据和全局数据的作用域;,(4)很容易表现嵌套关系,也可以表示模块的层次结构。,N-S图的嵌套定义形式,请利用程序流程图描述下列问题的程序结构,某汽车修配厂,有一个存有汽车零件的仓库,其中存有若干种零件,请编写一个查询程序,用于查询该库中某零件的库存量为多少。,131页3,131页4,解法2,解法1,问题分析图(Problem Analysis Diagram)采用二维树形结构图表示程序的控制流。将这种图翻译成程序代码比较容易。用PAD 图表达的软件过程将呈树形结构,它即克服了传统的流程图不能清晰表现程序结构的缺点,又不像N-S图那样受到把全部程序约束
19、在一个方框内的限制。,6.3.3 PAD图,PAD图的基本符号,PAD图的主要优点如下:,(1) 使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序。(2) PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数。(3) 用PAD图表现程序逻辑,易读、易懂、易记。PAD图是二维树形结构的图形,程序从图中最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点。,(4) 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自
20、动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。(5) 既可用于表示程序逻辑,也可用于描绘数据结构。(6) PAD图的符号支持自顶向下、逐步求精方法的使用。开始时设计者可以定义一个抽象的程序,随着设计工作的深入而使用def符号逐步增加细节,直至完成详细设计,如图6.6所示。,图6.6 使用PAD图提供的定义功能来逐步求精的例子,当算法中包含多重嵌套的条件选择时,用判定表可以清晰地表示复杂的条件组合与应做的动作之间的对应关系。在判定表中的条件部分给出所有的两分支判断的列表,动作部分给出所有可能的处理判定表用于表示程序的静态逻辑,判定表不适于作为一种通用的设计工具,没有一种简单
21、的方法使它能同时清晰地表示顺序和重复等处理特性。要求将程序流程图中的多分支判断都改成两分支判断,6.3.4 判定表,建立判定表的步骤,左上部列出过程执行期间的所有条件(或所有判断)。左下部列出与一个具体过程(或模块)有关的所有处理。右上部为各种可能组合条件,其中每一列表示一种可能组合:将特定条件取值组合与特定的处理相匹配,消去不可能发生的条件取值组合。右下部的每一列是和每一种条件组合所对应的应做的动作。,假设某航空公司规定,乘客可以免费托运重量不超过30kg的行李。当行李重量超过30kg时,对头等舱的国内乘客超重部分每公斤收费4元,对其他舱的国内乘客超重部分每公斤收费6元,对外国乘客超重部分每
22、公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。用判定表可以清楚地表示与上述每种条件组合相对应的计算行李费的算法,如表6.1所示。,下面以行李托运费的算法为例:,用判定表表示计算行李费的算法,所有条件,所有可能做的动作,表示做它左边那项动作,表示左边那个条件成立,表示条件成立与否不影响对动作的选择,是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。形式简单,易于掌握和使用。同一元素可能重复出现,分支的次序可能对最终的判定树的简洁程度有较大的影响。,6.3.5 判定树,用判定树计算行李费的算法,某校制定了教师的讲课课时津贴标准。对于各种性质的讲座,无
23、论教师是什么职称,每课时津贴费一律是50元;而对于一般的授课,则根据教师的职称来决定每课时津贴费:教授30元,副教授25元,讲师20元,助教15元。用判定表和判定树表示课时费的计算方法。,作业:,教师课时津贴判定树,PDL 是一种用于描述功能模块的算法设计和加工细节的语言,使用自然语言的词汇,同时使用程序设计语言的语法,称为设计程序用语言。它是一种伪代码(Pseudo code),PDL,-关键词+自然语言,伪代码-文字形式的表达工具,不能在计算机上执行,但形式上与代码相似。用它来描述程序的结构,工作量要比画图小,又比较容易转换真正的代码。,6.3.6 过程设计语言,PDL具有严格的关键字外部
24、语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内部语法可使用自然语言的词汇。,(1)、数据说明:,格式: TYPE AS ,其功能是定义数据的类型和作用域,说明: 1. 变量名:是一个模块内部使用的变量或模块间共用 的全局变量名。,2. 限定词1 :标明数据类型,3. 限定词2 :标明该变量的作用域,TYPE number AS STRING LENGTH (12),(2)、程序块:,PDL的过程成分是由块结构构成的,而块将作为一个单个的实体来执行。,BEGIN END,(3)、子程序结构:,把 PDL 中的过程称为子程序。,PROCEDURE INTERFACE END,PR
25、OCEDURE spellcheck IS split document into single words look up words in dictionary display words which are not in dictionary create a new dictionary END,示例: 拼词检查程序,(4)、基本控制结构:,IF THEN ; ELSE ; ENDIF,- 选择型结构,DO WHILE ; ENDDO,REPEAT UNTIL ; ENDREP,- 重复型结构,DO LOOP ; EXIT WHEN ENDLOOP,DO FOR ; ENDFOR,-
26、重复型结构,- 多路选择结构,CASE OF ; WHEN SELECT ; WHEN SELECT ; DEFAULT: ; ENDCASE,READ/WRITE TO ,- 输入/输出结构,Enter a vector Set Maximum to the value of the first element in the vector DO for each second one to the last IF value of THEN element is greater than the Maximum value Set Maximum to value of the elemen
27、t ENDDO Print the Maximum value, execute process a REPEAT UNTIL condition X8 execute process b IF condition X1 THEN BEGIN execute process f IF condition X6 THEN REPEAT UNTIL condition X7 execute process i ENDREP ELSE BEGIN execute process g execute process h END ENDIF END,请将下列的 PDL 表示的某模块的过程性描述,改为用:
28、1、N-S 图 2、PAD 图表示,ELSE CASE OF Xi WHEN condition X2 SELECT DO WHILE condition X5 execute process C ENDDO WHEN condition X3 SELECT process d WHEN condition X4 SELECT process e ENDCASE ENDIF ENDREP execute process jEND,PDL语言具有下述优点:(1) PDL描述可以直接作为注释插在源程序中,这样做能促使维护人员在修改程序代码的同时也相应地修改PDL注释,因此有助于保持文档和程序的一致
29、性,提高了文档的质量。(2)用PDL写出的程序,既可以很抽象,又可以很具体,易实现自顶向下逐步求精的设计原则。(3)PDL描述同自然语言很接近,易于理解。可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。(4) PDL描述与程序结构相似,而且已经有自动处理程序存在,可以自动由PDL生成程序代码PDL的缺点是不如图形描述形象直观,因此人们常常将PDL描述与一种图形描述结合起来使用。,6.4 面向数据结构的设计方法,6.4.1 Jackson图,6.4.2 Jackson程序设计方法,退出,Jackson程序设计方法,数据结构既影响程序的结构又影响程序的处理过程。面向数
30、据结构设计方法的最终目标是得出对程序处理过程的描述。适合于在详细设计阶段设计每个模块的处理过程。首先需要分析确定数据结构,并用适当的工具清晰地描绘数据结构。,6.4.1 Jackson图,Jackson图表示方法,顺序结构:数据由一个和多个数据元素组成,每个元素按确定次序出现一次。选择结构:数据包含两个和多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。重复结构:重复结构的数据,根据使用时的条件,由一个数据元素出现零次或多次构成。,Jackson图的优点:,(1)Jackson图不仅便于表示层次结构,而且也有利于对结构自顶向下分解; (2)Jackson图形象直观,可读性好;
31、(3)Jackson图不仅能表示数据结构,也能表示程序结构(因为程序结构也可以由上述3种基本结构组成)。,Jackson图的缺点:,在选择结构和重复结构中,选择条件或循环结束条件不能直接在Jackson图中表示出来。这样就影响了图形的表达能力,也不利于直接把图翻译成程序。,改进的Jackson图,标识循环条件和分支条件框间连线改为直线,i是分支条件的编号,i是循环结束条件的编号,6.4.2 改进的Jackson图,Jackson图实质上是对第3.7节中介绍的层次方框图的一种精化。 与层次图的区别: 层次图中的一个方框通常代表一个模块;而Jackson图即使在描绘程序结构时,一个方框也并不代表一
32、个模块,通常一个方框只代表几个语句。 层次图表现的是调用关系,通常一个模块除了调用下级模块外,还完成其他操作;而Jackson图表现的是组成关系,也就是说,一个方框中包括的操作仅仅由它下层框中的那些操作组成。,6.4.3 Jackson方法,Jackson结构程序设计方法基本上由下述5个步骤组成:(1) 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。(2) 找出输入数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元必须重复的次序和次数都相同才可能有对应关系)。(3) 用下述3条
33、规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:,第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应);第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。,总之,描绘程序结构的Jackson图应该综合输入数据结构和输出
34、数据结构的层次关系而导出来。在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。(4) 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。(5) 用伪码表示程序。Jackson方法中使用的伪码和Jackson图是完全对应的,下面是和3种基本结构对应的伪码。,(1)顺序结构,A seqBCDA end,(2)选择结构,(3)重复结构,A select condition1BA or condition2CA or condition3DA end,A iter unt
35、il(或while) conditionBA end,例一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。对于这个简单例子而言,输入和输出数据的结构很容易确定。图6.12是用Jackson图描绘的输入输出数据结构。,图6.12 表示输入输出数据结构的Jackson图,第二步是分析确定在输入数据结构和输出数据结构中有对应关系的数据单元: 输出数据总是通过对输入数据的处理而得到的,因此在输入输出数据结构最高层次的两个单元总是有
36、对应关系的。这一对单元将和程序结构图中最顶层的方框(代表程序)相对应,也就是说经过程序的处理由正文文件得到输出表格。 因为每处理输入数据中一个“字符串”之后,就可以得到输出数据中一个“串信息”,它们都是重复出现的数据单元,而且出现次序和重复次数都完全相同,因此,“字符串”和“串信息”也是一对有对应关系的单元。,依次考察输入数据结构中余下的数据单元:“字符”不可能和多个字符组成的“字符串”对应,和输出数据结构中其他数据单元也不能对应。 “空格”能和“空格数”对应吗?显然,单个空格并不能决定一个记录中包含的空格个数,因此没有对应关系。 通过类似的考察发现,输入数据结构中余下的任何一个单元在输出数据
37、结构中都找不到对应的单元,也就是说,在这个例子中输入输出数据结构中只有上述两对有对应关系的单元。在图6.12中用一对虚线箭头把有对应关系的数据单元连接起来,以突出表明这种对应关系。,第三步是从数据结构图导出程序结构图。首先,在描绘程序结构的Jackson图的最顶层画一个处理框“统计空格”,它与“正文文件”和“输出表格”这对最顶层的数据单元相对应。第二层:因为在输出数据结构中“串信息”的上层还有“表格体”和“空格总数”两个数据单元,在程序结构图的第二层应该有与这两个单元对应的处理框“程序体”和“印总数”。,第三层:与“字符串”和“串信息”相对应的处理框“处理字符串”。第四层:和“字符串”、“字符
38、”及“空格数”等数据单元对应的处理框“印字符串”、“分析字符”及“印空格数”,这3个处理是顺序执行的。但是,“字符”是重复出现的数据单元,因此“分析字符”也应该是重复执行的处理。改进的Jackson图规定顺序执行的处理中不允许混有重复执行或选择执行的处理,所以在“分析字符”这个处理框上面又增加了一个处理框“分析字符串”。最后得到的程序结构图为图6.13。,图6.13 描绘统计空格程序结构的Jackson图,第四步是列出所有操作和条件,并且把它们分配到程序结构图的适当位置。首先,列出统计空格个数需要的全部操作和条件。经过简单分析不难把这些操作和条件分配到程序结构图的适当位置,结果为图6.14。最
39、后一步是用伪码表示程序处理过程。因为Jackson使用的伪码和Jackson图之间存在简单的对应关系,所以从图6.14很容易得出下面的伪码:,图6.14 把操作和条件分配到程序结构图的适当位置,统计空格seq打开文件读入字符串totalsum=0程序体iter until文件结束 处理字符串seq印字符串seq 印出字符串印字符串endsum=0pointer=1 分析字符串iter until字符串结束 分析字符select字符是空格,处理空格seq sum=sum+1 pointer=pointer+1处理空格end 分析字符or字符不是空格处理非空格seq pointer=pointer
40、+1处理非空格end 分析字符end分析字符串end印空格数seq印出空格数目印空格数end,totalsum=totalsum+sum读入字符串 处理字符串end程序体end印总数seq 印出空格总数印总数end关闭文件停止统计空格end,作业:高考后将考生的基本情况文件(简称考生基本情况文件)和考生高考成绩文件(简称考分文件)合并成一个新文件(简称考生新文件)。考生基本情况文件和考分文件都是由考生记录组成的。为简便起见,考生基本情况文件中的考生记录的内容包括:准考证号、姓名、通讯地址。考分文件中的考生记录的内容包括:准考证号和各门考分。合并后的考生新文件自然也是由考生记录组成,内容包括:准
41、考证号、姓名、通讯地址和各门考分。Jackson程序设计方法由五个步骤组成:,第一步 数据结构表示,对要求解的问题进行分析,确定输入数据和输出数据的逻辑结构,并用Jackson图描述这些数据结构。,第二步 找出输入数据结构和输出数据结构的对应关系,找出输入数据结构和输出数据结构中有对应关系的数据单元,即有直接因果关系、在程序中可以同时处理的数据单元。需要注意的是,对于重复的数据单元,必须是重复的次序、次数都相同才有可能有对应关系。,第三步 确定程序结构图,根据下述三规则,由Jackson图导出相应的程序结构图:,(1)为每对有对应关系的数据单元,按照它们在数据结构图中所处的层次,在程序结构图中
42、的相应层次画一个处理框。如果这对数据单元在输入数据结构图和输出数据结构图中所处的层次不同,那么应以它们在输入数据结构图和输出数据结构图中层次较低的那个层次作为它们在程序结构图中的处理框所处的层次;,(2)对于输入数据结构中剩余的数据单元,根据它们所处的层次,在程序结构图的相应层次为每个数据单元画上相应的处理框;,(3)对于输出数据结构中剩余的数据单元,根据它们所处的层次,在程序结构图的相应层次为每个数据单元画上相应的处理框。,实际上,这一步是一个综合的过程:每对有对应关系的数据单元合画一个处理框,没有对应关系的数据单元则各画一个处理框。,第四步 列出并分配所有操作和条件,列出所有操作和条件(包
43、括分支条件和循环结束条件),并把它们分配到程序结构图的适当位置。,操作:(1)停止 (2)打开两个输入文件; (3)建立输出文件。(4)从输入文件中各读一条记录(5)生成一条新记录。(6)将新记录写入输出文件。(7)关闭全部文件。 条件:I(1)文件结束。,把操作和条件分配到程序结构图的适当位置,用Jackson伪码描述的程序:,产生新文件 seq打开两个输入文件从输入文件中各读一条记录分析考生记录iter until文件结束处理考生记录 seq产生准考证号产生姓名产生通讯地址,产生考分生成一条新记录将新记录写入输出文件从输入文件中各读一条记录处理考生记录 end关闭全部文件停止产生新文件 e
44、nd,第五步 用伪码表示程序,程序复杂性主要是指模块内部程序的复杂性。它 直接关系到软件开发费用的多少,开发周期的长短和 软件和软件内部潜伏错误的多少。同时它也是软件可 理解性的另一种度量。,6.5 程序复杂程度的定量度量,程序复杂程度定量度量意义:程序的复杂程度乘以适当常数即可估算出软件中故障的数量以及软件开发需要的工作量。可以比较两个不同的设计和算法的优劣。定量的复杂程度可作为模块规模的精确限度。,原理:程序的复杂性很大程度上取决于程序控制流的复杂程度。单一的顺序结构最简单,循环和选择构成的环路越多,程序就越复杂。,6.5.1、McCabe 度量法,该方法是利用程序模块的程序图中环路的个数
45、,来计算程序的复杂性的。为此,该方法也称为环路复杂度计算法。,它是一种退化了的程序流程图。把程序流程图中每个处理符号都退化成一个结点,而原来流程图中的流程线,则变成连接不同结点的有向弧。,1. 流图(程序图),(1)程序图符号,(2)从流程图导出程序图,程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作,以及分支和循环的具体条件。通常称程序图中开始点后面的那个节点为入口点,称停止点前面的那个节点为出口点。,图6.16 由PDL翻译成的流图,用任何方法表示的过程设计结果,都可以翻译成流图:,图6.17 由包含复合条件的PDL映射成的流图,把复合条件分解为若干个简单条件,每个简单条件对应流图中一个结点。包含条件的结点称为判定节点,从每个判定结点引出两条或多条边。,当过程设计中包含复合条件,即在条件中包含了一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)时:,2. 计算环形复杂度的方法环形复杂度定量度量程序的逻辑复杂度。有了描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。(1) 流图中的区域数等于环形复杂度。(2) 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。(3) 流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。,
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。