1、1.软件体系结构设计的原则有哪些?答:1)抽象的原则抽象是人们认识复杂事物的基本方法。它的实质是集中表现事物的主要特征和属性,隐藏和忽略细节部分,并用于概括普遍的、具有相同特征和属性的事物。2)分而治之的原则将大的问题分成几个小的问题,软件设计中的分解包括:横向分解:按照从底层基础到上层问题的方式,将问题分解成相互独立的层次。每层完成局部问题并对上层提供支持。纵向分解:在每个层次上,将问题分解成多项,相互配合实现完整的解。3)封装和信息隐藏原则采用封装的方式,隐藏各部分处理的复杂性,只留出简单的、统一形式的访问方式。这样可以减少各部分的依赖程度,增强可维护性。4)模块化原则模块是软件被划分成独
2、立命名的,并可被独立访问的成分。模块划分,粒度可大可小。划分的依据是对应用逻辑结构的理解。5)高内聚和低耦合内聚性是指软件成分的内部特性。成分中各处理元素的关联越紧密越好。耦合性是指软件成分间关系的特性。软件成分间的关联越松散越好。6)关注点分离原则软件成分被用于不同的场景时,会有对于不同场景的适应性问题。但是,所必须适应的内容并非全部,只是一部分,即所谓的关注点。软件设计要将关注点和非关注点分离,关注点的部分可以设定,而非关注点的部分用来复用,非关注点应选择与条件、场景独立的软件成分。7)策略和实现的分离原则策略指的是软件中用于处理上下文相关的决策、信息语义和解释转换、参数选择等成分。实现指
3、的是软件中规范且完整的执行算法。8)接口和实现分离原则软件设计要将接口和实现分离,这样可以保障成分的信息隐蔽性,以及提高可维护性。2.简要描述一种常见的软件体系结构,并举例说明。答:C/S 技术是 20 世纪 90 年代管理信息系统中较为先进的技术。典型的 C/S结构由三部分组成:客户端组件、服务器组件和中间层组件。客户端组件是用户前端部分,一般表示为图形用户界面;中间层组件是体系结构的连接器,一般由一些 API 和协议组成;服务器组件是 C/S 结构的核心,用于执行客户端请求。C/S 结构应用系统基本运行关系为“请求/响应”模式。当需要服务时客户端发出“请求” ,服务器接受“请求”并“响应”
4、 ,然后执行相应的服务,把执行结果送回给客户端,由它进一步处理后再提交给用户。C/S 结构最鲜明的特征是共享资源,它可以分配处理任务和集中的数据给客户端和服务器,使系统可以共享从数据到处理能力的每一种资源。C/S 结构的缺点是客户端很庞大,应用程序升级和维护十分困难,对应用程序的一点小改动就必须对每台客户端更新,并且系统移植复杂,对于不同的操作系统要求有不同的客户端软件。3.某系统需要进行身份认证,其需求描述如下:系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。身份认证一般与授权控制是相互联系的,授权控制是指一旦用户的身份通过认证以后
5、,确定哪些资源该用户可以访问、可以进行何种方式的访问操作等问题。本系统用户的合法性检查,包括基础信息检查、账户检查、账号可用性检查。请画出 MVC 三层结构的数据传递示意图并作简要文字说明。答:4.与 C/S 风格相比较, B/S 风格的体系结构有哪些的优缺点?答:与 C/S 风格相比,B/S 风格的优点主要包括:(1) 操作使用简单。用户在使用系统时,仅仅需要一个浏览器即可运行全部的模块。(2) 维护和升级方式简单。系统安装、修改、和维护全在服务器端解决,可以在系统运行时自动升级。(3) 成本降低,选择更多。系统开发成本降低,而且对于服务器的选择大大增多。目前的 B/S 体系结构也存在许多不
6、足之处,主要表现在:(1) 缺乏对动态页面的支持能力,也没有集成有效的数据库处理能力(2) B/S 体系结构的系统扩展能力差,安全性难以控制。(3) 系统在数据查询等响应速度上,远远低于 C/S 体系结构。(4) 数据动态交互性不强,不利于在线事务处理应用。5.为什么软件设计中要应用架构样式?答:应用软件架构样式主要有如下几个优势:(1) 可以促进设计的复用,使得一些经过实践证实的已经被透彻理解了的解决方案能够被重新应用到新问题中并解决它们。(2) 能够带来显著的复用,使得软件架构中的不变部分可共享同一个解决方案。 (3) 便于设计者之间的交流与理解,也使得系统组成让非设计者更易于理解。 (4
7、) 通过对标准样式的使用支持了系统的互操作性,以便于相关工具的集成。 (5) 在限定了设计空间的情况下,能够对相关样式作出对应的体系结构分析。 (6) 能够对特定的样式提供可视化支持,为体系结构设计师提供了图形和文本的描述工具来表达他们的想法。6.现在要求你建造一个产品来确定银行结单是否正确。需要得数据包括月初的余额,每张支票的号码、日期和数额,每笔储蓄的日期和数额及月末的余额。用数据流分析设计这个产品,确定一个银行存款支付处理报告书是否正确。答:(1)编写规格说明确认一个银行结单是否正确,画数据流图。先做如下假设:没有服务费、ATM 提款项目,仅有的交易只允许支票和储蓄,所有支票产生一个数据
8、。按支票号码处理。对每张支票,在银行清单中找到一个与支票号码一致的记录(条目) 。如果没有找到,报告书报错。根据储蓄日期整理到期的存款。对每一个到期存款,在银行清单中找到一个与存款日期和数额一致的记录(条目) 。如果没有找到,报告书报错。在处理所有支票和储蓄后,确认银行结单上所有的项目都已标记过。如果没有,报告书报错。在月初余额中加上所有储蓄金额,并从总额中扣去所有支票的金额。如果扣除后得到的结果不等于月末余额,报告书报错,否则该银行存款支付处理报告书正确。图 1 数据流图(2)用数据流分析结构设计如图 2,模块化设计如图 3。 (可以告诉学生这是否需要详细设计,如果不需要,必须要设计模块数)
9、银行清单支票 储蓄核对银行清单支票明细银行清单明细储蓄明细图图 2 银行存款支付处理报告书是否正确的结构图模块名 支票总额模块类型 函数,不返回值返回类型 void输入参数 银行清单:清单类型输出参数银行清单:清单类型支票总额:货币型Ok:布尔型差错信息 文件存取 文件改变 模块调用核对支票参数:银行清单:清单类型支票总额:货币型Ok:布尔型描述 这个模块是对核对支票的响应,返回ok(布尔型)和一系列处理过的支票,核对银行清单输入银行清单月初余额银行清单支票总额银行清单 支票总额Ok储蓄总额银行清单储蓄总额Ok核对余额储蓄、支票总额,银行清单Ok输出银行报告书Ok支票总额支票处理输入支票支票处
10、理后的支票银行清单Ok储蓄总额储蓄处理输入储蓄储蓄处理后的支票处理后的储蓄处理后的储蓄银行清单Ok若 ok 返回值为真,模块接受处理过的支票并返回支票的总额。否则,该模块不做任何处理,并返回 ok 的值。图 3 银行存款支付处理报告书是否正确的其中一个模块的细节设计7.考虑一个自动柜员机(ATM) ,用户将信用卡放入一个槽中,并输入 4 位数字的个人识别号(PIN) 。如果 PIN 不正确,将弹出该信用卡;如果 PIN 正确,用户可以对最多四个银行帐号进行下面的操作:1)存钱,数额任意。将打印出一个收据,显示日期、存入金额和账号。2)以 20 美元为单位,最多提取 200 美元(不能超过该数额
11、) 。除了现金,还将给用户打印出收据,显示日期、提取现金、账号、和提取后账号余额。3)确定账户余额。这将在屏幕上显示出来。4)在两个账户之间传递资金。被提取的账户中导出的金额还是不能超过最高限额。用户得到一个收据,显示日期、传递的金额和两个账号。5)退出。弹出信用卡。试用事务分析设计一个控制 ATM 的软件,在这个阶段省略错误处理能力。答:在存款时,仅当存款确认后客户账户才更新。下图为使用事务分析 A TM机的结构图。8.选择你熟悉的编程语言,考虑本讲中给出的模块化的两个定义,确定这两个定义中的哪一个包含了你能直观理解的东西,使你能在你所选择的语言中建造一个模块。答:最早试图描述模块的是 St
12、evens、Myers 和 Constantine,他们把模块定义为处理事务输入 PIN 确定事务类型 确定账户 调度程序处理退出事务处理存款事务处理传递事务处理余额事务编辑退出事务编译存款事务编辑传递事务编辑余额事务更新账户 更新账户 更新账户写入审查索引写入审查索引写入审查索引“一个或多个邻接的程序语句的集合,它有一个名称以便系统的其他部分调用它,并且最好具有自己的专用的变量名集。 ”Yourdon 和 Constantine 给出了一个更广泛的定义:“ 模块是一个词汇上邻接的程序语句序列,由边界元素限制范围,有一个集合标识符”。例:C 语言中函数的调用符合了第一个定义,一个较大的程序应分
13、为若干个程序模块,每个模块用于实现一个特定的功能,同一个函数可以被一个或多个函数任意调用多次。在 C 语言中,将一个独立功能的代码段写在一个函数里作为一个模块,然后当其它函数中需要用到该功能时可直接利用调用函数,这样不仅做到功能独立,简洁易懂,还有效的避免了数据冗余。Java 中的方法和 C/C+中的头文件。9.维护时内聚的影响是什么,耦合的影响是什么?答:模块的设计需要遵循高内聚、低耦合 heels 一些启发式规则。维护时仍需要高内聚,高内聚使得各模块功能相互独立,模块的内部交互程度高,具有较好的理解性、可维护性,维护工作量大大减少。耦合也要求低耦合,软件结构不同的模块之间的相互关联程度尽可
14、能弱,这样在维护的时候很容易,因为由于模块间的关联简单,发生在一处的错误传播到整个系统的可能性很小。10.请对抽象和信息隐藏两个概念进行分析比较。答:(英)抽象是需要考虑实现什么而不是它如何实现的。信息隐藏是对用户故意隐藏更多的细节。抽象是信息隐藏的实例。把一些相似的地方集中和概括起来,暂时忽略他们之间的差异,这就是抽象。或者说抽象是抽出事物的本质特性而暂时不考虑他们的细节。信息隐藏是在设计和确定模块时,要使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说是不能访问的,信息隐藏更准确的描述应是“细节隐藏” 。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的
15、办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱” ,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。6.假设你是一个负责产品开发的工程师,管理者要求你研究一下确保你所在小组设计出的模块能够尽可能复用的途径,你将如何回答他?答:(英)保证模块内部具有高内聚和模块间的低耦合,同样信息隐藏技术对可复用性非常重要,使
16、用面向对象编程也能促进可复用性。抽象、信息隐藏、模块化、局部化、一致性、完整性和可验证性。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。.信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱” ,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。模块是程序逻辑上相对独立的成份,它是一个独立的编
17、程单位,应有良好的接口定义。如,FORTRAN 语言中的函数、子程序、Ada 语言中的程序包、子程序、任务等。模块化有助于信息隐藏和抽象,有助于表示复杂的软件系统。模块的大小要适中,模块过大会导致模块内部复杂性的增加,不利于模块的调式和重用,也不利用模块的理解和修改。模块太小会导致整个系统的表示过于复杂,不利于控制解的复杂性。模块之间的关联程度用耦合度度量。局部化要求在一个物理模块内集中逻辑上相互关联的计算资源。从物理和逻辑两个方面保证系统中模块之间具有松散的耦合关系,而在模块内部有较强的内聚性。这样有利于控制解的复杂性。抽象和信息隐藏、模块化和局部化的原则支持软件工程的可理解性、可修改性和可
18、靠性,有助于提高软件产品的质量和开发效率。一致性是指整个软件系统的各个模块均应使用一致的概念、符号和术语:程序内部接口应保持一致:软件与硬件接口应保持一致;系统规格说明与系统行为应保持一致;用于形式化规格说明的公理系统应保持一致,等等。一致性原则支持系统的正确性和可靠性。实现一致性需要良好的软件设计工具、设计方法和编码风格的支持。完整性是指软件系统不丢失任何重要成分,完全实现系统所需功能的成都;在形式化开发方法中,按照给出的公理系统,描述系统行为的充分性;当系统出于错或非预期状态时,系统行为保持正常的能力。完整性要求人们开发必要且充分的模块。为了保证软件系统的完整性,软件在开发和运行过程中需要
19、软件管理工具的支持。可验证性是指开发大型软件系统需要对系统逐步分解。系统分解应该遵循系统容易检查、测试、评审的原则,以便保证系统的正确性。采用形式化的开发方法或具有强类型机制的程序设计语言及其软件管理工具可以帮助人们建立一个可验证的软件系统。10.确定以下模块的内聚类型:1)编辑利润和税款记录2)编辑利润记录和税款记录3)读取交付记录并检查工资的支付4)使用 Aksen 算法计算最佳成本5)测量蒸汽压力并在必要时报警答:1) 功能性内聚 2)过程性内聚 3) 偶然性内聚 4) 功能性内聚 5) 过程性内聚11.分析下图所示的层次图,确定每个模块的内聚类型。计算多地点日 平均温度的程 序答:从
20、图所示的层次图可以看出,这个程序的功能是计算若干个指定地点的每日平均温度。变量 sum 保存某地一天之内在指定的时间取样点的温度之和。程序运行时首先初始化变量 sum 并打开文件,然后读取地点、时间和温度等原始数据,创建用于保存这些数据的温度记录,接下来计算特定地点的日平均温度,存储温度记录。重复调用“读取地点、时间和温度” 、 “创建新的温度记录” 、 “计算特定地点的日平均温度”和“存储温度记录”等模块,直至计算出并保存好所有指定地点的日平均温度。最后,打印平均温度并关闭文件。从上述叙述可知, “计算多个地点的日平均温度” 、 “读取地点、时间和温度”、 “创建新的温度记录” 、 “计算特
21、定地点的日平均温度”和“存储温度记录”等 5 个模块,每个都完成一个单一的功能,模块内所有处理元素都为完成同一个功能服务,彼此结合得十分紧密。因此,这 5 个模块的的内聚类型都是功能内聚。初看起来,由于初始化变量 sum 和打开文件这两个操作都是在程序运行的初始阶段完成的, “初始化变量 sum 并打开文件”这个模块的内聚类型似乎是时间内聚。但是,初始化变量 sun 是本程序特有的操作,而打开文件是硬件要求的操作,是任何使用文件的程序都包含的一个操作,并非本程序特有的操作。当可以分配两个或更多个不同级别的内聚类型给一个模块时,规则是分配最低级别的内聚类型给该模块。因此, “初始化变量 sum
22、并打开文件”这个模块的内聚类型是偶然内聚。同理, “关闭文件并打印平均温度”这个模块的内聚类型也是偶然内聚。12.分析下图,确定模块之间的耦合类型。在图中给出模块之间的接口编了号码,下表描述了模块间的接口。编号 输入 输出1 飞机类型 状态标志2 飞机零件清单3 功能代码4 飞机零件清单5 零件编号 零件制造商6 零件编号 零件名称计算多个地点的日平均温度初始化变量 Sum并打开文件创建新的温度记录存储温度记录关闭文件并打印平均温度读取地点、时间和温度计算特定地点的日平均温度pqrtsu126435模块 p、t和 u 更新同一个数据库答:综合图和表所提供的信息可知各个模块之间的耦合情况。如,当
23、模块 p 调用模块 q 时(接口 1) ,它传递了一个参数分机类型。当模块 q 把控制返给模块 p 时,它传回一个状态标志。某些模块之间的耦合类型是明显的,例如,模块 p 和 q 之间(接口 1) 、模块 r 和 t 之间(接口 5)及模块 s 和 u 之间(接口 6)都是数据耦合,因为它们传递的都是一个简单变量。如果两个模块中的一个模块给另一个模块传递控制元素,也就是说,如果一个模块明显的控制另一个模块的逻辑,则它们之间具有控制耦合。例如,当给具有逻辑内聚的模块传递功能代码时就传递了控制元素。另一个控制耦合的例子是把控制开关作为一个参数传递。图中模块 q 调用模块 r 时(接口 3)传递一个
24、功能代码,因此,这两个模块之间是控制耦合。图右侧文字说明,模块 p、t 和 u 更新同一个数据库,因此,他们之间具有公共环境耦合。当模块 p 调用模块 s 时(接口 2) ,如果模块 s 使用或更新模块 p 传递给它的零件清单中的所有元素,则模块 p 和 s 之间的耦合是数据耦合;但是,如果模块 s 只访问该清单中的一部分元素,则模块 p 和 s 之间的耦合式特征耦合。模块 q 和 s 之间(接口 4)的耦合情况与此类似。由于图和表中给出的信息尚不足以准确的描述各个模块的功能,所以不能确定这两对模块之间的耦合是数据耦合还是特征耦合。13.请对抽象和信息隐藏两个概念进行分析比较。答:(英)抽象是
25、需要考虑实现什么而不是它如何实现的。信息隐藏是对用户故意隐藏更多的细节。抽象是信息隐藏的实例。把一些相似的地方集中和概括起来,暂时忽略他们之间的差异,这就是抽象。或者说抽象是抽出事物的本质特性而暂时不考虑他们的细节。信息隐藏是在设计和确定模块时,要使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说是不能访问的,信息隐藏更准确的描述应是“细节隐藏” 。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要
26、罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱” ,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。14.C+和 Java 支持抽象数据类型的实现,但却以放弃信息隐藏为代价。请讨论这个观点。答:这个观点是错误的。信息隐藏可以通过私有访问来实现。15.假设你是一个负责产品开发的工程师,管理者要求你研究一下确保你所在小组设计出的模块能够尽可能复用的途径,你将如何回答他?答:(英)保证模块内部具有高内聚和模块间的低耦合,同样信息隐藏技术对可复用性非常重要,使用面向对象编程也
27、能促进可复用性。抽象、信息隐藏、模块化、局部化、一致性、完整性和可验证性。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。.信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱” ,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。模块是程序逻辑上相对独立的成份,它是一个独立的编程单位,应有良好
28、的接口定义。如,FORTRAN 语言中的函数、子程序、Ada 语言中的程序包、子程序、任务等。模块化有助于信息隐藏和抽象,有助于表示复杂的软件系统。模块的大小要适中,模块过大会导致模块内部复杂性的增加,不利于模块的调式和重用,也不利用模块的理解和修改。模块太小会导致整个系统的表示过于复杂,不利于控制解的复杂性。模块之间的关联程度用耦合度度量。局部化要求在一个物理模块内集中逻辑上相互关联的计算资源。从物理和逻辑两个方面保证系统中模块之间具有松散的耦合关系,而在模块内部有较强的内聚性。这样有利于控制解的复杂性。抽象和信息隐藏、模块化和局部化的原则支持软件工程的可理解性、可修改性和可靠性,有助于提高
29、软件产品的质量和开发效率。一致性是指整个软件系统的各个模块均应使用一致的概念、符号和术语:程序内部接口应保持一致:软件与硬件接口应保持一致;系统规格说明与系统行为应保持一致;用于形式化规格说明的公理系统应保持一致,等等。一致性原则支持系统的正确性和可靠性。实现一致性需要良好的软件设计工具、设计方法和编码风格的支持。完整性是指软件系统不丢失任何重要成分,完全实现系统所需功能的成都;在形式化开发方法中,按照给出的公理系统,描述系统行为的充分性;当系统出于错或非预期状态时,系统行为保持正常的能力。完整性要求人们开发必要且充分的模块。为了保证软件系统的完整性,软件在开发和运行过程中需要软件管理工具的支
30、持。可验证性是指开发大型软件系统需要对系统逐步分解。系统分解应该遵循系统容易检查、测试、评审的原则,以便保证系统的正确性。采用形式化的开发方法或具有强类型机制的程序设计语言及其软件管理工具可以帮助人们建立一个可验证的软件系统。16.画出下列伪码程序的程序流程图和盒图。答:从伪码程序转变成的程序流图如图 12.1 所示。由该伪码转变成的盒图如图12.2。图 12.1 从伪码程序转变成的程序流图STARTIF P THENWHILE q DOfEND DOELSEBLOCKgnEND BLOCKEND IFSTOP开始pgnF Tq 循环WHILE qfq 循环停止PF Tqg fn 图 12.2
31、 由伪码转变成的盒图17.右图给出的程序流程图代表一个非结构化的程序,请问:(1)为什么说它是非结构化?(2)设计一个与它等价的结构化程序。(3)在(2)题的设计中你使用附加的标志标量 flag 了吗?若没用,请再设计一个使用 flag 的程序;若用了,请再设计一个不用 flag 的程序。答:(1)通常所说的结构化程序是按照狭义的结构程序的定义衡量,符合定义规定的程序。图所示的程序循环控制结构有两个出口,显然不符合狭义的结构程序的定义, ,因此是非结构化的程序。(2)使用附加的标志变量 flag,至少有两种方法可以把程序改造为等价的结构化程序,图 13.1 所示盒图描绘了等价的结构化程序。(3
32、)不使用 flag 把该程序改造为等价的结构化程序的方法如图 13.2 所示。图 13.1 等价的结构化程序图 13.2 等价的结构化程序(不用 flag)18.研究下面给出的伪码程序,要求:(1)画出它的程序流程图。(2)它是结构化的还是非结构化的?说明你的理由。(3)若是非结构化的,则:停止开始pgqTTFFFlag=TRUEp AND flagg qF TFlag=FALSEFlag=TRUEF p Tflag=FALSE g(NOT q)OR(NOT flag) F p Tg(NOT q)OR(NOT q)把它改造成仅用三种控制结构的结构化程序;写出这个结构化设计的伪码;用盒图表示这个
33、结构化程序。(4)找出并改正程序逻辑中的错误。答:(1)根据这个伪码程序画出的程序流程图如 14.1 所示。(2)这个程序是非结构化的。因为在图 14.1 中“印出缓冲区的内容”这个处理框有两个入口;此外,循环结构有两个出口:IT 为假和 MATCH=N 为真时都结束循环。(3)仅用 3 种控制结构的等价的结构化程序的伪码如下:COMMENT:PROGRAM SEARCHES FOR FIRST N REFERENCESTO A TOPIC IN AN INFORMATION RETRIEVALSYSTEM WITH T TOTAL ENTRIESINPUT NINPUT KEYWORD(S)
34、 FOR TOPICI=0MATCH=0DO WHILE I10if A(i)=n1n2=n1n1=A(i)end while20.用 Jackson 图描绘下述的一列火车的构成:一列火车最多有两个火车头。只有一个火车头时则位于列车最前面,若还有第二个火车头时,则第二个火车头位于列车最后面。火车头既可能是内燃机车也可能是电气机车。车厢分为硬座车厢、硬卧车厢和软卧车厢 3 种。硬卧车厢在所有车厢的前面,软卧车厢在所有车厢的后面。此外,在硬卧车厢和软卧车厢之间还有一节餐车。答:Jackson 图善于描绘复杂事物的组成。用 Jackson 图描绘一列火车的构成的方法至少有两种,一种方法是把火车分为一
35、个车头和两个车头两类,另一种方法是把后车头作为可选的。下图给出了描绘一列火车的构成的 Jackson 图。(a) 解法 1(b) 解法 2图 用 Jackson 图描绘一列火车的构成21. 假设对顾客的订货单按如下原则处理:将顾客的信用度分三个档次: 欠款时间不超过 30 天; 欠款时间超过 30 天但不超过 100 天; 欠款时间超过 100 天。 对于上述三种情况,分别根据库存情况来决定对顾客订货的态度。情况之一(欠款时间30 天),如果需求数库存量,则立即发货,如果需求数 库存量,则只发现有库存,不足部分待进货后补发。情况之二(30 天库存量,则不发货。情况之三(欠款时间100 天),则通知先付欠款,再考虑是否发货。 试用判定树的形式予以描述(设欠款时间 D,需求数 N,库存量 Q)。答:火车1 车头 。 2 车头 。车头硬座车厢硬卧车厢一节餐车软卧车厢S内 。燃电 。气S一节 *硬座一节 *硬卧一节 *软卧I I I车头硬座车厢硬卧车厢一节餐车软卧车厢内 。燃电 。气S一节 。*硬座一节 。*硬卧一节 。*软卧I I I车头内 。燃电 。气S火车前车头内 。燃电 。气车厢后车头S硬座车厢硬卧车厢一节餐车软卧车厢一节 *硬座I一节 *硬卧I一节 *软卧I车 。头一 。S内 。燃电 。气S22. 用 Jackson 图表示下图所示的二维表格:答: