您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页软件工程概论简答题【精选文档】

软件工程概论简答题【精选文档】

来源:爱go旅游网
一、概述

1.软件工程过程有哪几个基本过程活动?试说明之。 解答:软件工程过程的基本过程活动有4步:

· D (Do) : 软件开发。产生满足规格说明的软件; · C (Check) : 软件确认。确认软件能够完成客户提出的要求;

· A (Action) : 软件演进.为满足客户的变更要求,软件必须在使用的过程中演进.

2.试说明“软件生存期\"的概念。

衰亡的生存过程.这就是软件的生存期。它分为6个阶段:(1) 软件项目计划 :在这一步要确定软件工作范围,进行软件风险分析,预计软件开发所需要的资源,建立成本与进度的估算.根据有关成本与进度的分析项目的可行性。

(2) 软件需求分析和定义 :在这一步详细定义分配给软件一种是正式的信息域分析,可用于建立信息流和信息结构的模型,然后逐渐扩充这些模型成为软件的规格说明。另一种是软件原型化方法,即建立软件原型,并由用户进行评价,从而确定软件需求。 (3) 软件设计 :软件的设计过程分两步走。第一步进行概要设计,以结构设计和数据设计开始,建立程序的模块结构,定义接口并建立数据结构。第二步做详细设计,考虑设计每一个模块部件的过程描述。经过评审后,把每一个加细的过程性描述加到设计规格说明中去。

(4) 程序编码 :在设计完成之后,用一种适当的程序设计语言或CASE工具生成源程序。应当就风格及清晰性对代码进行评审,而且反过来应能直接追溯到详细设计描述。

(5) 软件测试 :单元测试检查每一单独的模块部件的功能和性能。组装测试提供了构造软件模块结构的手段,同时测试其功能和接口。确认测试检查所有的需求是否都得到满足。在每一个测试步骤之后,要进行调试,以诊断和纠正软件的故障。

(6) 软件维护 :为改正错误,适应环境变化及功能增强

而进行的一系列修改活动.与软件维护相关联的那些任务依赖于所要实施的维护的类型.

3.试论述瀑布模型软件开发方法的基本过程,比较它的优点和缺点。

解答:瀑布模型规定了各项软件工程活动,包括:制定软件项目计并且规定了它们自上而下,相互衔接的固定次序,如同瀑布流水,逐级下落。

瀑布模型为软件开发和软件维护提供了一种有效的管理图式。根据这一图式制定开发计划、进行成本预算、组织开发力量,以项目的阶段评审和文档控制为手段有效地对整个开发过程进行指导,从而保证了软件产品及时交付,并达到预期的质量要求。

瀑布模型的缺点是缺乏灵活性,特别无法解决软件需求本身不明确或不准确的问题.这些问题的存在对软件开发会带来严重影响,最终可能导致开发出的软件并不是用户真正需要的软件,并且这一点在

1

开发过程完成后才有所察觉.面对这些情况,无疑需要进行返工或是不得不在维护中纠正需求的偏差.但无论上述哪一种情况都必须付出高额的代价,并将为软件开发带来不必要的损失。 点。

解答:由于在项目开发的初始阶段人们对软件的需求认识常常不够清晰,因而使得开发项目难于做到一次开发成功,出现返工再开发在所难免。因此,可以先做试验开发,其目标只是在于探索可行性,弄清软件需求;然后在此基础上获得较为满意的软件产品.通常把第一次得到的试验性产品称为“原型\"。

发软件系统的总目标,定义需求,确定软件的工作范围。然后快速设计软件中对使用者可见部分的表示,进而建造原型,再让用户或客户评估原型,根据评估结果,修改和细化待开发软件系统的需求,使之满足用户的需求.这个过程是一个迭代的过程。 演化模型的优点是:

需求,而且开发人员与用户可通过原型充分进行交流; · 演化模型给用户提供了机会,以更改用户原来设想的不尽合理的最终系统; · 演化模型使得开发出来的最终系统更容易维护,对用户更友好;

· 演化模型可以降低总的开发费用,缩短开发时间。 演化模型的缺点是:

· 对于开发人员不熟悉的领域,演化模型可能误导开发者把系统的次要部分当作主要框架,作出不切题的原型;

· 原型过快地收敛于需求集合,使得某些基本方面被忽视;

· 长期在原型环境下开发,只注意得到令人满意的原型,容易“遗忘”用户环境与实际客户环境之间的差别。

5、软件工程包括哪些基本要素?请简要说明这些要素及其作用.

答案要点: 软件工程包括过程、方法和工具三个要素. 软件工程过程定义了技术方法的采用、工程产品(包括模型、文档、数据、报告、表格等)的产生、里程碑的建立、质量的保证和变更的管理,从而将人员、技术、组织与管理有机地结合在一起,实现在规定的时间和预算内开发高质量软件的目标;

。软件工程方法为软件开发提供了“如何做”的技术,通常包括某种语言或图形的模型表示方法、良好的设计实践以及质量保证标准等;

。 软件工程工具为软件工程方法提供了自动的或半自动的软件支分析、系统建模、代码生成、程序调试和软件测试等多个方面,形成了集成化的软件工程开发环境 CASE。

6。 软件与其他工程学科所产生的制品有什么根本区别? 答案要点:

(1) 软件是人类思维和智能所延伸的产物,其数据、状态和逻辑关系的组合以及人类思维的复杂性和不确定性导致它本身具有极高的复杂性;

(2) 软件具有不可见性,它是抽象的,形式化和逻辑化的. (3) 软件具有可变性,有用的软件需要不断地修改和扩展,但是

· P (Plan) : 软件规格说明。规定软件的功能及其运行的; 4.试说明演化模型软件开发方法的基本过程,比较它的优点和缺

解答:软件与任何一个事物一样,有它的孕育、诞生、成长、成熟、 演化模型从需求分析开始。软件开发人员与用户一起定义待开

的系统元素。可以用以下两种方式中的一种对需求进行分析和定义。 · 演化模型能够得到更好的软件需求,它不仅能够处理模糊的

划,进行需求分析和定义,软件设计,程序编码,测试及运行维护。撑环境,辅助软件开发任务的完成。现有的软件工具覆盖了从需求

频繁的修改可能导致软件的退化;

(4) 软件的开发在很大程度上依然是手工作坊式的,难以实现工厂化的生产。

请说明你对“高质量软件”含义的理解。

软件质量是软件产品与明确的和隐含的需求相一致的程度,它可用性、复用性、可维护性、可移植性等。例如,除了要求软件正确运行之外,人们可能还希望软件运行的响应时间符合要求、软件使用方便快捷、程序代码易于理解等,而“程序代码易于理解\"往往是一种用户没有明确提出的需求,但却是影响软件演化的重要因素。 8. 某大学准备开发一个新的学生注册选课系统,以替换一个现有的系统。请设计一个适用于该系统开发的过程模型,并进一步描述该模型。 答案要点:

假设原有的学生注册课程系统是由学生手工提交书面选课单,教师手工提交成绩单,教务管理人员在客户端录入学生选课结果和Internet 访问和操作该系统,该软件系统需要更新服务器和数据库等系统,并扩充一些新功能和提高系统性能。

从该系统的具体情况来看,系统的需求是比较容易明确的,整个系统的结构需要重新设计,但是原有的遗留系统中有些部分是可以重用的,因此我们可以采用组件模型实施软件开发:

系统需求分析:由于该系统是现有系统的扩展,因此首先可以经过一个简单的需求分析阶段,从而确定新系统的需求。

遗留系统分析:在需求确定的基础上,开发人员分析遗留系统并研究新系统的总体结构,选择重用原有的课程信息管理部分,重新开发选课部分,必要时适当修改系统需求,最终确定系统需求和总体结构。

设计开发阶段:开发人员进一步设计相关子系统,将原有的课程信息管理部分封装为子系统,重新开发学生选课子系统,并实现与外部付费系统的接口。

系统测试阶段:开发人员将所有子系统集成在一起,交给测试人员开始全面的功能测试和性能测试。根据所报告的测试问题,开发人员调试和修改程序.

系统交付阶段:测试通过后,开发人员将系统及其相关文档交付用户验收。 四、需求分析 四、问答题

1、 在软件需求分析时,首先建立当前系统的物理模型,再根据物理

模型建立当前系统的逻辑模型。试问:什么是当前系统?当前系统的物理模型与逻辑模型有什么差别?

解答:所谓当前系统可能是需要改进的某个已在计算机上运行的数据处理系统,也可能是一个人工的数据处理过程。当前系统的物理模型客观地反映当前系统实际的工作情况.但在物理模型中有许多物理的因素,随着分析工作的深入,有些非本质的物理因素就成为不必要的负担,因而需要对物理模型进行分析,区分出本质的和非本质的因素,去掉那些非本质的因素即可获得反映系统本质的逻辑模型。所以当前系统的逻辑模型是从当前系统的物理模型抽象出来的。

2

2、 可行性研究主要研究哪些问题?试说明之。

解答:可行性研究主要做4个方面的研究:经济可行性 :进行成本∕效益分析。从经济角度判断系统开发是否“合算\"。技术可行性 :进杂性等出发,判断系统开发在时间、费用等条件下成功的可能性。法律可行性 :确定系统开发可能导致的任何侵权、妨碍和责任。出结论意见。

3、 数据流图的作用是什么?它有哪些基本成份 数据流图的基本成份有4种:

4、Petri网可以描述计算机软件系统的执行。现有一个程序如下(类似于Pascal语言) L : S1;

WHILE P1 DO BEGIN

IF P2 THEN S2

ELSE S3;

COBEGIN S4; S5; S6; COEND END;

7。 软件工程是以系统的、可控的、有效的方式产生高质量的软件,行技术风险评价。从开发者的技术实力、以往工作基础、问题的复

通常由一系列的质量特性来进行描述,包括正确性、可靠性、有效性、方案的选择 :评价系统或产品开发的几个可能的候选方案。最后给

课程成绩;而在新的选课系统中,所有用户在自己的计算机上通过

GOTO L;

其中,P1和P2为逻辑表达式,S1,S6是单个执行语句,COBEGIN和COEND是并行执行开始和并行执行结束(即S4,S5和S6语句并行执行)。试用Petri网描述这段程序的执行过程

解答:采用条件∕事件网(C∕E网,C―Condition, E―Event)式Petri网。其定义如下:

①当事件e激发时条件c开始成立,则称c是e的后继.此关系用“ ”表示;

②当事件e激发时条件c消失成立,则称c是e的前驱。此关系用“ ”表示;

③当事件e激发时条件c不受影响,则c和e之间没有前驱、后继关系,无边。

根据定义,给定程序的C∕E网如下:

5、软件需求分析说明书主要包括哪些内容?

解答:软件需求规格说明是分析任务的最终产物,通过建立完整的信息描述、详细的功能和行为描述、性能需求和设计约束的说明、合适的验收标准,给出对目标软件的各种需求。 软件需求规格说明的框架如下:

6. 需求工程包括哪些基本活动?每一项活动的主要任务是什么? 答案要点:

需求工程分为需求开发和需求管理两个部分,而需求开发又可进一步分为需求获取、需求分析、规格说明和需求验证四个阶段。这些基

本活动的主要任务包括:

(1) 需求获取:采集、识别和提取用户的需求,对问题和需求形成文档化的描述,使各种人员达成一致的理解和认可。

(2) 需求分析:分析和综合所采集的信息,建立系统的详细逻辑模型.

(3) 需求规格说明:编写软件需求规格说明书,明确、完整和准确地描述已确定的需求。

(4) 需求验证:评审软件需求规格说明,以保证其正确性、一致性、完备性、准确性和清晰性。

(5) 需求管理:定义需求基线,在整个项目过程中跟踪需求状态及其变更情况.

7. 请比较本章介绍的几种主要需求获取技术,说明每一种技术的优缺点和适用场合。答案要点: (1) 用户面谈

使被访者可以直率地和无隐瞒地回答问题;便于探查一些附加信息或反馈信息;有利于与客户建立良好的关系。

缺点:面谈是一种非常费时和高成本的方式;难以解决不同的项目干系人之间的冲突和矛盾;

在地理位置相距较远的情况下很难实施。

适用场合: 适用于在初步理解整体概念的情况下讨论和交流一些细节问题。

(2) 需求专题讨论会

优点:有助于了解系统需求;有利于共享系统开发的成果;给用户一种主人的感觉;

可以与足够多的项目干系人进行讨论和交流,且节省时间; 支持头脑风暴式的讨论.

缺点: 需要占用参与人员比较长的整块时间;主持人的能力和会议的准备工作必须是非常好的,否则结果很糟。

适用场合: 适用于讨论和审查软件系统方案和模型,解决不同项目干系人之间的冲突和矛盾。 (3) 观察用户工作流程

优点: 通过直接观察的方式提取用户或系统的特性; 有助于理解难以用语言描述清楚的复杂业务.

缺点: 观察可能使用户紧张,从而表现得与往常不同. 适用场合:适用于理解难以用语言描述清楚复杂业务过程。 (4) 原型化方法

优点: 通过一个可以运行的软件原型直观地理解和澄清问题,便于使开发人员与用户达成共识。

缺点: 用户容易产生误解,认为软件系统可以在原型的基础上很容易地构建,但实际上该原型的内部结构和程序质量比较差. 适用场合: 适用于用户需求不明确或描述不清楚的情况.

8。 哪些人应该参与需求评审?请画出一个需求评审的组织过程模型。 答案要点:

9。 在某些紧急情况下,软件可能在需求变更请求被批准之前就进行修改。请给出一个修改过程模型,确保需求文档和系统实现不会产生不一致. 答案要点:

一般来说,应该尽量避免在需求变更请求被批准之前就直接修改程序的情况,这很容易导致变更失控而且需求描述与系统实现不一致。一旦出现这种情况,必须在系统变更完成后重新执行需求跟踪控制。

五、面向对象 四、问答题

1、什么叫面向对象?面向对象方法的特点是什么?为什么要用面向对象方法开发软件

解答:关于“面向对象”,有许多不同的看法。Coad和Yourdon给出了一个定义:“面向对象 = 对象 + 类 + 继承 + 消息通信”。软件系统是面向对象的。面向对象方法的特点是:

·方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的.

·从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前一阶段成果的补充和修改。

·把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。 使用面向对象方法开发软件的好处是:

·开发方法的唯一性,开发阶段的高度连续性,表示方式的一致性;

·问题空间实体的自然表示,减轻了设计者的负担,在设计系统之初不必考虑一个很完整的解决方案。

·建立稳定的系统结构,可促进复用性,易于维护,易于修改,可合理利用共同性,减少复杂性。

2、什么是“对象”?识别对象时将潜在对象分成7类,试给出这7类对象的名称,并举例说明 解答:对象的定义: ·对象是面向对象开发模式的基本成分,是现实世界中个体或事物的抽象表示。

·每个对象可由一组属性和它可以执行的一组操作来定义. 可能的潜在对象有7类:

① 外部实体:它们产生或接受为目标系统所使用的信息。如各种物理设备、使用人员、其它相关的子系统。

② 事物:问题的信息域所涉及的概念实体。如各种报告、显示、文字、信号、规格说明等.

③ 事件:系统运行时发生的并需要系统记忆的事件。如状态转换、物理运动等。

④ 角色:与系统有交互的各种人员所扮演的角色。如经理、工程师、销售人员等.

⑤ 场所或位置:建立系统整体环境或问题上下文的场所、位置。

优点:可以与项目相关人员一对一地进行交谈和讨论;具有私密性,如果一个软件系统是使用这样4个概念设计和实现的,则认为这个

通常情况下,参与需求评审的人员应该包括需求分析员、项目经理、如基于计算机的系统的安装场所等。

体系架构设计师、软件设计工程师、系统测试工程师、质量保证员、 ⑥ 部门等。组织,组织机构:与应用有关的组织机构。如 用户或市场代表、文档编写人员、领域专家和技术支持代表.

3

⑦ 结构:定义由一组成分对象组成的聚合对象,或在极端情况下,定义对象的相关类。如传感器、四轮驱动车、计算机等。

3、什么是“类”? “类”与传统的数据类型有什么关系?有什么区别 解答:把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描述了属于该类的全部对象的属性和操作.属于某个 类的对象叫做该类的实例。对象的状态则包含在它的实例变量,即实例的属性中。类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的当前状

的. 类,就它是一个数据值的聚合的意义上来看,与Pascal中的记录或C中的结构类似,但又有差别。类扩展了通常的记录语义,可提供各种级别的可访问性。也就是说,记录的某些成份可能是不可访因为它们包括了操作的定义,这些操作与类中声明的数据值有相同的地位。

4、基于复用的面向对象开发过程分为哪几个阶段?每一个阶段需要做哪些事情 ? 解答:基于复用的面向对象开发过程分为6个阶段,如图中虚线框所围。

① 论域分析 :论域分析开发问题论域的模型。论域分析应当在应用分析之前进行,我们在了解问题之前应当对问题敞开思想考虑,考察问题论域内的一个较宽的范围,分析覆盖的范围应比直接要解决的问题更多。

② 应用分析 :应用(或系统)分析细化在论域分析阶段所开发出来的信息,并且把注意力集中于当前要解决的问题。因为通过论域分③ 高层设计 :在一个纯面向对象环境中,软件体系结构设计与类设在高层设计阶段,设计应用系统的顶层视图。这相当于开发一个代表系统的类,通过建立该类的一个实例并发送一个消息给它来完成系统的“执行”.

④ 类的开发 :根据高层设计所标识的对各个类的要求和类的规格对这些类的开发是最基本的设计活动.

⑤ 实例的建立:建立各个对象的实例,实现问题的解决方案。 ⑥ 组装测试:按照类与类之间的关系组装一个完整的应用系统的过程中进行的测试。各个类的封装和类测试的完备性可减少组装测试所需要的时间。

5、按照类生存期,类的开发有哪几种方式?每一种方式需要做哪些事情?

解答:按照下图所示的类生存期,类的开发有三种方式。

(1) 既存类的复用

只要有可能就应复用既存类。为了达到此目的,开发人员必须能够找到这样一些类,它们都能选用来提供所需要的行为。有时应用要解决的问题与以前遇到的一些问题密切相关,因此那些问题中定义和实现的类可以复用。然而,多数照原样复用被在低层上最基本的类,像基本数据结构。对于较一般的结构,可以在实例化时,使用参数来规定它们的行为.

4

(2) 从既存类进行演化

多数复用情况是一个类已经存在,它提供的行为类似于要为新类定义的行为.开发人员可以使用既存类做为定义新类的起点。新类将根据既存类渐进式地演变而成。这样,在开发一个新类时,只需要花费较少的工作量就能复用许多既存类,得到所需要的新类。演化可以是横向的,也可以是纵向的。横向的演化导致既存类的一个新的版本,而纵向的演化将从既存类导出新类.我们在这里将主要讨论类的纵向渐进式开发。

① 渐进式设计.设计既存类的一个特殊化类。通过确定新类中打算要的所有成员,设计者可以确定哪些追加的行为可以加到类中去,哪些既存的行为应当重新实现。

用很少的新代码就能利用既存类的实现,而这些新代码必须当做老方法的上文或下文进行编写。此外,在渐进式设计阶段增加的那些行为也必须实现。

③ 渐进式测试。在测试中最花费时间的就是测试用例的生成.许多新类的测试用例可以从既存类的测试用例组中得到。新类的某些部分因为在测试既存类时已经测试过,因此可以不再需要测试。 (3) 从废弃型进行开发

这个分支仅在不得已的情况下使用。任何一个类,只要它的开发不涉及既存类,就可看做是一个新的继承结构的开始.因此,将建立两种类:一种是抽象类,它概括了将要表达的概念;另一种是具体类,它要实现这个概念。

① 设计.设计阶段需把分析阶段所产生的界面当做输入,并确定的属性的足够的细节,可支持它们的实现。单个类的设计包括构造它们实现了共有操作的某些部分。单个类的低层设计还涉及一些重要联系,如继承和组装关系。

② 实现.通过变量的声明、操作界面的实现及支持界面操作的函数的实现,可实现一个类的预期行为和状态。在变量中存储的数据 ③ 测试。单个的类为测试提供了自然的单元。如果类的定义提供的界面比较狭窄,那么穷举测试就有可能实现.类的测试在最抽象的层次开始,沿继承联系继续向下进行,新的类可以很容易地完全地被测试,而已经测试过的部分就不需要从新测试了。 (4) 求精和维护

传统的维护活动是针对应用的,而求精过程则是针对类,并把类链接在一起的结构的。因为我们利用抽象进行开发,因此,维护部分在任一时间都能修改这些抽象。随着经验的增长,我们可以够标识抽象的抽象,使得继承结构通过泛化增加新的层次,即在既存的根类之上增加新的层次.

8、建立分析和设计模型的一种重要方法是UML。试问UML是一种什么样的建模方法?它如何表示一个系统

解答:UML叫做统一的建模语言,它把Booch、Rumbaugh和Jacobson等各自的OOA和OOD方法中最优秀的特色组合成一个统一的方法。UML允许软 件工程师使用由一组语法的语义的实用的规则支配的符号来表示分析模型.

问的,而这些成份对于本记录型来说具有可访问性。类不同于记录, ② 渐进式实现。许多实现可以从既存类直接继承;有时可以仅使

析,分析人员具有了较宽的论域知识,因而能开发出更好的抽象。 类的其它属性。设计给出类的所有细节。这个阶段的输出是有关类计常常是同样的过程,但还是应当把体系结构设计与类的设计分开。数据存储,它是类定义的核心。其内部表示还包括一些私有函数,

说明,进行类的开发。因为一个应用系统往往是一个类的继承层次。通常是其它类的实例,它们提供了为该类的开发所需的服务。

在UML中用5种不同的视图来表示一个系统,这些视图从不同的 ·用户模型视图 :这个视图从用户(在UML中叫做参与者)角度来表示系统。它用使用实例(use case)来建立模型,并用它来描述来自终端用户方面的可用的场景.

·结构模型视图 :从系统内部来看数据和功能性。即对静态结构(类、对象和关系)模型化.

·行为模型视图 :这种视图表示了系统动态和行为.它还描述了在用户模型视图和结构模型视图中所描述的各种结构元素之间的交互和协作.

·实现模型视图 :将系统的结构和行为表达成为易于转换为实现的方式.

·环境模型视图 :表示系统实现环境的结构和行为。 通常,UML分析建模的注意力放在系统的用户模型和结构模型视图,而UML设计建模则定位在行为模型、实现模型和环境模型。 10、在类的设计中需要遵循的方针是什么?三个主要的设计准则:抽象、信息隐蔽和模块化如何才能作到 解答:在设计类时需要遵循的方针是:

·信息隐蔽:通过信息隐蔽可保护类的存储表示不被其它类的实例直接存取.

·狭窄界面:只有对其它类的实例是必要的操作才放到界面上. ·强内聚:模块内部各个部分之间应有较强的关系,它们不能分别标识。

·弱耦合:一个单独模块应尽量不依赖于其它模块。

·显式信息传递:两个类之间的交互应当仅涉及显式信息传递。 ·派生类当做派生类型:每个派生类应该当做基类的特殊化来开发,而基类所具有的公共界面成为派生类的共有界面的一个子集。 ·抽象类:某些语言提供了一个类,用它做为继承结构的开始点,所有用户定义的类都直接或间接以这个类为基类。 为了在类的设计中做到抽象、信息隐蔽和模块化:

以类作为系统的基本模块单元,通过一般化―特殊化关系和整体―部分关系,搭建整个系统的类层次结构,实现数据抽象和过程抽象;

将数据和相关的操作封装在类内部,建立共有、私有和子类型等存取级别,将数据表示定义成为类的私有成员,实现信息隐蔽。 通过建立类属性(类模板),将某些有可复用要求的类设计成在数据类型上通用的可复用的软件构件,这样有助于实现模块化。 11、解答:在类的通过复用的设计中,主要的继承关系有两大类: ① 配置:利用既存类来设计类,可能会要求由既存类的实例提供例如,一种仿真服务器可能要求使用一个计时器来跟踪服务时间。设计者不必开发在这个行为中所需的数据和操作,而是应当找到计时器类,并在服务器类的定义中声明它。

但如果使用既存类的内部表示来做为新类的内部表示的一部分,这是一种“针对实现”的继承方式,这种继承方式不好。例如,考虑使用继承来实现一个Circle类。Point类可支持Circle类的一部分实现.为了定义一个圆,我们只需要定义一个点和一个值,做为圆

5

的圆心和半径。把Point当做子类,Circle类不但能得到由x和y做,我们失去了抽象.

② 演变 :要开发的新类可能与一个既存类非常类似,但不完全相同。此时可以从一个既存类演变成一个新类,可以利用继承机制来表示一般化―特殊化的关系。特殊化处理有三种可能的方式。

如果新的概念是一个既存类所表示概念的一个特殊情况,特殊化运算可以从该既存类的定义产生新类的初始构造,这是典型的类继承的使用.既存类A的数据结构和操作可以成为新类B的一部分,如图(a)所示。既存类A的公共操作成为新类B的共有界面部分。 如果新类比软件库中那些既存类更一般,则新类B不具有既存类A的全部特性,一般化运算把两个类同的特性移到新的更高层的类中,高一层的类是B,我们将要设计它。原来的类A成为新类B的子类。如图(b)所示。

一个既存类A与我们设计的新类B共享概念的某一个部分,则两个概念的共同部分形成新类的基础,且既存类与新类两者成为子类,如图(c)所示。

12. 请解释下列术语,并举例说明之。 对象、类、属性、操作、关联、泛化、聚合、依赖 参:

它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。 举例:中国就是一个对象。

(2) 类(Class) 类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,包括属性和服务两个主要部分。

举例:学生、人、树木等都是类。

(3) 属性(Attribute) 属性是用来描述对象静态特征的一个数据项。

举例:学生具有姓名、性别、年龄等属性。

(4) 操作(Operation) 操作是类的实例被要求执行的服务,具有名字和参数列表。

举例:学生具有入学注册、选课等操作。

(5) 关联(Association) 关联是一种结构关系,说明一个事物的对象与另一个事物的对象之间的联系.

举例:学生与课程之间的关系就是关联,一个学生可以选修多门课程,一门课程也可以被多个学生选修。

(6) 泛化(Generalization) 泛化是一种一般事物(父类)和特殊事物(子类)之间的关系。

(7) 聚合(Aggregation) 聚合是一种特殊类型的关联,描述了整体和部分间的结构关系.

举例:学校和系之间存在聚合关系,系是学校的一个组成部分。 (8) 依赖(Dependency) 依赖是一种使用关系,描述了一个事物发生变化会影响到另一个使用它的事物. 举例:课程表使用课程,二者之间是依赖关系。

侧面描述系统.每一个视图由一组图形来定义。这些视图概述如下: 提供的圆心,而且还能得到一个操作,让圆能够自由移动。但这样

·消息:该类实例的用户应当只能使用界面提供的操作。 (1) 对象(Object) 对象是系统中用来描述客观事物的一个实体,

类的某些特性。通过把相应类的实例声明为新类的属性来配置新类。举例:学生与研究生之间是泛化关系,研究生是一类特殊的学生。

13. 面向对象分析包括哪些活动?应该建立哪些类型的模型? 参:

面向对象分析的主要活动包括理解用例模型、识别分析类、定义交互行为、建立分析类图以及评审分析模型等。

面向对象分析应该建立功能模型、分析对象模型和动态模型等三种类型,其中功能模型由用例和场景表示,分析对象模型由类图和对象图表示,动态模型由状态图和顺序图表示。

14。 什么是实体类、边界类和控制类?为什么将分析类划分成这三种类型? 参:

实体类用于描述必须存贮的信息及其相关行为;边界类用于描述外部参与者与系统之间的交互;控制类用于描述一个用例所具有的事件流控制行为。

将分析类划分成这三种类型的好处在于:所产生的类更小更专门化;这种划分将易变的外部界面与系统基本功能进行了屏蔽,使分析模型更易于变化。

15. 面向对象设计与面向对象分析的区别是什么?设计包括哪些活动? 答案要点:

面向对象分析是重点考虑系统“做什么”的问题,即运用面向对象方法对问题域进行分析和理解,建立系统的分析模型;面向对象设计重点考虑系统“怎样做”的问题,即在分析模型的基础上形成实现环境下的设计模型。

面向对象设计主要涉及系统设计、对象设计(或详细设计)、数据库设计和用户界面设计等活动。 五、应用题

1、建立窗口系统的对象模型,问题陈述如下:

由唯一的项名字来确定;对话项分为按钮、选择项和正文项三种,选择项中有若干选择项入口。图形窗中有若干形状元素,形状元素分为一维形状和二维形状。一维形状又分为直线、圆弧、折线;二维形状分为圆、椭圆、矩形、多边形,其中折线与多边形由若干有序顶点组成。正文窗是滚动窗的一种,而图形滚动窗既是图形窗又是滚动窗. 解答:

·对象模型应由对象图和数据词典组成。根据题意,先给出对象图.

·对话窗类与对话项类是限定关联,限定词是对话项名。 ·对话项类与按钮类、选择项类、正文项类是一般化?特殊化关系.

·选择项类与选择项入口类是一对多的拥有关联. ·图形窗类与形状元素类也是一对多的拥有关联.

·形状元素类与一维形状、二维形状是一般化?特殊化关系。 ·折线类与顶点类是整体-部分关系.

·二维形状类与圆类、椭圆类、矩形类、多边形类是一般化?特殊化关系。

·多边形类与顶点类是整体-部分关系,一个多边形至少有3个顶点。

·正文窗类与滚动窗类是一般化?特殊化关系。

·图形滚动窗类的父类是图形窗类和滚动窗类,这是一个多继承关系。

对应的窗口系统的数据词典

2、在学校教学管理系统中,学生查询成绩就是系统中的一次交互,请用状态图来描述这种交互的行为

解答:首先建立事件追踪图,用于描述用户与系统的一次交互行为。在图中,按时间的先后次序以及事件的发送和接收顺序,自上而下画出.

根据事件追踪图建立的状态图如下:

五、软件设计 四、问答题

1、逐步求精、分层过程与抽象等概念之间的相互关系如何? 解答:“自顶向下,逐步求精\"是Niklaus Wirth提出的设计策略:即将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。

这样的结构实际就是一个模块的分层结构,即分层的过程。在实施时,采用抽象化的方法,自顶向下,给出不同的抽象层次.在最高法。而在较低的抽象层次上,则采用过程化的方法.在描述问题的解法时,我们可以配合使用面向问题的术语和面向现实的术语。但最后在最低的抽象层次上,我们应使用能够直接实现的方式来描述这个解法。

2、完成良好的软件设计应遵循哪些原则?

解答:软件设计既是过程又是模型。设计过程是一系列迭代的步骤,使设计人员能够描述被开发软件的方方面面。设计模型体现了自顶向下、逐步细化的思想,首先构造事物的整体,再逐步细化,引导人们构造各种细节。为了给软件设计人员提供一些指导,1995年Davis

·设计过程不应受“隧道视野”的。一位好的设计者应当考

“窗口分为对话窗、图形窗、滚动窗三种。对话窗中有若干对话项,的抽象层次上,可以使用问题所处环境的语言概括地描述问题的解

·窗口类与对话窗类、图形窗类、滚动窗类是一般化?特殊化关系。 提出了一系列软件设计的原则如下,其中有些修改和补充:

虑一些替代的手段。根据问题的要求,可以用基本的设计概念,如抽象、逐步求精、模块化、软件体系结构、控制层次、结构分解、数据结构、软件过程、信息隐蔽等,来决定完成工作的资源。

·设计应能追溯到分析模型。由于设计模型中每一单个成份常常可追溯到多个需求上,因此有必要对设计模型如何满足需求进行追

·设计不应当从头做起.系统是使用一系列设计模式构造起来的,

·一维形状类与直线类、圆弧类、折线类是一般化?特殊化关系. 踪。

很多模式很可能以前就遇到过。这些模式通常被称为可复用的设计构件。可以使用它们代替那些从头开始做的方法。时间短暂而资源有限!设计时间应当投入到表示真正的新思想和集成那些已有的设

6

计模式上去。

软件设计的结果应尽可能模拟问题领域的结构.

·设计应具有一致性和集成性.如果一个设计从整体上看像是一个人完成的,那它就是一致的.在设计工作开始之前,设计小组应当定义风格和格式的规则,如果仔细定义了设计构件之间的接口,则该设计就是集成的。

使用上述的基本的设计概念,将设计构造得便于将来的修改。 ·应将设计构造得即使遇到异常的数据、事件或操作条件,也能

位于中段的几种内聚类型是可以接受的,但位于低端的内聚类型很不好,一般不能使用。因此,人们总是希望一个模块的内聚类型向高的方向靠。模块的内聚在系统的模块化设计中是一个关键的因素。 内聚和耦合是相互关联的。在程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。但这也不是绝对的.我们的目标是力求增加模块的内聚,尽量减少模块间的耦合,但增加内聚比减少耦合更重要,应当把更多的注意力集中到提高模块的内聚程度上来。 系?

解答:所谓“模块性”是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的。所谓的“信息隐蔽”是指每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用.

如果软件系统做到了信息隐蔽,即定义和实施了对模块的过程细节和局部数据结构的存取,那么这些模块相互间的接口就是简单的。这组模块的性就比较强。事实上,衡量模块性的一个准则就是模块内聚,达到信息隐蔽的模块是信息内聚模块,它是高内聚情形,模块性当然很强了。

一个对象的抽象数据类型,就是信息隐蔽的示例.例如,对于栈stack, 可以定义它的操作makenull(置空栈)、push(进栈)、pop(退栈)、gettop(取栈顶)和empty(判栈空)。这些操作所依赖的数据结构是什么样的? 它们是如何实现的? 都被封装在其实现模块中。软件的其它部分可以直接使用这些操作,不必关心它的实现细节。一旦实现栈stack的模块里内部过程或局部数据结构发生改变,只要它相关操作的调用形式不变, 则软件中其它所有使用这个栈stack的部分都可以不修改. 这样的模块结构具有很强的模块性。 5、模块的内聚性程度与该模块在分层结构中的位置有关系吗?说解答:模块的内聚性与该模块在分层模块结构中的位置无关。事实上,一个好的模块化的程序系统,它所有的模块可以都是功能内聚的,即每一个模块就只干了一件事。用结构化设计方法建立起来的模块结构中的每一个模块都符合这个要求。把讨论范围再拓宽点,在纯面向对象范型的软件系统中,整个系统看作是一个类,它的子类可以看作是系统的子系统或高层模块,它们还可以有子类,……,这就形成一个类的层次结构。类的构造可以看成是一个抽象数据类型,实际上是信息内聚的。所以整个系统中从上到下,所有模块(对象类)都是信息内聚的模块。

6、耦合性的概念和软件的可移植性有什么关系?请举例说明你的论述

解答:所谓“耦合性\"是指模块之间联系的紧密程度的一种度量,而软件的“可移植性\"是指将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所需工作量的大小。可移植性硬件性和软件系立性等,来衡量的.如果一个软件具有可移植性,它必然耦合性低,这样模块性要强.例如,有一个图形处理7

·设计应当缩短软件和现实世界中问题的“智力差距”,就是说, 在上面的关系中可以看到,位于高端的几种内聚类型最好,

平滑地、轻松地降级。设计良好的计算机程序应当永不“彻底停工”,4、模块性与信息隐蔽(反映模块化有效程度的属性)有何关它应能适应异常的条件,并且当它必须中止处理时也能以从容的方式结束。

·设计不是编码,编码也不是设计。即使在建立程序构件的详细的过程设计时,设计模型的抽象级别也比源代码要高。在编码级别上作出的唯一设计决策是描述如何将过程性设计转换为程序代码的小的实现细节。

·在开始着手设计时就应当能够评估质量,而不是在事情完成之后.利用上述的基本的设计概念和已有的设计方法,可以帮助设计者评估质量。

·应当坚持设计评审以减少概念上(语义上)的错误.有时人们在设计评审时倾向于注重细节,只见树木不见森林.在关注设计模型的语法之前,设计者应能确保设计的主要概念上的成份(的遗漏、含糊、不一致)都已检查过。

3、如何理解模块性?用什么指标来衡量模块性? 解答:如果两个模块互相,那么对其中一个模块进行编码、测试或修改时可以完全不考虑另一个模块对它的影响。因此,用模块性作为衡量模块结构是否容易编码、容易测试、容易修改的标准是合适的。但是,在一个系统的模块结构中没有哪两个模块可以完全,所以,要力争模块之间尽量,以得到一个质量良好的模块结构。

模块间的耦合是模块之间的相对性(互相连接的紧密程度)的度量。模块之间的连接越紧密,联系越多,耦合性就越高,而其模块性就越弱。内聚是模块功能强度(一个模块内部各个成份彼此结合的紧密程度)的度量。一个模块内部各个成份之间的联系越紧密,则它的内聚性就越高,相对地,它与其它模块之间的耦合性就会减低,而模块性就越强.因此,模块性比较强的模块应是高内聚低耦合的模块。

一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为

低耦合的情形有非直接耦合、数据耦合和标记耦合,它们都是比较好的模块间的连接。特点是模块间的接口简单、规范。中度耦合的情形有控制耦合,它通过参数表传递控制参数.相对高的耦合情形有外部耦合和公共耦合,它们都是通过全局数据传递模块间的信息,特别要防范这种后果。

一般模块的内聚性分为七种类型,它们的关系如下图所示。

一般采用两个准则度量模块性.即模块间的耦合和模块的内聚.明你的论据

不是说它们一定“坏\",但一定要注意使用这类耦合可能产生的后果,是用一组子特性,包括简明性、模块性、通用性、可扩充性、

软件,它应具有二维几何图形处理、三维几何图形处理、图形显示、外设控制、数据库管理、用户界面控制、设计分析等模块。如果这些模块之间都是通过参数表来传递信息,那么它们之间的的耦合就是数据耦合或标记耦合等,都是低耦合.将来如果想要把它们移植到另一个外部环境中,这些模块容易修改(功能内聚),且接口清晰,修改可局部化。反言之,如果这些模块都是功能内聚或信息内聚的模块,模块之间的耦合都是低耦合,也对可移植性有促进。但不能讲具有低耦合性模块结构的软件一定具有可移植性,因为是否具有可移植性还有其它因素的影响。

7、递归模块(即自己调用自己的模块)的概念如何能够与本章所介绍的设计原理与方法相适应

解答:递归过程在求解复杂的大型问题时非常有效.常用的求解问题的方法,一种叫做“分而治之\"的策略和“回溯”的策略,都可以用递归方法来解决。所谓“分而治之”的方法即是把大而复杂的问题化为规模稍小的子问题,用同样方法求解。如果分解后的子问题能够方法就是如果一个大的问题在求解过程中从某一步出发有可选的多种解决方案,先选择一种解决方案,试探求解.如果求解失败,撤消原来的选择,再选一种解决方案,试探求解,…….如果用某一方案求解成功,则退回上一步并报告这一步求解成功;如果所有可选方案都试过,都求解失败,则退回上一步并报告求解失败。

软件设计过程中的“自顶向下,逐层分解”的做法与上述求解问题的策略是一致的。如果分解出来的子问题(子功能、子模块)相互性比较强,这种分解可以降低模块的复杂性,做到模块化.所以,只要分解出来的子问题与原来问题满足递归的情况,用递归方法建立模块结构也是可行的。

8、举例说明你对概要设计与详细设计的理解.有不需要概要设计的情况吗?

解答:软件设计是一个把软件需求变换成软件表示的过程。最初这种表示只是描绘出软件的总的框架,然后进一步细化,在此框架中填入细节,把它加工成在程序细节上非常接近于源程序的软件表示。正因为如此,所以从工程管理的角度来看,软件设计分两步完成.首先做概要设计,将软件需求转化为数据结构和软件的系统结构.然后是详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。

由于概要设计建立起整个系统的体系结构框架,并给出了系统中此外还从系统全局的角度,考虑处理方式、运行方式、容错方式、以及系统维护等方面的问题,并给出了度量和评价软件质量的方法,所以它奠定了整个系统实现的基础。没有概要设计,直接考虑程序设计,就不能从全局把握软件系统的结构和质量,实现活动处于一种无序状态,程序结构划分不合理,导致系统处于一种不稳定的状态,稍一做改动就会失败。所以,不能没有概要设计。 9。 良好的软件体系结构设计有什么好处? 答案要点: 软件体系结构设计过程的核心在于建立系统的一个基本框架,即识别出系统的主要组件以及这些组件之间的通信. 良好的体系结构设计具有以下主要好处:

项目相关人员之间的沟通:软件体系结构是系统的一种高层表示,

8

它可以成为不同项目相关人员之间沟通的使能器;

系统分析:在系统分析过程中确定系统的初步体系结构,将对系统是否满足关键性需求(如性能、可靠性和可维护性等)产生很大的影响;

大规模复用:体系结构可以在具有相似需求的系统之间互用,从而支持大规模的复用。

10。 给下面的系统设计一个适当的体系结构:

(1)火车站自动售票系统 (2)三维几何造型系统 (3)网上银行系统 参:

(1) 火车站自动售票系统

这是一个典型的胖客户机模型,其中自动售票机作为客户机负责处理应用逻辑并实现与系统的交互,服务器是一个大型主机,运行火车票的数据库。

(2) 三维几何造型系统

该系统适于采用MVC结构,其中模型是三维几何形体的边界表示,管理与用户的交互控制。 (3)网上银行系统

该系统使用三层体系结构,其中一个数据服务器管理客户的帐户数据库,一个Web服务器提供应用服务(诸如现金转帐、生成银行结算单等),用户计算机上的浏览器是客户机。 六 程序编码 四、问答题

1、试说明下面的两个程序段的功能是什么?可否用另一些等效的程序段来代替它,以提高其可读性。 (1) A[I] = A[I] + A[T];

(2) for ( i = 1; i 〈= n; i ++ )

for ( j = 1; j <= n; j ++ ) V[i][j] = ( i / j ) * ( j / i );

A[T] = A[I] - A[T];A[I] = A[I] — A[T]; 解答:

(1) 的功能是对换A[I] 与A[T] 的内容。等效的程序段可以是:

WORK = A[T]; A[T] = A[I]; A[I] = WORK; (2) 的功能是建立一个单位矩阵V。等效的程序段可以是:

for ( i = 1; i 〈= n; i ++ ) ++ )

if ( i == j ) V[i][j] else V[i][j] = 0; for ( j = 1; j 〈= n; j

直接解决,就直接解出,然后再回推得到原来问题的解。所谓“回溯”视图将模型中的几何数据以用户需要的形式展现出来,控制器负责

的全局数据结构和数据库接口,人机接口,与其它硬、软件的接口。= 1;

2、结构化程序设计有时被错误地称为“无GOTO语句”的程序设计。请说明为什么会出现这样的说法,并讨论环绕着这个问题的一些争论.解答:

纷乱如麻的程序流程

早在1963年,针对当时流行的ALGOL语言,Peter Naur指出,在程序中大量地,没有节制地使用GOTO语句,会使程序结构变得非常混乱。但是很多人还不太注意这一问题。以致许多人写出来的程序仍然是纷乱如麻的.

1965年,E.W。Dijkstra在一次会议上提出,应当把GOTO语句从

高级语言中取消.并指出,程序的质量与程序中包含的GOTO语句的数量成反比.在这种思想的影响下,当时新开发的几种高级程序设计语言,例如LISP、ISWIM、BLISS等,都把GOTO语句取消了. 1966年,Bohm与Jacopini证明了任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。这三种基本控制结构就是“顺序结构”、“选择IF-THEN-ELSE结构”、“重复DO-WHILE或DO-UNTIL结构”。

1968年,Dijkstra在写给〈ACM〉(美国计算机协会通讯)杂志编辑部的信中再次建议从一切高级语言中取消GOTO语句,只使用三种基本控制结构编写程序。他的建议引起了激烈的争论。争论集中在如何看待GOTO语句的问题上。赞成取消 GOTO 语句的一方认为,GOTO语句对程序清晰性有很大破坏作用,凡是使用GOTO语句多的程序,从而增加查错和维护的困难,降低程序的可维护性.但以D.E.Knuth但不应完全禁止。因为GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,并且GOTO语句可直接得到硬件指令的支持。经过争论,人们认识到,不是简单地去掉以显著提高软件生产率和软件质量,降低软件维护的成本。 1970年代初N.Wirth在设计Pascal语言时对GOTO语句的处理可被当做对GOTO 语句争论的结论.在Pascal语言中设置了支持上述三种基本控制结构的语句;另一方面,GOTO语句仍然保留在该语言中。不过,N。Wirth解释说,通常使用所提供的几种基本控制结构已经足够,习惯于这样做的人不会感到GOTO语句的必要。也就是说,在一般情况下,可以完全不使用GOTO语句.如果在特殊情况下,由于特定的要求,偶然使用GOTO语句能解决问题,那也未尝不可,只是不应大量使用罢了。

事实上,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,从而使程序变得不易阅读,给程序的测试和维护造成困难,还会增加出错的机会,降低程序的可靠性。因此要控制GOTO语句的使用。但有时完全不用GOTO语句进行程序编码,比用GOTO语句编出的程序可读性差.例如,在查找结束时,文件访问结束时,出现错误情况要从循环中转出时,使用布尔变量和条件结构来实现就不如用GOTO语句来得简洁易懂。

3、设下图给出的程序流程图代表一个非结构化的程序,试问: (1) 为什么说它是一个非结构化的?

(2) 设计一个等价的使用附加标志变量flag的结构化程序。 (3) 设计一个使用break(用于代替goto)的程序。 解答:

(2) 等价的结构化程序:

enum Boolean { false, true } Boolean flag = true; while ( P && flag ) { }

9

do G;

if ( !Q ) flag = false;

(3) 使用break的程序

while ( P ) {

do G;

if ( !Q ) break;

4有一种循环结构,叫做N+1/2循环。其流程图如下所示.这种控制结构不属于基本控制结构:它既不是先判断型循环,又不是后判断型循环.试修改此流程图,将它改为用基本控制结构表示的等效的流程图.

解答:等效的控制流程图如下图中 (a) 所示.先判断型循环要求在进入循环体之前,先判断是否要继续执行此循环。因此,在这种控制结构的入口处应是一个判断语句。这种循环的循环体可能一次

5、下面是两个程序流程图,试分别用N—S图和PAD表示之,并计算它们的McCabe复杂性度量。 解答:对应的N-S图如下。 对应PAD图如下。

McCabe复杂性度量都为3。 七 软件测试 四、问答计算题

1、从下列关于软件测试的叙述中,选出5条正确的叙述。 (1) 用黑盒法测试时,测试用例是根据程序内部逻辑设计的。(2) 尽量用公共过程或子程序去代替重复的代码段。

(3) 测试是为了验证该软件已正确地实现了用户的要求。(4) 对于连锁型分支结构,若有n个判定语句,则有2n条路径. (5) 尽量采用复合的条件测试,以避免嵌套的分支结构?BR> (6) GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁。 (7) 发现错误多的程序模块,残留在模块中的错误也多。 (8) 黑盒测试方法中最有效的是因果图法。 (9) 在做程序的单元测试时,桩(存根)模块比驱动模块容易编写。 (10) 程序效率的提高主要应通过选择高效的算法来实现 解答:正确的叙述有(4)、(5)、(6)、(7)、(10)。

黑盒测试主要是根据程序的有关功能规格说明和覆盖准则来设计测试用例,进行测试的,不是根据程序的内部逻辑来设计测试用例,这是白盒测试做的事情。在所有黑盒测试方法中,最有效的不是因果图法,而是边界值分析方法。测试的目的是尽可能多地发现软件求.测试的一条重要原则是:发现错误多的程序模块,残留在模块中的错误也多。软件可靠性模型(Shooman)就是依据这个原则建立它的公式的。对于连锁型分支结构,若有n个判定语句,则有2n条路径。因此,随着n的增大,路径数增长非常快。单元测试时,因为桩模块要模拟子模块的功能,这不是一件容易的事情,而驱动模块只是控制被测模块的执行,所以桩模块的编写比驱动模块的编写要难得多。

其控制流时而GOTO向前,时而GOTO向后,常使程序变得很难理解,也不执行。参看图 (b)。 为代表的另一方认为,GOTO 语句虽然存在着破坏程序清晰性的问题,

GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,

(1) 它是一个单入口、两出口的结构,所以是一个非结构化的程序. 中的错误,其附带的收获才是验证该软件已正确地实现了用户的要

在程序设计风格方面,如果重复的代码段没有明显的功能,不可以抽取出来形成的公共过程或子程序,只有在这些代码段表现出的功能时,才可把它们抽取出来形成的公共过程或子程序。另外,程序效率的提高主要应通过选择高效的算法或使用高效的语言编译器来实现。GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,这句话是正确的。 2、对小的程序进行穷举测试是可能的,用穷举测试能否保证程序是百分之百正确呢?

解答:对小程序进行穷举测试,不见得能保证程序百分之百正确。所谓穷举测试是拿所有可能的输入数据来作为测试用例(黑盒测实际上并不能真正作到穷举测试。例如前面讲过,一个小程序P只Y只取整数,考虑把所有的X、Y值都做为测试数据,按黑盒方法进i的最大可能数目为:232×232=2。如果程序P测试一组X、Y数据需要1毫秒,而且假定一天工作24小时,一年工作365天,要完成2组测试,需要5亿年。

3、在任何情况下单元测试都是可能的吗?都是需要的吗

解答:单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作.其目的在于发现各模块内部可能存多个模块可以平行地进行单元测试.单元测试是在编码阶段完成的,每编写出一个程序模块,就开始做这个模块的单元测试,所以只要采用模块化方法开发软件,单元测试都是必需的。它可由编写程序的人来完成。因为它需要根据程序的内部结构设计测试用例,对于那些不了解程序内部细节的人,这种测试无法进行.

4、如图所示的程序有三条不同的路径。分别表示为L1(a→b)、L2(a→c→d)、L3(a→c→e),或简写为ace、abd、abe及acd.根据判定覆盖、条件覆盖、判定–条件覆盖、条件组合覆盖和路径覆盖等五种覆盖标准,从供选择的答案中分别找出满足相应覆盖标准的最小测试用例组。(用①~ ⑩回答)

供选择的答案: ①③⑤

x = 90, y = 90x = 90, y = 90x = 50, y = 50x = 90, y = 90x = 50, y = 50x = 90, y = 70⑦

x = 90, y = 90x = 50, y = 50x = 80, y = 70x = 70, y = 90⑨

x = 90, y = 90x = 90, y = 70x = 90, y = 30

⑩⑧⑥②④

x = 50, y = 50 x = 90, y = 70 x = 40, x = 90 x = 90, y = 90 x = 70, y = 90 x = 50, y = 50 x = 90, y = 90 x = 50, y = 50 x = 90, y = 50 x = 80, y = 80 x = 90, y = 90 x = 80, y = 80 x = 90, y = 70

x = 70, y = 90x = 30, y = 90x = 70, y = 70x = 50, y = 50x = 50, y = 50

x = 90, y = 30 x = 70, y = 90 x = 30, y = 90 x = 70, y = 70

解答:针对覆盖标准,相应的测试用例组如下

注意:测试是一个程序的执行过程。对于逻辑表达式 A or B,当A为真时不再对B做判断,对于逻辑表达式 A and B,当A为假时不再

在条件组合覆盖情形,(x?90)or(y?90)的组合有4种,与条件(x+y?140)的组合应有8种,但(x+y?140=F)and((x?90=T)or(y?90=T))不可能出现,因此,7个测试用例就够了.

因为流程图有3条路径,只需3个测试用例就够了。如果将判定中的复合条件表达式改为单个条件的嵌套选择结构,第一个判定有3条路径,其中两条路径通向第二个判定。第二个判定有4条路径,组合起来总共应有9条路径。但是,其中受测试条件的,有3盖它们。

5、在白盒测试用例设计中,有语句覆盖、分支覆盖、条件覆盖、路径覆盖等,其中( A )是最强的覆盖准则.为了对如下图所示的程序段进行覆盖测试,必须适当地选取测试用例组。若x, y是两个变量,可供选择的测试用例组共有Ⅰ、Ⅱ、Ⅲ、Ⅳ四组,如表中给出,则实现判定覆盖至少应采取的测试用例组是( B )或( C );实现条件覆盖至少应采取的测试用例组是( D );实现路径覆盖至少应采取的测试用例组是( E )或( F )。

供选择的答案 A:覆盖

B~F:① Ⅰ和Ⅱ组 ② Ⅱ和Ⅲ组 ③ Ⅲ和Ⅳ组 ④ Ⅰ和Ⅳ组

⑤ Ⅰ、Ⅱ、Ⅲ组 ⑥ Ⅱ、Ⅲ、Ⅳ组 ⑦ Ⅰ、Ⅲ、Ⅳ ⑧ Ⅰ、Ⅱ、Ⅳ组

解答:A。 ④ B. ⑤ C。 ⑧ D. ④ E。 ⑤ F。 ⑧ 判定表 10

为判定覆盖选取测试用例情形:对第一个判定选取测试用例组① 语句覆盖 ② 条件覆盖 ③ 判定覆盖 ④ 路径

试),或覆盖程序中所有可能的路径(白盒测试).对于小程序来说,对B做判断.未能做判断的条件,在解答中用“□”表示。 有两个输入X和Y及输出Z,在字长为32位的计算机上运行.如果X、此测试用例组在满足条件覆盖的情况下又满足了判定覆盖的要求。 行穷举测试,这样做可能采用的测试数据组(Xi,Yi),基数(radix)

在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。条路径不可达,因此,程序中应有6条路径,需要6个测试用例来覆

Ⅰ和Ⅱ,当用Ⅰ覆盖判定的T分支时,不会走到第二个分支;当用Ⅱ覆盖判定的F分支时,第二个判定需另取一个测试用例组覆盖其T分支,此时取测试用例组Ⅲ或Ⅳ即可.因此,选择⑤或⑧均可. 为条件覆盖选取测试用例情形:取测试用例组Ⅰ和Ⅳ就可以覆盖所有4个条件的取值.

为路径覆盖选取测试用例情形:总共3条路径,需3个测试用例,可选使各路径为T的测试用例。Ⅰ、Ⅱ、Ⅲ或Ⅰ、Ⅱ、Ⅳ均可,可选⑤或⑧。

6、下面是快速排序算法中的一趟划分算法,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ): int Partition ( datalist &list, int low, int high ) {

//在区间[ low, high ]以第一个对象为基准进行一次划分,k返回基准对象回放位置.

int k = low; Element pivot = list.V[low]; //基准对象 for ( int i = low+1; i <= high; i++ )

列,进行划分 k != i )

Swap ( list。V[k], list。V[i] );

准的交换到左侧去

Swap ( list。V[low], list.V[k] );

准对象就位

return k;

对象位置

}

(1) 试画出它的程序流程图;

(2) 试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)解答:(1)流程图如下。

(2) 测试用例设计

画程序流程图是设计测试用例的关键。从以往同学解题的经验来看,在画流程图时就出错了。所以首先要把流程图中的逻辑关系搞清楚再画出正确的流程图。考虑测试用例设计需要首先有测试输入数据,还要有预期的输出结果。对于此例,控制循环次数靠循环控制变量i和循环终值high。循环0次时,取low = high,此时一次循环

//返回基准

//将基//小于基 //检测整个序

腰的、还是等边的。\"

解答:设三角形的三条边分别为A, B, C.如果它们能够构成三角形的三条边,必需满足:A 〉 0,B 〉 0,C 〉 0,且A + B 〉 C,B + C > A,A + C > B。

如果是等腰的,还要判断是否A = B,或B = C,或A = C. 对于等边的,则需判断是否A = B,且B = C,且A = C。 列出等价类表: 测试用例设计(略)

9、设要对一个自动饮料售货机软件进行黑盒测试。该软件的规格说明如下:

“有一个处理单价为1元5角钱的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”、“雪碧”或“红茶”按钮,相应的饮料就送出来.若投入的是2元硬币,在送出饮料的同时退还5角硬币。\" 解答: (1) 因果图

(2) 测试用例设计

测试用例 每一纵列为一个测试用例

10应该由谁来进行确认测试?是软件开发者还是软件用户?为什么?

解答:在对照需求做有效性测试和软件配置审查时,是由软件开发者在开发环境下进行的测试。而接下来做验收测试时则以用户为主.软件开发人员和QA(质量保证)人员也应参加.由用户参加设计测试用例,使用用户界面输入测试数据,并分析测试的输出结果.一般使用生产中的实际数据进行测试。

如果软件是为多个客户开发的,则需要进行α测试和β测试。α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。软件在一个自然设置状态下使用。开发者坐在用户旁边,随时记下错误情况和使用中的问题。这是在受控制的环境下进行的测试。

β测试是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。这些用户是与公司签定了支持产品预发行合同的外部客户,他们要求使用该产品,并愿意返回有关错位错误信息给开发者。与α测试不同的是,开发者通常不在测试现场。因而,β测试是在开发者无法控制的环境下进行的软件现场应用.

11。 软件测试包括哪些类型的测试?这些测试之间的区别是什么?

if ( list.V[i]。getKey ( ) 〈 pivot.getKey( ) && ++

也不做。循环一次时,取low +1 = high,循环二次时,取low+2 = high。 参:

若出题时特别强调要使用BRO策略,条件V[i] < pivot && 软件测试包括单元测试、集成测试、系统测试和验收测试等。

集成测试集中于模块的组装;

系统测试确保整个系统与系统的功能需求和非功能需求保持一致;

验收测试是用户根据验收标准(通常来自项目协议),在开发环境或模拟真实环境中执行的可用性、功能和性能测试。

12 。 请结合等价类方法给出 getNumDaysInMonth(int month, int year)方法的测试用例,其中getNumDaysInMonth 方法根据给定的月11

++k≠i的约束集合为 { (〈, 〈 ), (〈, = ), (=, 〈), (>, 单元测试集中于每一个的模块; 〈 ) },因此,测试用例设计为:

8、根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。

“一个程序读入三个整数。把此三个数值看成是一个三角形的三个边。这个程序要打印出信息,说明这个三角形是三边不等的、是等

份和年份返回该月份的总天数。 参:

月的等价类:① 31天的月份;② 30天的月份;③ 2 月 年的等价类:① 闰年;② 非闰年

12

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务