1第一章4.什么是软件工程?它与软件工程方法学有何关系?软件过程是为了开发高质量的软件产品所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程定义了运用技术方法的顺序,应该交付的文档资料,为保证软件质量和协调软件变化必须采取的管理措施,以及标志完成了相应开发活动的里程碑。软件过程是软件工程方法学的3个重要组成部分之一。2、假设要求你开发一个软件,该软件的功能是把读入的浮点数开平方,所得到的结果要求精确到小数点后4位。一旦实现并测试完成后,该产品将被抛弃。你打算选用哪种软件生命周期模型?说明你做出选择的理由。该软件的要求很明确,实现开平方算法的功能也很成熟,因此既无需通过原型来分析需求也无需用原型来验证设计方法。此外,一旦实现并测试完成后,该产品将被抛弃,因此无需使用有助于提高软件可维护性的增量模型或螺旋模型来开发该软件。综上所述,为了开发这个软件,使用瀑布模型就可以了。8.假设你被任命为一家软件公司的项目负责人,你的工作是管理该公司已被广泛应用的字处理软件的新版本的开发。由于市场竞争激烈,公司规定了严格的完成期限并且已对外公布。你打算采用哪种软件生命周期模型?为什么?答:对这个项目的一个重要要求是,严格按照已对外公布的日期完成产品开发工作,因此,选择生命周期模型时应该着重考虑哪种模型有助于加快产品开发的进度。使用增量模型开发软件时可以并行完成开发工作,因此能够加快开发进度。这个项目是开发该公司已被广泛应用的字处理软件的新版本,从上述事实至少可以得出三点结论:第一,旧版本想当于一个原型,通过收集用户对旧版本的反应,较容易确定对新版本的需求,没有必要再专门建立一个原型系统来分析用户的需求;第二,该公司的软件工程师对子处理软件很熟悉,有开发字处理软件的丰富经验,具有采用增量模型开发新版本字处理软件所需要的技术水平;第三,该软件收到广大用户的喜爱,今后很可能还要开发更新版本,因此,应该把该软件的体系结构设计成开放式,以利于今后的改进和扩充。综上所述,采用增量模型来完成这个项目较恰当。第三章3.29用Jackson图描绘下述的一列火车的构成:一列火车最多有两个火车头。只有一个火车头时则位于列车最前面,若还有第二个火车头时,则第二个火车头位于列车最后面。火车头既可能是内燃机车也可能是电器机车。车厢分为硬座车厢、硬卧车厢和软卧车厢等3种。硬座车厢在所有车厢的前面部分,软卧车厢在所有车厢的后面部分。此外,在硬卧车厢和软卧车厢之间还有一节餐车。答:jackson图善于描绘复杂事物的组成。用jackson图描绘一列火车的构成的方法至少有两种,一种方法是把火车分为一个车头和两个车头两类,另一种方法是把后车头作为可选的。图3.29给出了描绘一列火车的构成的jackson图。2第四章3.假设有一个由5000行FORTRAN语句构成的程序(经编译后大约有25000条机器指令),你估计在对它进行测试期间将发生多少个错误?为什么?答:经验表明,在类似的程序中,单位长度里的错误数Er/Ir近似为常数。美国的一些统计数字告诉我们,通常0.5ⅹ10-2=Er/Ir=2ⅹ10-2也就是说,在测试之前每1000条指令中大约有5-20个错误.假设在该程序的每1000条指令中大约有10个错误,则估计在对它进行测试期间将发现的错误数为25000ⅹ10/1000=250第五章3、某软件公司拟采取下述措施提高他们开发出的软件产品的可维护性。请判断那些措施是正确的,那些措施不正确。(1)在分析用户需求时同时考虑维护的问题。3正确。在分析用户需求的同时考虑维护问题,列出将来可能变更或增加的需求,就可以在设计时为将来可能做的修改预先做一些准备,使得在用户确实提出这些维护要求时,实现起来比较容易一些。(2)测试完程序后,删去程序中的注解以缩短源程序的长度。不正确。程序中的注解是提高程序可理解性的关键的内部文档,删去程序中的注解必然会降低程序的可读性和可理解性,从而降低软件的可维护性。(3)在软件开发过程中尽量保证各阶段文档的正确性。正确。完整准确的文档对提高软件的可理解性有重要贡献,保证文档的正确性是提高软件可维护性的关键。(4)编码时尽量多用全局变量。不正确。程序中使用的全局变量多,不仅违背局部化原理而且会使得具有公共环境耦合的模块数量增多,从而降低程序的可理解性,可修改性和可测试性,因此,这样的软件可维护性较差。(5)选用时间效率和空间效率尽可能高的算法。不正确。一般说来,效率高的算法的可理解性较差,选用效率尽可能高的算法将降低软件的可维护性。事实上,程序的效率能够满足用户的需求就可以了,没有必要盲目地追求尽可能高的效率。(6)尽可能利用硬件特点以提高程序效率。不正确。程序对硬件特点依赖越多,运行程序的硬件变更适应性维护的工作量也就越大。(7)尽可能使用高级语言编写程序。正确。用高级语言编程时,用户可以给程序变量和程序模块赋予含义鲜明的名字,通过名字能够比较容易的把程序对象和它们所代表的实体联系起来。此外,高级语言使用的概念和符号更符合人的习惯。上述事实都使得用高级语言编写的程序更容易阅读,因此也就更容易维护。(8)进行总体设计时加强模块间的联系。不正确。模块间耦合越紧密,程序就越难理解和修改,修改后测试也比较困难。因此,加强模块间的联系将降低软件的可维护性。(9)尽量减少程序模块的规模。不正确。程序模块的规模很小,就会使程序中包含的模块很多,这将使模块间的接口数量大大增加,从而增加了理解,修改和测试程序的难度,降低了软件的可维护性。(10)用数据库系统代替文件系统来存储需要长期保存的信息。正确。数据库系统比文件系统使用起来更方便,更安全,用数据库系统代替文件系统来存储需要长期保存的信息,可减少差错,降低改正性维护需求的数量。此外,使用数据库系统的程序比使用文件系统的程序更容易修改。上述事实表明,用数据库系统代替文件系统来存储需要长期保存的信息,将提高软件的可维护性。4(11)用CASE环境或程序自动生成工具来自动生成一部分程序。正确。自动生成的程序段没有差错,对软件的改正性维护需求自然将减少。当因用户的需求变更而需要修改程序时,可以先修改相应部分的规格说明,然后用CASE环境或程序自动生成工具自动生成需改动的程序,显然,这样做可以降低维护的工作量。(12)尽量用可重用的软件构成来组装程序。正确。可重用的软件构件基本上没有错误,用这样的构件组装成的程序可靠性高,改正性维护需求自然就比较少。此外,可重用的软件构件适应性强,应用范围广,容易使它适应新需求,因此,用这样的构建组装的程序比较容易实现适应性或完善性维护。(13)使用先进的软件开发技术。正确。用先进的软件技术开发出来的软件容易理解容易修改容易重用,因此,可维护性较好。(14)采用防错程序设计技术,在程序中引入自检能力。正确。在程序中引入自检能力可以显著提高软件的可靠性,因此将明显减少改正性维护需求的数量。(15)把与硬件及操作系统有关的代码放到某些特定程序模块中。正确。把和硬件及操作系统有关的代码放到某些特定的程序模块中,可以把因环境变化而必须修改的程序代码局限在少数模块内,从而更容易修改和测试。6.代码重构与正向工程有何相同之处?有何不同之处?答:代码重构和正向工程都需要重新设计数据结构和算法,并且需要重新编写程序代码,这些是代码重构和正向工程的相同的地方。通常代码重构并不修改程序的体系结构,它只修改某些模块的设计细节和模块中使用的局部数据结构,并重新编写这些模块的代码。如果修改的范围扩展到模块边界之外并涉及到程序的体系结构,则代码重构变成了正向工程。第六章习题3.为什么说夏利牌汽车是小汽车类的特化,而发动机不是小汽车类的特化?答:夏利牌汽车具有小汽车的全部属性和行为,它只不过是一种特定品牌的小汽车,因此,夏利牌汽车可以从基类“小汽车”派生出来,也就是说,夏利牌汽车是小汽车类的特化。发动机是组成小汽车的一种零件,小汽车还有车身、车灯、轮子等许多种其他零件,小汽车所具有的许多属性和行为发动机都不具有,因此,发动机不能从小汽车类派生出来,它不是小汽车类的特化。9.试简历下述订货系统的用例模型。假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下述数据:零件编号,零件名称,订货数量,目前价格,主要供应者,次要供应者。零件入库或出库称为事务,通过放在仓库中的终端把事务报告给订货系统。当某种零件库存数量少于库存量临界值时就应该再次订货。5答:从对这个订货系统的需求可以知道,仓库管理员通过放在仓库中的终端把零件入库、出库事务报告给订货系统,系统接收到事务信息之后应该处理事务;采购员需要使用订货系统提供的产生报表功能,以获取订货报表。综上所述,可以画出下图所示的用例图。订货系统用例图第七章习题2.应该依据什么准则来评价脚本?答:脚本必须从用户的观点来描述每个重要的功能序列,因此,脚本应该能够说明系统的一类重要功能或具体的使用方法。3.应该依据什么准则来评价状态图?答:状态图应该描述所有可能的状态转换。图中每条弧都要有一个引起状态转换的事件。从开始结点(初态)到每个结点(中间状态),以及从每个结点到最终结点(终态),都必须有一条路径。第八章3、在面向对象设计过程中为什么会调整对目标系统的需求?怎样调整需求?答:有两种情况会会导致修改由面向对象分析确定下来的系统需求:一是客户需求或系统外部环境发生了变化;二是分析员对问题域理解不透彻或缺乏领域专家帮助,以致面向对象分析模型不能完整、准确地反映客户的真实需求。为了调整对目标系统的需求,通常只需简单地修改面向对象分析的结果(例如,增添或删掉一些类,从已有类派生出新类派,调整某些类之间的关系),然后把这些修改反映到问题域子系统中。6、从面向对象分析阶段到面向对象设计阶段,对象模型有何变化?答:在面向对象分析阶段建立的对象模型中,对象是对问题空间中实体的抽象。随着软件开发过程进入面向对象设计阶段,这些对象逐渐变成了解空间的实体。第九章2.为什么是强类型语言?这类语言有哪些优点?答:按照编译时对程序中使用的数据进行类型检查的严格程度,可以把程序设计语言划分成两类。如果语言仅要求每个变量或属性隶属于一个对象,则是弱类型的;如果语法规定每个变量或属性必须准确地属于某个特定的类,则这样的语言是强类型的。6强类型的语言主要有两个优点:一是有利于在编译时发现程序错误,二是增加了优化的可能性。因此,强类型语言有助于提高程序的可靠性和运行效率。4.为什么说参数化类有助于提高可重用性?答:在实际的应用程序中,往往有这样一些软件元素(即函数、类等软件成分),从它们的逻辑功能看,彼此是相同的,所不同的主要是处理的对象类型不同。所谓参数化类,就是使用一个或多个类型去参数化一个类的机制,有了这种机制,程序员就可以先定义一个参数化的类模板(即在类定义中包含以参数形式出现的一个或多个类型),然后在使用时把数据类型作为参数传递进来,从而把这个类模板在不同的应用程序中重复使用,或在同一程序的不同部分重复使用。一1.填空(每空0.5分,共20分)(1)软件生命周期可划分为定义、开发和维护3个时期,通常把这3个时期再细分为8个阶段,它们是①问题定义、②可行性研究、③需求分析、④总体设计、⑤详细设计、⑥编码和单元测试、⑦综合测试和⑧维护,其中维护阶段的工作量是8个阶段中最大的。(2)可行性研究的任务是从技术、经济和操作等三个方面研究软件项目的可行性。(3)至少应该从一致性、现实性、完整性和有效性等4个方面研究软件需求的正确性,其中完整性和有效性这两个方面的正确性必须有用户的积极参与才能验证,而且为了验证这两个方面的正确性往往需要开发原型系统。(4)软件总体设计时应该遵循模块化、抽象、逐步求精、信息隐藏、局部化和模块独立等6条基本原理。详细设计通常以结构程序设计技术为逻辑基础,因为从软件工程观点看,可理解性是软件最重要的质量标准之一。(5)软件测试的目的是发现错误,通常把测试方法分为黑盒测试和白盒测试两大类。因为通常不可能做到穷