软件工程2.docx
- 文档编号:17024714
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:19
- 大小:44.26KB
软件工程2.docx
《软件工程2.docx》由会员分享,可在线阅读,更多相关《软件工程2.docx(19页珍藏版)》请在冰点文库上搜索。
软件工程2
程序编码
习题
【4-1】从下列关于模块化程序设计的叙述中选出5条正确的叙述。
①程序设计比较方便,但比较难以维护。
②便于由多个人分工编制大型程序。
③软件的功能便于扩充。
④程序易于理解,也便于排错。
⑤在主存储器能够容纳得下的前提下,应使模块尽可能大,以便减少模块的个数。
⑥模块之间的接口叫做数据文件。
⑦只要模块之间的接口关系不变,各模块内部实现细节的修改将不会影响别的模块。
⑧模块间的单向调用关系叫做模块的层次结构。
⑨模块越小,模块化的优点越明显。
一般来说,模块的大小都在10行以下。
【4-2】结构化程序设计有时被错误地称为“无GOTO语句”的程序设计。
请说明为什么会出现这样的说法,并讨论环绕着这个问题的一些争论。
【4-3】从下面关于程序编制的叙述中,选出三条正确的叙述。
①在编制程序之前,首先必须仔细阅读给定的程序说明书。
然后,必须如实地依照说明书编写程序。
说明书中常会有含糊不清或难以理解的地方。
程序员在作业时应该对这些地方作出适当的解释。
②在着手编制程序时,重要的是采用既能使程序正确地按设计说明书进行处理,又易于出错的编写方法。
③在编制程序时,首先应该对程序的结构充分考虑,不要急于开始编码,而要象写软件文档那样,很好地琢磨程序具有什么样的功能,这些功能如何安排等等。
④考虑到以后的程序变更,为程序编写完整的说明书是一项很重要的工作。
只要有了完整的程序说明书,即使程序的编写形式难以让他人看懂也没有什么关系。
⑤编制程序时不可缺少的条件是,程序的输入和输出数据的格式都应确定。
其他各项规定都是附带的,无足轻重。
⑥作为一个好的程序,不仅处理速度要快,而且易读易修改等等也都是重要的条件。
为了能得到这样的程序,不仅要熟悉程序设计语言的语法,还要注意采用适当的规程和单纯的表现方法,注意使整个程序的结构简洁。
【4-7】下面给出一个求实函数方程F(x)在自变量区间[a,b]中的全部实根的算法。
首先阅读此程序,然后
画出消去全部goto语句的结构化程序流程图。
在算法中,a与b是区间[a,b]的两端点值;eps1与eps2是用户要求的求解精度。
如果区间中点的函数值的绝对值小于eps1或新的小区间的长度小于eps2,就认为这个中点为根。
floatBinRoot(floata,floatb,floateps1,floateps2){
floatlow=a,high=b,mid,fmid;
floatflow=Func(low),fhigh:
=Func(high);
labelL1,L2,L3;//标号说明,给定某些程序地址
if(flow*fhigh>0.0){BinRoot=0;gotoL3;}//无实根
L1:
mid=(low+high)/2;fmid=Func(mid);
if(abs(fmid)<=eps1){
L2:
BinRoot=mid;gotoL3;
}
elseif(high-mid<=eps2)gotoL2;
elseif(flow*fmid>0.0){low=mid;flow=fmid;gotoL1;}
else{high=mid;gotoL1};
L3:
}
习题解答
【4-1】正确的叙述有②、③、④、⑦、⑧。
如果程序结构的模块化满足评价的标准(高内聚,低耦合),这样的结构是容易编码,容易测试,容易理解,容易修改,容易维护的。
程序的功能也容易扩充。
特别适合于大型程序编制时,多人分工合作,协同完成任务的情形。
因为是采用自顶向下,逐层分解来划分模块结构的,所以模块之间的调用关系是分层次的模块结构,就叫做模块的层次结构。
模块之间的信息传递叫做模块的接口,模块之间传递信息可以通过参数表、全局变量或全局数据结构、数据文件、专门的通信模块,不是专指数据文件。
划分模块时,模块大小要适中。
模块太大,控制路径数目多、涉及的范围广、变量的数目多、总体复杂性高,可理解性、可修改性、可靠性就会变差。
模块太小,模块个数增大,调用的系统开销就会增大。
所以要有一个权衡。
【
纷乱如麻的程序流程
4-2】早在1963年,针对当时流行的ALGOL语言,PeterNaur指出,在程序中大量地,没有节制地使用GOTO语句,会使程序结构变得非常混乱。
但是很多人还不太注意这一问题。
以致许多人写出来的程序仍然是纷乱如麻的。
1965年,E.W.Dijkstra在一次会议上提出,应当把GOTO语句从高级语言中取消。
并指出,程序的质量与程序中包含的GOTO语句的数量成反比。
在这种思想的影响下,当时新开发的几种高级程序设计语言,例如LISP、ISWIM、BLISS等,都把GOTO语句取消了。
1966年,Bohm与Jacopini证明了任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。
这三种基本控制结构就是“顺序结构”、“选择IF-THEN-ELSE结构”、“重复DO-WHILE或DO-UNTIL结构”。
1968年,Dijkstra在写给
他的建议引起了激烈的争论。
争论集中在如何看待GOTO语句的问题上。
赞成取消GOTO语句的一方认为,GOTO语句对程序清晰性有很大破坏作用,凡是使用GOTO语句多的程序,其控制流时而GOTO向前,时而GOTO向后,常使程序变得很难理解,从而增加查错和维护的困难,降低程序的可维护性。
但以D.E.Knuth为代表的另一方认为,GOTO语句虽然存在着破坏程序清晰性的问题,但不应完全禁止。
因为GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,并且GOTO语句可直接得到硬件指令的支持。
经过争论,人们认识到,不是简单地去掉GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,以显著提高软件生产率和软件质量,降低软件维护的成本。
70年代初N.Wirth在设计Pascal语言时对GOTO语句的处理可被当做对GOTO语句争论的结论。
在Pascal语言中设置了支持上述三种基本控制结构的语句;另一方面,GOTO语句仍然保留在该语言中。
不过,N.Wirth解释说,通常使用所提供的几种基本控制结构已经足够,习惯于这样做的人不会感到GOTO语句的必要。
也就是说,在一般情况下,可以完全不使用GOTO语句。
如果在特殊情况下,由于特定的要求,偶然使用GOTO语句能解决问题,那也未尝不可,只是不应大量使用罢了。
事实上,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,从而使程序变得不易阅读,给程序的测试和维护造成困难,还会增加出错的机会,降低程序的可靠性。
因此要控制GOTO语句的使用。
但有时完全不用GOTO语句进行程序编码,比用GOTO语句编出的程序可读性差。
例如,在查找结束时,文件访问结束时,出现错误情况要从循环中转出时,使用布尔变量和条件结构来实现就不如用GOTO语句来得简洁易懂。
【4-3】①、④、⑥。
编制程序的过程实际上是根据设计的结果,用某种机器能够识别的程序设计语言,将设计翻译成机器代码的过程。
因此,必须如实地按照设计说明书编写程序。
至于设计说明书中含糊不清的地方,应当在编程时与分析人员或设计人员协商,对这些地方做出适当的解释。
另外,考虑到将来的程序修改,必须为程序编写完整的说明书,同时程序必须编写得容易让别人看得懂,这样程序才容易修改,修改时不容易出错,而且容易验证修改后得结果。
还有,编写程序的人不须重新考虑程序要完成什么功能,这些已经在软件分析与设计过程中充分考虑过了。
【4-7】结构化的程序流程图:
软件测试
复习要求
1.了解软件测试的目的和原则。
2.了解软件错误的分类。
3.了解软件测试的过程和策略。
4.了解软件测试用例设计的方法,掌握逻辑覆盖、基本路径测试、因果图等测试用例设计方法。
5.了解程序静态测试的方法。
习题
【5-1】从供选择的答案中选出应填入下列()中的字句。
软件测试的目的是(A)。
为了提高测试的效率,应该(B)。
使用白盒测试方法时,确定测试数据应根据(C)和指定的覆盖标准。
与设计测试数据无关的文档是(D)。
软件的集成测试工作最好由(E)承担,以提高集成测试的效果。
供选择的答案:
A.①评价软件的质量②发现软件的错误
③找出软件中的所有错误④证明软件是正确的
B.①随机地选取测试数据
②取一切可能的输入数据作为测试数据
③在完成编码以后制定软件的测试计划
④选择发现错误的可能性大的数据作为测试数据
C.①程序的内部逻辑②程序的复杂程度
③使用说明书④程序的功能
D.①该软件的设计人员②程序的复杂程度
③源程序④项目开发计划
E.①该软件的设计人员②该软件开发组的负责人
③该软件的编程人员④不属于该软件开发组的软件设计人员
【5-2】请从供选择的答案中选出应填入下列()中的字句。
程序的三种基本控制结构是(A)。
它们的共同点是(B)。
结构化程序设计的一种基本方法是(C)。
软件测试的目的是(D)。
软件调试的目的是(E)。
供选择的答案:
A.①过程,子程序,分程序②顺序,条件,循环
③递归,堆栈,队列④调用,返回,转移
B.①不能嵌套使用②只能用来写简单的程序
③已经用硬件实现④只有一个入口和一个出口
C.①筛选法②递归法③归纳法④逐步求精法
D.①证明程序中没有错误②发现程序中的错误
③测量程序的动态特性④检查程序中的语法错误
E.①找出错误所在并改正之②排除存在错误的可能性
③对错误性质进行分类④统计出错的次数
【5-3】从下列关于软件测试的叙述中,选出5条正确的叙述。
(1)用黑盒法测试时,测试用例是根据程序内部逻辑设计的。
(2)尽量用公共过程或子程序去代替重复的代码段。
(3)测试是为了验证该软件已正确地实现了用户的要求。
(4)对于连锁型分支结构,若有n个判定语句,则有2n条路径。
(5)尽量采用复合的条件测试,以避免嵌套的分支结构。
(6)GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁。
(7)发现错误多的程序模块,残留在模块中的错误也多。
(8)黑盒测试方法中最有效的是因果图法。
(9)在做程序的单元测试时,桩(存根)模块比驱动模块容易编写。
(10)程序效率的提高主要应通过选择高效的算法来实现。
【5-4】从供选择的答案中选出同下列关于软件测试的各条叙述关系最密切的字句。
(1)对可靠性要求很高的软件,例如操作系统,由第三者对源代码进行逐行检查。
(2)已有的软件被改版时,由于受到变更的影响,改版前正常的功能可能发生异常,性能也可能下降。
因此,对变更的软件进行测试是必要的。
(3)在意识到被测试模块的内部结构或算法的情况下进行测试。
(4)为了确认用户的需求,先做出系统的主要部分,提交给用户试用。
(5)在测试具有层次结构的大型软件时,有一种方法是从上层模块开始,由上到下进行测试。
此时,有必要用一些模块替代尚未测试过的下层模块。
供选择的答案:
AE:
①仿真器②代码审查③模拟器④桩⑤驱动器
⑥域测试⑦黑盒测试⑧原型⑨白盒测试⑩退化测试
【5-5】对小的程序进行穷举测试是可能的,用穷举测试能否保证程序是百分之百正确呢?
【5-6】在任何情况下单元测试都是可能的吗?
都是需要的吗?
【5-7】从供选择的答案中选出应填入下面有关软件测试的叙述的()内的正确答案。
软件测试方法可分为黑盒测试法和白盒测试法两种。
黑盒测试法是通过分析程序的(A)来设计测试用例的方法。
除了测试程序外,它还适用于对(B)阶段的软件文档进行测试。
白盒测试法是根据程序的(C)来设计测试用例的方法。
除了测试程序外,它也适用于对(D)阶段的软件文档进行测试。
白盒法测试程序时常按照给定的覆盖条件选取测试用例。
(E)覆盖比(F)覆盖严格,它使得每一个判定的每一条分支至少经历一次。
(G)覆盖既是判定覆盖,又是条件覆盖,但它并不保证使各种条件都能取到所有可能的值。
(H)覆盖比其他条件都要严格,但它不能保证覆盖程序中的每一条路径。
单元测试一般以(I)为主,测试的依据是(J)。
供选择的答案:
A,C:
①应用范围②内部逻辑③功能④输入数据
B,D:
①编码②软件详细设计③软件总体设计④需求分析
E,F,G,H:
①语句②判定③条件④判定/条件
⑤多重条件⑥路径
I:
①白盒法②黑盒法
J:
①模块功能规格说明②系统模块结构图③系统需求规格说明
【5-8】从供选择的答案中选出应该填入下列关于软件测试的叙述的()内的正确答案。
软件测试中常用的静态分析方法是(A)和(B)。
(B)用于检查模块或子程序间的调用是否正确。
分析方法(白盒方法)中常用的方法是(C)方法。
非分析方法(黑盒方法)中常用的方法是(D)方法和(E)方法。
(E)方法根据输出对输入的依赖关系设计测试用例。
供选择的答案:
AB:
①引用分析②算法分析③可靠性分析④效率分析
⑤接口分析⑥操作分析
C~E:
①路径测试②等价类③因果图④归纳测试
⑤综合测试⑥追踪⑦深度优先⑧调试
⑨相对图
习题解答
【5-1】A.②B.④C.①D.④E.④
软件测试的目的是软件中的错误。
因为不可能把所有可能的输入数据都拿来测试(时间花费不起),为了提高测试的效率,应该选择发现错误的可能性大的数据作为测试数据。
使用白盒测试方法时,确定测试数据应根据程序的内部逻辑和指定的覆盖标准,可以不考虑程序的功能。
与设计测试数据无关的文档是项目开发计划。
软件的集成测试工作最好由不属于该软件开发组的软件设计人员承担,以提高集成测试的效果。
【5-2】A.②B.④C.④D.②E.①
1966年,Bohm与Jacopini提出任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。
这三种基本控制结构就是“顺序结构”、“选择IF-THEN-ELSE结构”、“重复DO-WHILE或DO-UNTIL结构”。
它们的共同点是只有一个入口和一个出口。
E.W.Dijkstra提出了程序要实现结构化的主张,并将这一类程序设计称为结构化程序设计。
这种方法的一个重要原则就是采用自顶向下、逐步求精的方法编写程序。
N.Wirth曾做过如下说明:
“我们对付一个复杂问题的最重要的方法就是抽象。
因此,对于一个复杂的问题,不要急于马上用计算机指令、数字和逻辑符号来表示它,而应当先用较自然的抽象的语句来表示,从而得到抽象的程序。
抽象程序对抽象的数据类型进行某些特定的运算,并用一些合适的记号(可以是自然语言)来表示。
下一步对抽象程序再做分解,进入下一个抽象的层次。
这样的细化过程一直进行下去,直到程序能被计算机接受为止。
此时的程序已经是用某种高级语言或机器指令书写的了。
”
软件调试则是在进行了成功的测试之后才开始的工作。
它与软件测试不同,软件测试的目的是尽可能多地发现软件中的错误,但进一步诊断和改正程序中潜在的错误,则是调试的任务。
调试活动由两部分组成:
①确定程序中可疑错误的确切性质和位置。
②对程序(设计,编码)进行修改,排除这个错误。
【5-3】正确的叙述有(4)、(5)、(6)、(7)、(10)。
黑盒测试主要是根据程序的有关功能规格说明和覆盖准则来设计测试用例,进行测试的,不是根据程序的内部逻辑来设计测试用例,这是白盒测试做的事情。
在所有黑盒测试方法中,最有效的不是因果图法,而是边界值分析方法。
测试的目的是尽可能多地发现软件中的错误,其附带的收获才是验证该软件已正确地实现了用户的要求。
测试的一条重要原则是:
发现错误多的程序模块,残留在模块中的错误也多。
软件可靠性模型(Shooman)就是依据这个原则建立它的公式的。
对于连锁型分支结构,若有n个判定语句,则有2n条路径。
因此,随着n的增大,路径数增长非常快。
单元测试时,因为桩模块要模拟子模块的功能,这不是一件容易的事情,而驱动模块只是控制被测模块的执行,所以桩模块的编写比驱动模块的编写要难得多。
在程序设计风格方面,如果重复的代码段没有明显的功能,不可以抽取出来形成独立的公共过程或子程序,只有在这些代码段表现出独立的功能时,才可把它们抽取出来形成独立的公共过程或子程序。
另外,程序效率的提高主要应通过选择高效的算法或使用高效的语言编译器来实现。
GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,这句话是正确的。
【5-4】
(1)②
(2)⑩(3)⑨(4)⑧(5)④
(1)对可靠性要求很高的软件,由第三者对源代码进行逐行检查,这是代码审查。
(2)软件变更时可能发生退化现象:
原来正常的功能可能发生异常,性能也可能下降。
因此,对变更的软件要进行退化测试。
(3)基于被测试模块的内部结构或算法设计测试用例进行测试,这是白盒测试。
(4)为了确认用户的需求,先做出系统的原型,提交给用户试用。
(5)自顶向下对具有层次结构的大型软件进行集成测试时,需要设计一些虚拟模块来替代尚未测试过的下层模块,这些模块叫做桩模块。
【5-5】对小程序进行穷举测试,不见得能保证程序百分之百正确。
所谓穷举测试是拿所有可能的输入数据来作为测试用例(黑盒测试),或覆盖程序中所有可能的路径(白盒测试)。
对于小程序来说,实际上并不能真正作到穷举测试。
例如前面讲过,一个小程序P只有两个输入X和Y及输出Z,在字长为32位的计算机上运行。
如果X、Y只取整数,考虑把所有的X、Y值都做为测试数据,按黑盒方法进行穷举测试,这样做可能采用的测试数据组(Xi,Yi),基数(radix)i的最大可能数目为:
232×232=264。
如果程序P测试一组X、Y数据需要1毫秒,而且假定一天工作24小时,一年工作365天,要完成264组测试,需要5亿年。
【5-6】单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作。
其目的在于发现各模块内部可能存在的各种差错。
单元测试需要从程序的内部结构出发设计测试用例。
多个模块可以平行地独立进行单元测试。
单元测试是在编码阶段完成的,每编写出一个程序模块,就开始做这个模块的单元测试,所以只要采用模块化方法开发软件,单元测试都是必需的。
它可由编写程序的人来完成。
因为它需要根据程序的内部结构设计测试用例,对于那些不了解程序内部细节的人,这种测试无法进行。
【5-7】A.③B.④C.②D.②E.②F.①G.④H.⑤I.①J.①
软件测试方法可分为黑盒测试法和白盒测试法两种。
黑盒测试法是基于程序的功能来设计测试用例的方法。
除了测试程序外,它还适用于对需求分析阶段的软件文档进行测试。
白盒测试法是根据程序的内部逻辑来设计测试用例的方法。
除了测试程序外,它也适用于对软件详细设计阶段的软件文档进行测试。
白盒法测试程序时常按照给定的覆盖条件选取测试用例。
判定覆盖比语句覆盖严格,它使得每一个判定的每一条分支至少经历一次。
判定/条件覆盖既是判定覆盖,又是条件覆盖,但它并不保证使各种条件都能取到所有可能的值。
多重条件覆盖,也叫组合条件覆盖,比其他条件都要严格,但它不能保证覆盖程序中的每一条路径。
单元测试一般以白盒法为主,测试的依据是系统的模块功能规格说明。
【5-8】A.①B.⑤C.①D.②E.③
软件测试中常用的静态分析方法是引用分析和接口分析。
接口分析用于检查模块或子程序间的调用是否正确。
分析方法(白盒方法)中常用的方法是路径测试方法。
非分析方法(黑盒方法)中常用的方法是等价类(划分)方法和因果图方法。
因果图方法根据输出对输入的依赖关系设计测试用例。
面向对象技术
复习要求
1.了解面向对象的概念
2.了解用面向对象方法构造软件的开发过程
3.了解面向对象分析方法
4.了解面向对象设计方法
习题
【6-1】什么叫面向对象?
面向对象方法的特点是什么?
为什么要用面向对象方法开发软件?
【6-2】什么是“对象”?
识别对象时将潜在对象分成7类,试给出这7类对象的名称,并举例说明。
【6-3】什么是“类”?
“类”与传统的数据类型有什么关系?
有什么区别?
【6-6】面向对象开发方法与面向数据流的结构化开发方法有什么不同?
使用面向对象开发方法的优点在什么地方?
【6-12】在类的设计中需要遵循的方针是什么?
三个主要的设计准则:
抽象、信息隐蔽和模块化如何才能作到?
习题解答
【6-1】关于“面向对象”,有许多不同的看法。
Coad和Yourdon给出了一个定义:
“面向对象=对象+类+继承+消息通信”。
如果一个软件系统是使用这样4个概念设计和实现的,则认为这个软件系统是面向对象的。
面向对象方法的特点是:
方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。
从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前一阶段成果的补充和修改。
把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。
使用面向对象方法开发软件的好处是:
开发方法的唯一性,开发阶段的高度连续性,表示方式的一致性;
问题空间实体的自然表示,减轻了设计者的负担,在设计系统之初不必考虑一个很完整的解决方案。
建立稳定的系统结构,可促进复用性,易于维护,易于修改,可合理利用共同性,减少复杂性。
【6-2】对象的定义:
对象是面向对象开发模式的基本成分,是现实世界中个体或事物的抽象表示。
每个对象可由一组属性和它可以执行的一组操作来定义。
可能的潜在对象有7类:
外部实体:
它们产生或接受为目标系统所使用的信息。
如各种物理设备、使用人员、其它相关的子系统。
事物:
问题的信息域所涉及的概念实体。
如各种报告、显示、文字、信号、规格说明等。
事件:
系统运行时发生的并需要系统记忆的事件。
如状态转换、物理运动等。
角色:
与系统有交互的各种人员所扮演的角色。
如经理、工程师、销售人员等。
场所或位置:
建立系统整体环境或问题上下文的场所、位置。
如基于计算机的系统的安装场所等。
组织机构:
与应用有关的组织机构。
如组织,部门等。
结构:
定义由一组成分对象组成的聚合对象,或在极端情况下,定义对象的相关类。
如传感器、四轮驱动车、计算机等。
【6-3】把具有相同特征和行为的对象归在一起就形成了类。
类成为某些对象的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程