软件⼯程概论课后习题答案
软件⼯程概论郑⼈杰等版第1章软件与软件⼯程的概念
1.1 举出你所知道的应⽤软件的例⼦。
办公软件、游戏软件、财务软件、银⾏软件、⼈事管理软件、⼯资管理软件、学籍管理软件等。1.2 认为“软件就是程序,软件开发就是编程序。”这种观点是否正确?为什么?认为“软件就是程序,软件开发就是编程序。”这种观点是错误的。
⾸先,软件是计算机系统中与硬件相互依存的另⼀部分,它是包括程序,数据及其相关⽂档的完整集合,程序只是软件的组成部分之⼀;其次,在软件开发中,编程只是软件开发过程的⼀个阶段。1.3 如果将软件开发⽐作⾼楼⼤厦的建造,可以将软件的设计⽐作什么?可以将软件的设计⽐作建筑设计,软件设计的成果相当于建筑设计的设计图纸。1.4 什么是软件危机?它有哪些典型表现?为什么会出现软件危机?
软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的⼀系列严重问题。典型表现:
(1)对软件开发成本和进度的估计常常很不准确。(2)⽤户对“已完成的”软件系统不满意的现象经常发⽣。(3)软件产品的质量往往靠不住。(4)软件常常是不可维护的。(5)软件通常没有适当的⽂档资料。
(6)软件成本在计算机系统总成本中所占的⽐例逐年上升。
(7)软件开发⽣产率提⾼的速度,既跟不上硬件的发展速度,也远远跟不上计算机应⽤迅速普及深⼊的趋势。
产⽣软件危机的原因:除了软件本⾝的特点,其原因主要有以下⼏个⽅⾯:(1) 缺乏软件开发的经验和有关软件开发数据的积累,使得开发⼯作计划很难制定。(2) 软件⼈员与⽤户的交流存在障碍,使得获取的需求不充分或存在错误。(3) 软件开发过程不规范。如,没有真正了解⽤户的需求就开始编程序。
(4) 随着软件规模的增⼤,其复杂性往往会呈指数级升⾼。需要很多⼈分⼯协作,不仅涉及技术问题,更重要的是必须有科学严格的管理。
(5) 缺少有效的软件评测⼿段,提交给⽤户的软件的质量不能完全保证。1.5 什么是软件⼯程?
软件⼯程是指导计算机软件开发和维护的⼯程学科。采⽤⼯程的概念、原理、技术和⽅法来开发和维护软件,把经过时间考验⽽证明正确的管理技术和当前能够得到的最好的技术⽅法结合起来,以经济地开发出⾼质量的软件并有效地维护它,这就是软件⼯程。
1.6 简述软件⽣存期由哪些主要的阶段组成,每⼀阶段的主要任务是什么?
(1)问题定义与可⾏性研究:问题定义必须回答的关键问题是:“要解决的问题是什么”。可⾏性研究要回答的关键问题是:“在成本和时间的条件下能否解决问题?是否值得做?”。(2)需求分析:这个阶段的任务仍然不是具体地解决客户的问题,⽽是准确地回答“⽬标系
统必须做什么”这个问题。
(3)软件设计:本阶段要回答的关键问题是“⽬标系统如何做?”为此,必须在设计阶段
中制定设计⽅案,把已确定的各项需求转换成相应的软件体系结构。结构中的每⼀组成部分都是意义明确的构件,此即所谓概要设计。进⽽具体描述每个构件所要完成的⼯作,为源程序编写打下基础,此即所谓详细设计。(4)程序编码和单元测试:本阶段要解决的问题是“正确地实现已做的设计”,为此,需要
选择合适的编程语⾔,把软件设计转换成计算机可以接受的程序代码,并对程序结构中的各个模块进⾏单元测试,然后运⽤调试的⼿段排除测试中发现的错误。要求编写出的程序应当是结构良好、清晰易读的,且与设计相⼀致的。(5)集成测试和系统测试:集成测试的任务是将已测试过的模块按设计规定的顺序组装起
来,在组装的过程中检查程序连接的问题。系统测试的任务是根据需求规格说明的要求,对必须实现的各项需求,逐项进⾏确认,判定已开发的软件是否符合⽤户需求,能否交付⽤户使⽤。为了更有效地发现系统中的问题,通常这个阶段的⼯作由开发⼈员、⽤户之外的第三者承担。
(6)运⾏维护:已交付的软件投⼊正式使⽤,便进⼊运⾏维护阶段。这⼀阶段可能持续若
⼲年。软件在运⾏中可能由于多⽅⾯的原因,需要对它进⾏维护。通常有四种类型的维护:改正性维护、适应性维护、完善性维护和预防性维护。
1.7 常见的软件⽣存期模型主要有哪些?每种模型的优缺点是什么?
常见的软件⽣存期模型主要有瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型和统⼀过程。(1)瀑布模型
优点:可强迫开发⼈员采⽤规范化的⽅法;严格地规定了每个阶段必须提交的⽂档;要求每个阶段交出的所有产品都必须经过质量保证⼩组的仔细验证。
缺点:由于瀑布模型⼏乎完全依赖于书⾯的规格说明,很可能导致最终开发出的软件产品不
能真正满⾜⽤户的需要;⽤户往往需要等待很长时间才能看到可以运⾏的程序;适应需求变更的能⼒⽐较差。适⽤范围:瀑布模型只适⽤于项⽬开始时需求已确定的情况。(2) 快速原型模型
优点:有助于满⾜⽤户的真实需求;原型系统已经通过与⽤户的交互⽽得到验证,据此产⽣的规格说明⽂档能够正确地描述⽤户需求。
缺点:要求开发⼈员快速建⽴原型。适⽤范围:适⽤于需求不明确的软件项⽬。(3) 增量模型优点:
能在较短时间内向⽤户提交可完成⼀些基本功能的产品,即从第⼀个构件交付之⽇起,⽤户就能做⼀些有⽤的⼯作。逐步增加产品的功能可以使⽤户有较充裕的时间学习和适应新产品,从⽽减少⼀个全新的软件可能给⽤户组织带来的冲击。项⽬失败的风险较低,虽然在某些增量构件中可能遇到⼀些问题,但其他增量构件将能够成功地交付给客户。优先级最⾼的服务⾸先交付,然后再将其他增量构件逐次集成进来。因此,最重要的系统服务将接受最多的测试。缺点:
在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品。软件体系结构必须是开放的,即向现有产品中加⼊新构件的过程必须简单、⽅便。
适⽤范围:适⽤于⼯期紧张、功能可以划分、⽐较复杂的软件项⽬。软件⼯程师必须有较⾼的技术⽔平,能够设计出开放的软件体系结构。(4) 螺旋模型
优点:
对可选⽅案和约束条件的强调有利于已有软件的重⽤,也有助于把软件质量作为软件开发的⼀个重要⽬标;减少了过多测试或测试不⾜所带来的风险;
在螺旋模型中维护只是模型的另⼀个周期,在维护和开发之间并没有本质区别。
缺点:螺旋模型是风险驱动的,因此要求软件开发⼈员必须具有丰富的风险评估经验和这⽅⾯的专门知识,否则将出现真正的风险:当项⽬实际上正在⾛向灾难时,开发⼈员可能还以为⼀切正常。
适⽤范围:适⽤于内部开发的⼤型软件(开发周期长、⽐较容易受到社会因素影响的软件项⽬),软件开发⼈员具有丰富的风险评估知识和经验。(5) 喷泉模型
优点:在开发过程中使⽤统⼀的概念和⽅法,各阶段之间没有明显的界限,容易实现各个开发过程的多次反复迭代,达到了认识的逐步深化,降低了出错的可能性。
缺点:由于各个阶段之间的界线不明确,容易造成软件开发过程的⽆序。适⽤范围:适⽤于⾯向对象的软件开发。(6) 统⼀过程
优点:提⾼了团队⽣产⼒,在迭代的开发过程、需求管理、基于组件的体系结构、可视化软
件建模、验证软件质量及控制软件变更等⽅⾯,针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和⼯具指导,并确保全体成员共享相同的知识基础。它建⽴了简洁和清晰的过程结构,为开发过程提供了较⼤的通⽤性。
缺点:RUP只是⼀个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运⾏和⽀持等⽅⾯的内容;此外,它没有⽀持多项⽬的开发结构,这在⼀定程度上降低了在开发组织内⼤范围实现重⽤的可能性。适⽤范围:适⽤于基于构件的软件开发。第2章软件⼯程⽅法与⼯具
2.1 软件⼯程的三种基本要素是什么,各⾃的作⽤是什么?软件⼯程的三种基本要素是⽅法、⼯具和过程。
(1) 软件⼯程⽅法(method)为建造软件提供技术上的解决⽅法(“如何做”)。⽬前使⽤得最⼴泛的⽅法是传统⽅法(结构化⽅法)和⾯向对象⽅法。
(2) ⼯具为⽅法的运⽤提供⾃动的或半⾃动的软件⽀撑环境。
(3) 过程是为了获得⾼质量的软件所需要完成的⼀系列任务的框架,它规定了完成各项任务的⼯作步骤。2.2 简述传统⽅法和⾯向对象⽅法的特点。(1) 传统⽅法的特点
传统⽅法也称为⽣命周期⽅法或结构化范型。它采⽤结构化技术来完成软件开发的各项任务。这种⽅法学把软件⽣命周期的全过程依次划分为若⼲个阶段,然后顺序地逐步完成每个阶段的任务。每⼀个阶段的开始和结束都有严格的标准,对于任何两个相邻的阶段⽽⾔,
前⼀个阶段的结束标准就是后⼀阶段的开始标准。
传统⽅法的主要缺点是在适应需求变化⽅⾯不够灵活,另外,结构化⽅法要么⾯向⾏为,要么⾯向数据,缺乏使两者有机结合的机制。
(2)⾯向对象⽅法的特点
⾯向对象⽅法把数据和⾏为看成同等重要,是将数据和对数据的操作紧密地结合起来的⽅法,这也是⾯向对象⽅法与传统⽅法的重要区别。
⾯向对象⽅法的出发点和基本原则,是尽量模拟⼈类习惯的思维⽅式,使开发软件的⽅法和过程尽可能接近⼈类认识问题和解决问题的⽅法与过程,从⽽使描述问题的问题空间与其解空间在结构上尽可能⼀致。对于⼤型、复杂及交互性⽐较强的系统,使⽤⾯向对象⽅法更有优势。
2.3 形式化⽅法的特点是什么?形式化⽅法的主要特点是:
(1) 软件需求规格说明被细化为⽤数学记号表达的详细的形式化规格说明;
(2) 设计、实现和单元测试等开发过程由⼀个变换开发过程代替。通过⼀系列变换将形式的规格说明细化成为程序。2.5 安装Rational Rose2000/2002/2003,并练习基本操作。略。
第3章软件需求获取与结构化分析⽅法
3.1 为什么结构化分析要叫“结构化”?有其他可替代的术语吗?
“结构化”⼀词应来源于“结构化程序设计”,先有“结构化程序设计”的思想,后有结构化设计及结构化分析。有时称传统的分析⽅法,指的就是结构化分析⽅法。3.2顶层数据流图或称环境图的作⽤是什么?
顶层数据流图(或称环境图)仅包括⼀个数据处理过程,也就是要开发的⽬标系统。其作⽤如下:(1) 确定系统在其环境中的位置,与系统有联系的外部实体(包括硬件、软件、组织机构及⼈)有哪些。
(2) 通过确定系统的输⼊和输出与外部实体的关系确定系统的边界,也就是要确定哪些功能或处理属于系统范围之内,哪些属于系统范围之外,需要由其他系统处理或⼈⼯处理。3.3 在对数据流图进⾏分解时需要注意哪些问题?在对数据流图进⾏分解时,需要注意以下两个问题:
(1) 当对数据流图分层细化时必须保持信息连续性,也就是说,当把⼀个处理分解为⼀系列处理时,分解前和分解后的输⼊/输出数据流必须相同。
(2) 注意分层细化时对编号的处理⽅法。
3.4 银⾏存款业务如下:客户到银⾏柜台存款时,⾸先填写存款单(包括帐号、姓名、存款⾦额、存款类型),如果还没有开户,则需要先开户,填写开户单(包括姓名、⾝份证号、地址、电话、是否留密码)。填写完存款单或开户单后,交给营业员,营业员将存款单或开户单信息输⼊计算机,系统记录开户信息或存款单信息,如果是开户并选择留密码,则需要客户输⼊密码。最后印出开户单或存款单给⽤户。请画出银⾏存款业务的分层数据流图(⾄少画出两层)。(1) 识别外部实体及输⼊输出数据流外部实体:储户、业务员。
输⼊数据流:存款单,开户单,密码。可以将存款单和开户单抽象为事务。输出数据流:存款单,开户单。(2) 顶层数据流图
(3) ⼀层数据流图
对银⾏储蓄系统进⾏分解,从⼤的⽅⾯分解为接收事务、处理开户、处理存款三部分,得到⼀层数据流图。
(4) ⼆层数据流图
对“处理存款”及“处理开户”进⾏进⼀步分解,得到⼆层数据流图,即处理存款的数据流图和处理开户的数据流图。
处理存款的数据流图
处理开户的数据流图
3.5 按照以下描述,画出ER图。
⼀本教材由许多章组成,每⼀章包含许多节、⼩结和习题组成,章和节都具有标题和序号属性。ER图如下:序号标题序号标题第4章结构化设计⽅法
4.1 当你“编写”程序时你设计软件吗?软件设计和编码有什么不同吗?
在“编写”程序时并没有设计软件。软件设计包括概要设计和详细设计,编码是将详细设计中的过程描述转换成⽤程序设计语⾔
来描述。
4.4 是否存在⼀种情况:复杂问题需要较少的⼯作去解决?这样的情况对模块化观点有什么影响?
通过对复杂的问题进⾏合理分解,分解为若⼲个相对简单及独⽴的⼦问题,就可以⽤较少的⼯作去解决。这种情况能够较好地⽀持模块化的观点,每个⼦问题⽤单独的模块去解决,模块之间应该是⾼内聚、低耦合的,这样才能减少⼯作量,否则,虽然每个模块的⼯作简单了,但模块之间的联系很复杂,也增加了问题解决的难度和⼯作量。4.8 ⽤⾯向数据流的⽅法设计第3章习题3.4所描述的银⾏存款业务的软件结构,并使⽤改进⽅法对模块结构进⾏精化。
(1) 对第3章习题3.4给出的数据流图进⾏精化,确定其边界,如下图所⽰。
(2) 对上图按事务型数据流进⾏处理,完成第⼀级分解,得到顶层和⼀层模块结构图。存款业务
输⼊数据调度输出数据第⼀级分解后的结构图
(3) 完成第⼆级分解。对上图所⽰的“输⼊数据”、“输出数据”和“调度”模块进⾏分解,得到未经精化的输⼊结构、输出结构和事务结构。
未经精化的输⼊结构
未经精化的输出结构
未经精化的事务结构
将上⾯的三部分合在⼀起,得到初始的软件结构,如下图所⽰。
初始软件结构图
(4) 对软件结构进⾏精化。
1) 由于调度模块下只有两种事务,因此,可以将调度模块合并到上级模块中,如图所⽰。
将调度模块合并到上级模块后的软件结构
2) “记录密码”模块的作⽤范围不在其控制范围之内(即“输⼊密码”模块不在“记录密码”模块的控制范围之内),需对其进⾏调整,如图所⽰。
3) 提⾼模块独⽴性,对模块结构进⾏调整,如下图所⽰。
调整后的模块结构图
4.9 将⼤的软件划分成模块有什么好处?是不是模块划分得越⼩越好?划分模块的依据是什么?
将⼤的软件划分成独⽴命名且可独⽴访问的模块,不同的模块通常具有不同的功能或职责。这种⽅法有利于将复杂的问题简单化,是分⽽治之策略的具体表现。
尽管模块分解可以简化要解决的问题,但模块分解并不是越⼩越好。当模块数⽬增加时,
每个模块的规模将减⼩,开发单个模块的成本确实减少了;但是,随着模块数⽬增加,模块之间关系的复杂程度也会增加,设计模块间接⼝所需要的⼯作量也将增加。
划分模块的依据是,模块只具有单⼀的功能且与其他模块没有太多的联系。
4.11 结构化程序设计禁⽌使⽤goto 语句吗?如果程序中使⽤了goto 语句,是否就可以断定它是⾮结构化的?结构化程序设计并不禁⽌使⽤goto 语句。如果程序中使⽤了goto 语句,并不能断定它是⾮结构化的。4.12 对于给定的算法,如何判断它是否是结构化的?
对于给定的算法,如果符合以下三条原则,就可以判断它是结构化的。 (1) 使⽤语⾔中的顺序、选择、重复等有限的基本控制结构表⽰程序逻辑。 (2) 选⽤的控制结构只准许有⼀个⼊⼝和⼀个出⼝。
(3) 程序语句组成容易识别的块(Block ),每块只有⼀个⼊⼝和⼀个出⼝。 4.13 对于图4-49所⽰的流程图,试分别⽤N-S 图和PAD 表⽰之。
图4-49 流程图FF页脚内容17
对应的N-S 图如下: 对应的PAD 如下:
4.14 图4-50所⽰的流程图完成的功能是使⽤⼆分查找⽅法在table 数组中找出值为item 的数是否存在。(1) 判断此算法是否是结构化的,说明理由。
(2) 若算法是⾮结构化的,设计⼀个等价的结构化算法,并⽤N-S 图表⽰。
T
while PAuntil !Q
图4-50 ⼆分查找算法的流程图
(1) 不是结构化的,最上⾯的循环有两个出⼝,最下⾯的分⽀有三个⼊⼝。(2) 等价的结构化算法如下:
或者