聿 | 第 | 1 | 章 | 软 | 件 | 与 | 软 | 件 | 工 | 程 | 的 | 概 | 念 |
蚇1.1举出你所知道的应用软件的例子。
莇办公软件、游戏软件、财务软件、银行软件、人事管理软件、工资管理软件、学籍管理软件等。
莁1.2认为“软件就是程序,软件开发就是编程序。”这种观点是否正确?为什么?
螁认为“软件就是程序,软件开发就是编程序。”这种观点是错误的。
蒆首先,软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合,程序只是软件的组成部分之一其次,在软件开发中,编程只是软件开发过程的一个阶段。
螂可以将软件的设计比作建筑设计,软件设计的成果相当于建筑设计的设计图纸。
艿1.4什么是软件危机?它有哪些典型表现?为什么会出现软件危机?
葿软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
薆典型表现:
(1)
(2) 膃对软件开发成本和进度的估计常常很不准确。
(3)
(4) 羁用户对“已完成的”软件系统不满意的现象经常发生。
1
(5)
(6)芈软件产品的质量往往靠不住。
(7)
(8)蚆软件常常是不可维护的。
(9)
(10) 薄软件通常没有适当的文档资料。
(11)
(12) 荿软件成本在计算机系统总成本中所占的比例逐年上升。
(13)
(14) 羇软件开发生产率提高的速度,既跟不上硬件的发展速度,也远远跟不上计算机应用
迅速普及深入的趋势。
螆产生软件危机的原因:除了软件本身的特点,其原因主要有以下几个方面:
羅(1)缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作计划很难制定。
肀(3)软件开发过程不规范。如,没有真正了解用户的需求就开始编程序。
袆(4)随着软件规模的增大,其复杂性往往会呈指数级升高。需要很多人分工协作,不仅涉
及技术问题,更重要的是必须有科学严格的管理。
膁(5)缺少有效的软件评测手段,提交给用户的软件的质量不能完全保证。
袂1.5什么是软件工程?
螈软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方
法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术
2
方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
羆1.6简述软件生存期由哪些主要的阶段组成,每一阶段的主要任务是什么?
(1)
(2) 薂问题定义与可行性研究:问题定义必须回答的关键问题是:“要解决的问题是什么”。
可行性研究要回答的关键问题是:“在成本和时间的条件下能否解决问题?是否值得做?”。
(3)
(4) 芀需求分析:这个阶段的任务仍然不是具体地解决客户的问题,而是准确地回答“目标 系统必须做什么”这个问题。
(5)
:本阶段要回答的关键问题是“目标系统如何做?”为此,必须在设计阶段(6) 薇软件设计
中制定设计方案,把已确定的各项需求转换成相应的软件体系结构。结构中的每一组 成部分都是意义明确的构件,此即所谓概要设计。进而具体描述每个构件所要完成的 工作,为源程序编写打下基础,此即所谓详细设计。
(8) 要选择合适的编程语言,把软件设计转换成计算机可以接受的程序代码,并对程序结
(7)
构中的各个模块进行单元测试,然后运用调试的手段排除测试中发现的错误。要求编写出的程序应当是结构良好、清晰易读的,且与设计相一致的。
(9)
(10) 羃集成测试和系统测试:集成测试的任务是将已测试过的模块按设计规定的顺序组装起 来,在组装的过程中检查程序连接的问题。系统测试的任务是根据需求规格说明的要 求,对必须实现的各项需求,逐项进行确认,判定已开发的软件是否符合用户需求, 能否交付用户使用。为了更有效地发现系统中的问题,通常这个阶段的工作由开发人 员、用户之外的第三者承担。
(11)
(12) 肂运行维护:已交付的软件投入正式使用,便进入运行维护阶段。这一阶段可能持续若 干年。软件在运行中可能由于多方面的原因,需要对它进行维护。通常有四种类型的 3
维护:改正性维护、适应性维护、完善性维护和预防性维护。
莆1.7常见的软件生存期模型主要有哪些?每种模型的优缺点是什么?
肆常见的软件生存期模型主要有瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型和统一过程。
(1)
(2) 莄瀑布模型
蒀优点:可强迫开发人员采用规范化的方法;严格地规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。
荿缺点:由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品
不能真正满足用户的需要;用户往往需要等待很长时间才能看到可以运行的程序;适应需求变更的能力比较差。
蒁(2)快速原型模型
膂优点:有助于满足用户的真实需求;原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。
膈缺点:要求开发人员快速建立原型。
芅适用范围:适用于需求不明确的软件项目。
袂(3) 增量模型 蚀优点: |
|
4
?
? 羇能在较短时间内向用户提交可完成一些基本功能的产品,即从第一个构件交付之日起,
用户就能做一些有用的工作。
?
? 莅逐步增加产品的功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全
新的软件可能给用户组织带来的冲击。
?
? 芃项目失败的风险较低,虽然在某些增量构件中可能遇到一些问题,但其他增量构件将
能够成功地交付给客户。
?
? 莂优先级最高的服务首先交付,然后再将其他增量构件逐次集成进来。因此,最重要的
系统服务将接受最多的测试。
? 羀缺点:
??
? 蚄软件体系结构必须是开放的,即向现有产品中加入新构件的过程必须简单、方便。
蝿适用范围:适用于工期紧张、功能可以划分、比较复杂的软件项目。软件工程师必须有较
高的技术水平,能够设计出开放的软件体系结构。
蝿(4)螺旋模型
蒅优点:
?
? ? | 肅对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件 |
5
? 薁减少了过多测试或测试不足所带来的风险;
?
? 蒇在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。
薅缺点:螺旋模型是风险驱动的,因此要求软件开发人员必须具有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上正在走向灾难时,开发人员可能还以为一切正常。
芁适用范围:适用于内部开发的大型软件(开发周期长、比较容易受到社会因素影响的软件项目),软件开发人员具有丰富的风险评估知识和经验。
罿(5)喷泉模型
开发过程的多次反复迭代,达到了认识的逐步深化,降低了出错的可能性。
芆优点:在开发过程中使用统一的概念和方法,各阶段之间没有明显的界限,容易实现各个
蚂适用范围:适用于面向对象的软件开发。
蚁(6)统一过程
艿优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组件的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面,针对所有关键的开发活动为每个开发成员提供了必要的准则、模板和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供了较大的通用性。
螅缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运 行和支持等方面的内容;此外,它没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。 6
肃适用范围:适用于基于构件的软件开发。
腿
肈
袄第2章软件工程方法与工具
蒄2.1软件工程的三种基本要素是什么,各自的作用是什么?
袁软件工程的三种基本要素是方法、工具和过程。
羄(2)工具为方法的运用提供自动的或半自动的软件支撑环境。
袅(3)过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各
项任务的工作步骤。
荿2.2简述传统方法和面向对象方法的特点。
袀(1)传统方法的特点
肄传统方法也称为生命周期方法或结构化范型。它采用结构化技术来完成软件开发的各
项任务。这种方法学把软件生命周期的全过程依次划分为若干个阶段,然后顺序地逐步完成
每个阶段的任务。每一个阶段的开始和结束都有严格的标准,对于任何两个相邻的阶段而言,
7
前一个阶段的结束标准就是后一阶段的开始标准。
羂传统方法的主要缺点是在适应需求变化方面不够灵活,另外,结构化方法要么面向行为,要么面向数据,缺乏使两者有机结合的机制。
肁(2)面向对象方法的特点
虿面向对象方法把数据和行为看成同等重要,是将数据和对数据的操作紧密地结合起来的方法,这也是面向对象方法与传统方法的重要区别。
肄面向对象方法的出发点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识问题和解决问题的方法与过程,从而使描述问题的问题空间与其解空间在结构上尽可能一致。对于大型、复杂及交互性比较强的系统,使用面向对象方
法更有优势。
螃形式化方法的主要特点是:
莈(1)软件需求规格说明被细化为用数学记号表达的详细的形式化规格说明;
膄(2)设计、实现和单元测试等开发过程由一个变换开发过程代替。通过一系列变换将形式的规格说明细化成为程序。
螄2.5安装RationalRose2000/2002/2003,并练习基本操作。
芀略。
膆 8
芄
膄第3章软件需求获取与结构化分析方法
羂3.1为什么结构化分析要叫“结构化”?有其他可替代的术语吗?
羅“结构化”一词应来源于“结构化程序设计”,先有“结构化程序设计”的思想,后有
结构化设计及结构化分析。有时称传统的分析方法,指的就是结构化分析方法。
肀3.2顶层数据流图或称环境图的作用是什么?
作用如下:
肇顶层数据流图(或称环境图)仅包括一个数据处理过程,也就是要开发的目标系统。其
构及人)有哪些。
蚄(2)通过确定系统的输入和输出与外部实体的关系确定系统的边界,也就是要确定哪些
功能或处理属于系统范围之内,哪些属于系统范围之外,需要由其他系统处理或人工处理。
腿3.3在对数据流图进行分解时需要注意哪些问题?
蒈在对数据流图进行分解时,需要注意以下两个问题:
袈(1)当对数据流图分层细化时必须保持信息连续性,也就是说,当把一个处理分解为一
系列处理时,分解前和分解后的输入/输出数据流必须相同。
9
蒃(2)注意分层细化时对编号的处理方法。
薃3.4银行存款业务如下:客户到银行柜台存款时,首先填写存款单(包括帐号、姓名、存款金额、存款类型),如果还没有开户,则需要先开户,填写开户单(包括姓名、身份证号、地址、电话、是否留密码)。填写完存款单或开户单后,交给营业员,营业员将存款单或开户单信息输入计算机,系统记录开户信息或存款单信息,如果是开户并选择留密码,则需要客户输入密码。最后印出开户单或存款单给用户。请画出银行存款业务的分层数据流图(至少画出两层)。
衿(1)识别外部实体及输入输出数据流
芆外部实体:储户、业务员。
薆输入数据流:存款单,开户单,密码。可以将存款单和开户单抽象为事务。
羈
芅(3)一层数据流图
蚃对银行储蓄系统进行分解,从大的方面分解为接收事务、处理开户、处理存款三部分,得到一层数据流图。
10
蚁
蒆(4) 二层数据流图
螃
螈处理存款的数据流图
膇 |
|
11
袂处理开户的数据流图
袃3.5按照以下描述,画出ER图。
膈一本教材由许多章组成,每一章包含许多节、小结和习题组成,章和节都具有标题和序号
蚅ER 图如下:属性。
袅
薇序号 | 膂标题 | 节序号 | 薈标题 |
羅
膅 | 羃 | 莇 | 肃 |
蕿教材 | 蚄章 | 羀节 |
节
罿 | 螅 | 12 |
|
莃小结 |
| ||
膇习题 |
蚇
羄
莂
莀
膅
螃
蒂
螁 袆 | |
螆第4章结构化设计方法
薂4.1当你“编写”程序时你设计软件吗?软件设计和编码有什么不同吗?
袇在“编写”程序时并没有设计软件。软件设计包括概要设计和详细设计,编码是将详细
设计中的过程描述转换成用程序设计语言来描述。
薈4.4是否存在一种情况:复杂问题需要较少的工作去解决?这样的情况对模块化观点有什
么影响?
13
薄通过对复杂的问题进行合理分解,分解为若干个相对简单及的子问题,就可以用较少的工作去解决。这种情况能够较好地支持模块化的观点,每个子问题用单独的模块去解决,模块之间应该是高内聚、低耦合的,这样才能减少工作量,否则,虽然每个模块的工作简单了,但模块之间的联系很复杂,也增加了问题解决的难度和工作量。
蚂4.8用面向数据流的方法设计第3章习题3.4所描述的银行存款业务的软件结构,并使用改进方法对模块结构进行精化。
芈(1)对第3章习题3.4给出的数据流图进行精化,确定其边界,如下图所示。
肆
芃 |
|
螂
虿(2)对上图按事务型数据流进行处理,完成第一级分解,得到顶层和一层模块结构图。
14
螈
肂
袁存款业务
袁
膇
肀输入数据 | 膆调度 | 膅输出数据 |
羈
袄
羁第一级分解后的结构图
薈(3)完成第二级分解。对上图所示的“输入数据”、“输出数据”和“调度”模块进
莆
蚃输入数据
肈
肁输入事务 罿输入密码
蚆
膁
蒀未经精化的输入结构
15
薅
芇
蒅输出数据
芃
芁打印存款单 袀打印开户单
莁
羇
螅
羂未经精化的输出结构
蒇处理存款 肅处理开户
薀
蒀记录存款信息 | 蝿记录开户信 | 袅记录密码 |
膀
息
薇
薃
蚀未经精化的事务结构
16
薁将上面的三部分合在一起,得到初始的软件结构,如下图所示。
肅
薆存款业务
袀
螀
蚈输入数据 | 螇调度 | 莅输出数据 |
羅
袀输入事务 | 聿输入密码 | 羀处理存款 | 葿处理开户 | 蒈打印存款单 | 膄打印开户单 |
肀
羆记录存款信息袂记录开户信肀记录密码
息
袂 螃
羅
膄
薄初始软件结构图
艿(4)对软件结构进行精化。
艿1)由于调度模块下只有两种事务,因此,可以将调度模块合并到上级模块中,如图所示。
薅
肂存款业务
17
节
荿输入数据 | 膁处理存款 | 螀处理开户 | 羆输出数据 |
薈
虿
羄
莁
薁将调度模块合并到上级模块后的软件结构
莅 羁 | 虿2) “记录密码”模块的作用范围不在其控制范围之内(即“输入密码”模块不在“记 | |||
蝿输入事务 | 芃处理存款 | 袈处理开户 | 薁输出数据 | |
肈
螆
蚅 | 羈记录存款信 | 芄记录开户信 | 蚁记录密码 | 袈打印存款单 | 袃打印开户单 |
息 | 息 | 腿输入密码 | |||
蒃 |
蚀
膈 | 3) 提高模块性,对模块结构进行调整,如下图所示。 |
|
18
肆
袀存款业务
螂
葿
膈输入事务聿 | 薃处理存款 | 莄处理开户 |
蒇
蒈
芀记录存款信 | 蒁打印存款单 | 莈记录开户信 | 羄记录密码 | 芈打印开户单 |
息 | 息 |
莅
薂输入密码
蒄
袈 薇 螆 | |
羂调整后的模块结构图
袁4.9将大的软件划分成模块有什么好处?是不是模块划分得越小越好?划分模块的依据是
什么?
蕿将大的软件划分成命名且可访问的模块,不同的模块通常具有不同的功能或职
责。这种方法有利于将复杂的问题简单化,是分而治之策略的具体表现。
袄尽管模块分解可以简化要解决的问题,但模块分解并不是越小越好。当模块数目增加时,
每个模块的规模将减小,开发单个模块的成本确实减少了;但是,随着模块数目增加,模块
之间关系的复杂程度也会增加,设计模块间接口所需要的工作量也将增加。
19
蚅划分模块的依据是,模块只具有单一的功能且与其他模块没有太多的联系。
薁4.11结构化程序设计禁止使用goto语句吗?如果程序中使用了goto语句,是否就可以断
定它是非结构化的?
虿结构化程序设计并不禁止使用goto语句。如果程序中使用了goto语句,并不能断定
它是非结构化的。
莅4.12对于给定的算法,如何判断它是否是结构化的?
肃 对于给定的算法,如果符合以下三条原则,就可以判断它是结构化的。
(2) 选用的控制结构只准许有一个入口和一个出口。
莀(1) 使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。
螈4.13 对于图4-49所示的流程图,试分别用N-S图和PAD 表示之。
螆
莃
START
蚅 | 肈 | 羁 | 螅 | 羈END |
袈 | ||||
P | ||||
膇A | T | F |
芃B蒂
蚀 | 薈 | 膂 | 羅 |
|
T | Q | |||
F | ||||
|
20
膈
肆
膄
螂图4-49流程图
膈
蒆对应的N-S图如下: 对应的PAD如下:
薂
蒁
螇 |
蒇
螇4.14图4-50所示的流程图完成的功能是使用二分查找方法在table数组中找出值为item莅
的数是否存在。
蒄
螅(1)判断此算法是否是结构化的,说明理由。
肂
薇
袃(2)若算法是非结构化的,设计一个等价的结构化算法,并用N-S图表示。
螆
蒁
袇
21
膅
薅
膀
芁
薆
羃
芃
莁 羇 | |
薅
聿i=(start+finish)/2
蚆
肈
羁 | 艿table(i)=item | T |
蚅F
莈
蒆
蚈 | 螀start=i+1 | T | 22 | 莆table(I)<item |
|
羂F | |||||
螆 | 芆table(i)>item | ||||
| |||||
蒃T | |||||
肃finish=i-1 |
莂
膀
莇
袅
螃
薈
膆
羅 膄 | |
芀
腿
羅
芁
肂
羈 |
|
23
肅
蚂
葿
螇
膅
肂
膁
薅图4-50 二分查找算法的流程图
蒃(2)等价的结构化算法如下:
虿
莇I=(START+FINISH)/2
袈薈(FINISH-START)>1&& TABLE(I)!=ITEM
莅I=(START+FINISH)/2
蚄 | 蒅T | 蚀TABLE(I)<ITEM | 肁F | ||
蝿START=I+1 | 肆FINISH=I-1 | ||||
| |||||
腿T | 薄 | 薄F | |||
袃FLAG=1 | 罿FLAG=0 | ||||
羀
蒇
莃
蒀
膇
袄或者
膁
薄羆
聿薇I=(START+FINISH)/2
薆TABLE(I)==ITEM
芈羈T 肄F
羃FLAG=1 螀TABLE(I)<ITEM
蚈
芃 | 衿T | 荿T | 袇FINISH=I-1 | F |
聿 | 螂TABLE(START)==ITEM || TABLE(FINISH) ==ITEM | |||
螀F | ||||
虿
芄FLAG=1 螅
膆
肂 腿 |
|
25
肀
袇
膄
艿
膆
芅
袃
荿
薇
羇 蚂 |
|
肈 | |
螂
膇葿(FINISH-START)>=0&& FLAG==0
蒄
袀袂I=(START+FINISH)/2
蚅
羂 | 羂T | 羇TABLE(I)==ITEM | 芃F |
莇
肂 | 螁FLAG=1 | 薀T | 肄TABLE(I)<ITEM | F |
袈 |
26
蒄 羈 |
|
袅
蚀
芈4.15使用自顶向下、逐步细化方法设计算法,完成下列任务:产生一个10?10的二维随
机整数方阵,先求出每一行的最大值和每一列的最小值;然后求10个最大值中的最小者,
10个最小值中的最大者;最后求这两个数之差的平方。
肈(1)首先写出下面的程序框架:
肂main(){
定义10?10的二维整数数组A,长度为10的一维数组B,C;
蒂建立10?10的二维随机整数数组A;-- - - - - -- -- - - - - - - - - - - - 1
求A 中每一行的最大值?数组B;- - - - - - - - -- - - - - - - - - - - - 2
肀
蒃求数组C中的最大值?maxOfC; -- - - - - - - -- - - - - - - - - - - - 5
袀(minOfB-maxOfC)^2 ?result;
}
(2) 对后面加标记的部分进行细化
芇main () {
定义10?10 的二维整数数组A,长度为10 的一维数组B, C;
袄/*建立10?10 的二维随机整数数组A*/ - - - - - -- -- - - - - - - - - - - - 1
薂for (i=0; i<=9; i++)
衿for (j=0; j<=9; j++) 芇产生随机整数? A[i,j]; 27
/*求A中每一行的最大值?数组B*/- - - - - - - - -- - - - - - - - - - - - 2
芅for(i=0; i<=9; i++) {
肀求数组A第i行的最大值?B[i];--------------------------------------2.1
蚈}
莇/*求A中每一列的最小值?数组C*/- - - - - - - - -- - - - - - - - - - - - 3
蚆for(j=0; j<=9; j++) {
螂求数组A第j列的最小值?C[j];--------------------------------------3.1
蚁}
蒇/*求数组B中的最小值?minOfB*/ - - - - - - - - -- - - - - - - - - - - - 4
螃minOfB= B[0];
蒀 if (minOfB < B[i]) { 蒃for(i=1; i<=9; i++) {
羁}
芈/*求数组C中的最大值?maxOfC*/ - - - - - - - - -- - - - - - - - - - - - 5
蚇maxOfC= C[0];
薄for( i=1; i<=9; i++) {
蚃 if(maxOfC>C[i]) {
羇 maxOfC= C[i];
螇 }
羅} 28
肁(minOfB-maxOfC)^2 ?result;
肀 }
(3)下一步可以继续对2.1和3.1进行细化。具体略。
螇4.16设计算法完成下列任务:输入一段英文后,无论输入的文字都是大写,还是小写,或大小写任意混合,都能将其整理成除每个句子开头字母是大写外,其他都是小写的文字。
膂假设在输入的文字中,两个单词间只允许是空格、,、.、?、!,则在输出的文字中,大写的情况有以下几种:
(1)
(2)袃整段文字的第一个字母是大写;
(3)
(4)蝿“.”后的第一个字母是大写;
(6)袆“?”后的第一个字母是大写;(5)
芁设变量a存储输入的字符串,变量b存储结果字符串,变量c存储当前处理的字符,变量e存储c之前的字符(当c为第一个字符时除外)。算法如下:
薈
羆输入字符串a, n = strlen(a)
莆 蚀如果a的第一个字符是字母,则转成大写。
蝿b[0]=a[0]
蚃
莇for( i=1; i<n; i++)
肂 | 螂 c = a[i], e=a[i-1] | c 是字母 | F |
|
罿 | 肁 |
| ||
膆T |
29
肆 | T | e 属于?.?!? | F |
袂 |
肈
蚆
膂
莀
薆第5章编码
蒅5.1有人说程序编好后能上机运行就可以了,为什么还要讲究风格和可读性呢?你觉得对
吗?为什么?
芁 对于学生的练习题和作业题,程序编好后能上机运行,一般认为任务就完成了。但对
读程序的时间比写程序的时间还要多。所以,程序的风格和可读性很重要,具有良好的程序
风格和可读性的程序,有助于对程序的正确理解,可以大大减少阅读理解程序的时间,从而
提高维护工作的效率。
螁5.2一般情况下,程序的效率和清晰性相比哪一个更重要?
芈在计算机发展的早期,由于CPU效率低,内存小,程序在运行时容易出现运行时间太长或内存溢出问题。因此,人们在编写程序时,很注重程序的时间效率和空间效率,而不太注重程序的清晰性。
膄随着计算机硬件性能的飞速发展以及软件规模和复杂性的急剧增加,这种情况已经发生了根本的转变,程序的清晰性越来越受到重视,程序的清晰性不好会给测试、维护修改带来困难,这对于规模庞大和复杂的软件尤其明显。
30
莁软件运行的效率主要取决于软件的体系结构及算法,编码阶段虽然也有机会提高效率,但效果并不明显。对于效率没有特殊严格要求的系统来说,要将程序的清晰性放在第一位,在不影响清晰性的情况下,去改进效率。
膂5.6在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确。许多程序设计语言允许在一行内写多个语句。但这种方式会使程序可读性变差。下面是一段排序程序,请对其编码风格进行改进,以增加其可读性。
蚆for(i=1; i<=n-1; i++) for (j=1; j<=n-i; j++) if (a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;}
芇改进后的代码如下:
莁for(i=1; i<=n-1; i++)
荿for (j=1; j<=n-i; j++)
虿temp=a[j];
羇a[j]=a[j+1];
莈a[j+1]=temp;
羃}
螀5.7请对下面代码的布局进行改进,使其符合规范其更容易理解。
荿for (i=1; i<=n-1; i++){
31
螆t=i;
螂for(j=i+1; j<=n; j++)
袀if(a[j]<a[t]) t=j;
螀 if(t!=i) {
蒈temp=a[t];
螅a[t]=a[i];
罿a[i]=temp
袇}
羆}
薄改进后的代码如下:
蚈t=i;
芃for(j=i+1; j<=n; j++)
莃 {
虿if(a[j]<a[t])
膆t=j;
莆 | 蒃 if (t!=i) | } |
|
肀{ |
|
32
袈temp=a[t];
膅a[t]=a[i];
薃a[i]=temp
蒁}
芅}
袃
蚃5.8使用你熟悉的语言编写出习题4.15的程序,注意编码风格。
薇下面为使用C语言编写的习题4.15的程序:
羇#include"math.h"
蚂#include "stdio.h"
蒅/*求10?10 的二维数组a的每一行的最大值存入一维数组b,每一列的最小值存入一
维数组c,minOfB存储数组b的最小值,maxOfC存储数组c的最大值,result存储minOfB
与maxOfC之差的平方。*/
蚅intmain()
螃{
荿 | int a[10][10], b[10],c[10]; |
|
膇 | int i,j,minOfB, maxOfC, result; | |
蒄 | /*产生随机数种子 */ | |
袂 | ||
srand((unsigned int)time(NULL)); | ||
袀 | /*建立10 ?10 的二维随机整数数组a*/ |
|
33
蚅 for(i=0;i<=9;i++)
芃 for(j=0; j<=9; j++)
羂 a[i][j]=rand()%100+1;//产生1-100之间的随机数
羇 /*求a中每一行的最大值?数组b*/
莇 for(i=0; i<=9; i++)
螈 { /*求数组a第i行的最大值?b[i]*/
螈 b[i]=a[i][0];
肄 for(j=1; j<=9; j++)
薁 if(a[i][j]>b[i]) b[i] = a[i][j];
螁 }
袈 /*求a中每一列的最小值?数组c*/
for (j=0; j<=9; j++)
羈 for(i=1; i<=9; i++)
袅 if(a[i][j]<c[j]) c[j] = a[i][j];
蚀 }
芈 /*求数组b中的最小值?minOfB*/
肈 minOfB= b[0];
芆 for(i=1; i<=9; i++)
蒂 if(minOfB > b[i]) minOfB = b[i];
莁 /*求数组c中的最大值?maxOfC*/
34
膈 maxOfC= c[0];
蒃 for(i=1; i<=9; i++)
膄 if(maxOfC<c[i]) maxOfC = c[i];
肀 result= pow(minOfB- maxOfC, 2);
膈 printf("结果是:%d",result);
袄 return(result);
薂}
衿5.9使用你熟悉的语言编写出习题4.16的程序,注意编码风格。
芇
芅下面为使用C语言编写的习题4.16的程序:
莄#include"stdio.h"
蚈#include "string.h"
个句子开头字母是大写、其他都是小写的字符串存储在变量b中。变量c存储当前处理的字
符,变量e存储c之前字符。*/
螂voidmain()
蚁{ | char a[1000], b[1000], c,e; |
|
蒇 | int i,n; | |
螃 | ||
gets(a); | ||
蒄 | ||
n=strlen(a); | ||
蒀 | ||
//将整段的第一个字母转成大写。 | ||
薇 | if(isalpha(a[0])) |
35
膄 { a[0]=toupper(a[0]);
羁 b[0]=a[0];
艿 }
蚇 //处理第一个字符之后的每个字符,将.?!后面的字母改为大写,其他改为小写。
薄 for(i=1; i<n; i++)
蚃 { c=a[i];
芁 e=a[i-1];
螇 if(isalpha(c))
蚁 { if(strchr(".?!",e))
袇 c=toupper(c);
螆 else
c=tolower(c);
薅 }
蚂 b[n]='\0';
艿 puts(b);
肇}
芄
螂
蚀
蝿
36
莇
螂
肁第6章软件测试方法
膇6.5假设汽车的车牌号可由车主人在规定范围内自选,若其规定为:
肆(1)车牌上应有7个字符;
袂(2)为首的字符限定为汉字“京”;
蒂(3)第2个字符可任选一字母(A~Z);
衿(4) 第3~7个字符可选任意数字。
羂等价类表
袃输入数据 | 莆有效等价类 | 袈无效等价类 |
肂字符个数 | 罿 7 个(1) | 肈0~6 个(2),>7 个(3) |
蚆首字符 | 膂“京”(4) | 膆非“京”(5) |
薆第2 个字符 | 膁字母(6) |
|
|
|
|
37
薇第3~7 个字符 | 羄数字(8) | 羀非数字(9) |
肇测试用例如下:
羈1)京H87774 }(1),(4),(6),(8)
蚆2)京H8777 }(2)
羃3)京H877745 }(3)
膇4)冀H87774 }(5)
肅5)京987774 }(7)
膄6)京BA7774 }(9)
芇?测试与?测试都是集成测试之后所进行的测试,都属于系统测试。所不同的是,?测
试是在开发环境中所做的测试,主要由开发方人员进行。而?测试则是在用户实际工作环境
中所做的测试,不受开发人员的干预。
蒆
袆
薁
薁
袇
莃补充题:设计下列伪码程序的语句覆盖和路径覆盖测试用例:
38
薄START
蚇INPUT(A,B,C) 蚁INPUT(A,B,C)
肁 袁
芇
Y N
膁IFA>5 A>5
肅 莂X=1
X=10
莈 THENX=10
螅 膅
螁
Y N
袆 ELSEX=1 B>10
Y=20 蒃Y=2
蕿IF B>10 C>15
袁Z=30 芆Z=3
膇 THENY=20
羀PRINT(X,Y,Z)
袆 ELSEY=2
袁ENDIF
芁IF C>15 |
|
39
羆 THENZ=30
羆 ELSEZ=3
节ENDIF
螈PRINT(X,Y,Z)
羈STOP
蚂设输入数据为<A,B,C>,输出数据为<X,Y,Z>。
蒀语句覆盖测试用例:【<6,12,20>,<10,20,30>】,【<4,8,10>,<1,2,3>】
螇路径覆盖测试用例:
膆【<6,12,20>,<10,20,30>】
肃【<6,12,10>,<10,20,3>】
40
袈【<6,8,20>,<10,2,30>】
蒆【<6,8,10>,<10,2,3>】
芆【<4,12,20>,<1,20,30>】
蒄【<4,12,10>,<1,20,3>】
蚀【<4,8,20>,<1,2,30>】
莅 | |
蚁第7章统一建模语言UML概述
莂7.2UML中有哪些关系?解释类图中聚合和关联的相同点和不同点。
芈在UML中,常见的关系有泛化、聚合、关联、依赖和实现。
蒅在类图中,关联是一种结构关系,它描述了两个或多个类的实例之间的连接关系。聚
合描述了整体和部分之间的结构关系。按照关联关系的定义,聚合属于一种特殊的关联关系,
只不过这种关联关系具有明确的整体-部分含义而已。从耦合度的角度看,聚合关系要强于
关联关系。
41
肂7.4讨论顺序图与协作图的关系,何时用顺序图建模优于协作图建模,以及相反的情况。
螀顺序图和协作图都能描述对象间的交互关系,但两者的侧重点不同,顺序图着重表现交互的时间顺序,协作图则着重表现交互对象的静态链接关系。但即使他们各有侧重,但从语义上来说是等价的,可从一种图自动转换为另一种图。
肇一般情况下,当需要强调消息传递的时间顺序时,采用顺序图;当表示涉及很多对象的模型时,协作图比顺序图更形象。顺序图在分析中更常用,而协作图则在设计中更常用。
蒅7.5考虑银行系统中的帐户会有哪几种状态,画出帐户对象的状态图。
蒃账户的状态包括开户、正常使用、透支、休眠、冻结和注销。账户对象的状态图如下图所示。
薂
袆第8章面向对象分析
莁8.1比较面向对象的分析方法和面向数据流的分析方法,阐述它们各自的特点。
薀面向对象的分析方法使用用例模型来表示用户的功能需求,用例模型相当于功能模型,
在对用例模型进行细化的过程中,也伴随着对功能的分解。但面向对象的分析方法并不是以
功能分解为核心,在获取并分析用户的功能需求之后,重点以类和对象为核心,建立对象模型,交互模型也是围绕对象模型进行的。面向数据流的分析方法是从建立顶层数据流图(环
42
境图)开始,之后逐层对加工进行分解。面向数据流的分析方法是以功能分解为核心的。
蚅8.2面向对象分析需要建立的三个模型是什么?
蚅面向对象分析需要建立的3个模型是:由用例和场景表示的功能模型(用例模型);用
类和对象表示的静态模型(对象模型);由状态图和顺序图表示的动态模型(交互模型)。
莁8.3用例建模的主要步骤是什么?
蚆 用例建模的主要步骤如下:
(1)
(2) 蒇确定业务参与者──可以是与系统有交互的外部硬件、软件、组织、人等。
(3)
袅 | (4) | 莃确定业务需求用例──参与者需要系统提供的完整功能。 |
(5) | 蒁创建用例图──标识参与者与用例之间、用例与用例之间的关系。 | |
| ||
膂《包含》表示一个用例所执行的功能中总是包括被包含用例的功能;《扩展》是指一个
用例的执行可能需要由其他用例的功能来扩展,《扩展》联系可用于对期望或可选的行为建
模,但其主要用途是使基本用例的功能不依赖于扩展用例。
薁8.6对于复杂的系统,其对象模型应该由哪五个层次组成?
蒈对于复杂的系统,对象模型应该由下述5个层次组成:主题层(也称为范畴层)、类-
对象层、结构层、属性层和服务层,如图所示。
薇
膅
43
蚁对象模型的五个层次
罿8.7解释关联类的作用,在什么时候需要使用关联类?
肅关联类的作用是描述关联的属性。
羄在关联关系比较简单的情况下,关联关系的语义用关联关系的名字来概括。但在某些情
况下,需要对关联关系的语义做详细的定义、存储和访问,为此可以建立关联类(association
class)。
螀8.8按照以下描述,画出UML类图:
号属性。
莀一本教材由许多章组成,每一章包含许多节、小结和习题组成,章和节都具有标题和序
螃
袀8.9考虑一个计算机超市,出售硬件、外设和软件。分析谁是这个系统的参与者?这个系
统有哪些主要用例?画出用例图。
蒇系统的参与者:系统管理员(administrator),售货员(salesperson),客户(customer)。
芅主要用例
44
蒂编号 | 羀参与者 | 袈用例 | 羇说明 |
薅1 | 羀 administrator | 艿Maintain product information(维护商品信息) | 莄增加、修改、删除商品信息(商品编号、 名称、型号、价格) |
芄2 | 莅Maintain membership information(维护会员信息) | 袂增加、修改、删除会员信息(会员编号、 姓名、身份证号、办卡日期) | |
螈3 | 袆salesperson w | 螆Scan membership card(扫描会员卡) | 芀在商品出售之前,系统通过扫描仪刷卡 (会员卡)来确认顾客的会员身份 |
袁4 | 羃Scan product code(扫描商品的 淘豆 | 羂通过扫描商品的条形码,自动识别商品 网 | |
w | .taod | ocs.co | |
荿6 | 膅salesperson,customer | 螅Accept payment(接收现金付款) 膂Charge payment to card(使用银 行卡付款) | 膈 |
芅7 | 膆salesperson | 袄Print receipt(打印收据) | 膁 |
莅
芃用例图如下:
45
莂
蒅 | 羀 |
|
| ||
蚄第10章面向对象设计
肃
螈10.1软件模块之间的依赖性可以从哪些角度和抽象层次进行分析?
在面向对象软件中,常见的软件模块有类、接口、包、构件。因此,分析软件模块之间
的依赖性就可以从类、接口、包和构件的角度和层次进行分析。
10.2消除包之间循环依赖性的方法是什么?
本质上,两个包之间的依赖性来自于两个包中类之间的依赖性。类之间的循环依赖性是
个特别棘手的问题,好在大多数情况下可以通过重新设计避免循环依赖性。具体方法是增加
新包。举例说明如下:
在下图中,包A 依赖于包B,反过来包B 又依赖包A,构成了循环依赖。具体解决办法是:将包B 依赖的包A 中的元素从包A 中分离出来,组成包C,使得包B 不再依赖包
46
A,而是依赖包C。
|
|
|
10.3请给出构件的一般性定义,然后给出传统的软件工程环境及面向对象的软件工程环境
中构件的定义,最后选择你熟悉的编程语言说明怎样定义一个构件。
软件构件是一种组装单元,它具有规范的接口规格说明和显式的语境依赖。软件构件可
以被部署,并由第三方任意组装。OMGUML规范中将构件定义为“系统中某一定型
化的、可配置的和可替换的部件,该部件封装了实现并暴露一系列接口”。
在传统的软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑和实现
处理逻辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。传统的
构件也称为模块,是软件体系结构的一部分。
在面向对象的软件工程环境中,面向对象技术已达到了类级复用,而构件级复用则是比
类级复用更高一级的复用,它是对一组类的组合进行封装(当然,在某些情况下,一个构件
接口。
如一个文本文件、一个图片、一个数据文件、一个脚本等。一个构件可以是一个编译的类,也可以是其他的部署单元,可能只包含一个单独的类),并代表完成一个或多个功能的特定服务,也为用户提供了多个
典型的面向对象设计模型在逻辑上将系统划分为4个部分,分别是问题域部分、人机交
互部分、任务管理部分及数据管理部分。
1) 问题域部分的设计
在面向对象设计过程中,可能要对面向对象分析所得出的问题域模型进行补充或调整。
例如,调整需求、复用已有的类、把问题域类组合在一起、增添泛化类以建立类间的协议、
调整继承的支持级别、改进性能等。
2) 人机交互部分的设计
人机交互界面的设计质量直接影响到用户对软件的使用。在设计阶段,必须根据需求把
交互细节加入到用户界面设计中,包括人机交互所必需的实际显示和输入。
3) 任务管理部分的设计
任务管理主要包括任务的选择和调整。常见的任务有事件驱动型任务、时钟驱动型任务、
优先任务、关键任务和协调任务等。
设计任务管理子系统时,需要确定各类任务,并将任务分配给适当的硬件或软件去执行。
47
4) 数据管理的设计
在采用面向对象方法进行软件开发时,数据的存储还是普遍使用关系数据库。在面向对象设计中,可以将UML类图看作是数据库的概念模型,一个类可以映射为一个表或多个表,此外,还要考虑类之间的关联关系、继承关系的映射。
10.5用面向对象方法设计网上购书系统的软件结构,网上购书系统的业务如下:
某书店为方便客户通过Internet购买相关图书,开发一个“网上购书系统”,客户可以通过Web页面注册并登录“网上购书系统”,通过Web页面查看、选择图书,系统根据用户选择的图书单价、数量,系统自动生成订单,并计算总价格。
客户在提交订单之前,必须填写关于寄送地址和及付款方式等细节,一旦订单被提交,系统显示确认信息,并附上订单的详细信息。客户可以在线查询订单的状态。
系统管理人员查看客户的订单,验证客户的信用和付款方式,向仓库请求所购图书,打印并发货。
本系统从逻辑结构上分为三层,Web页面层,业务逻辑层和数据库层。Web页面层负责接收用户的请求,业务逻辑层在获知用户请求后,执行相应的业务逻辑,向数据库层发出数据请求,获得所需要的数据后,通知Web页面层将数据呈现给用户。
从业务的角度,又可以将系统划分为订购管理、客户信息管理和系统管理三个子系统
(包)。系统的软件结构如图所示。
10.6对10.5中的网上购书系统设计其问题域的类图。
问题域类包括客户、信用信息、订单、图书、及发货单。类图如下所示:
48
49
以下无正文
仅供个人用于学习、研究;不得用于商业用途。
Forpersonal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。
Nurfür den pers?nlichen für Studien, Forschung, zu kommerziellenZwecken verwendet werden.
Pourl 'étude et la recherche uniquement à des fins personnelles; pas àdes fins commerciales.
только для людей, которые используются для обучения, исследований и не должны использоваться |
Forpersonal use only in study and
research;not for commercial use
50
Copyright © 2019- zhuinvhai.com 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务