第6页
七、下面是一趟插入排序的程序, 把R[i+1]插入到R[1..i]的适当位置
R[0] = R[i + 1]; j = i;
while ( R[j] > R[0] )
{ R[j + 1] = R[j]; j = j -1; }
R[j + 1] = R[0];
用路径覆盖方法为它设计足够的测试用例(while循环次数为0次、1次、2次)。
八、阅读下列关于软件可靠性方面的叙述,回答问题1和问题2。
软件的可靠度可定义为:在假定输入和硬件不发生错误的前提下,对于给定的环境和给定的输入,在指定的时间内能完成规定任务的概率。
某软件中心的评测部为了评估已开发实现的应用软件ASP的可靠性,决定采用软件可靠性的错误播种模型来进行测试和评估。评测部在评估时,作了下列三个假设:
(1) 在测试前,单位长度的故障个数ET / IT 为一常数,此常数基本上落在一个固定的范围内。其中IT 为被测程序的长度(即机器指令条数),ET 为被测程序中故障总数。
(2) 失效率正比于软件中剩余的(潜伏的)故障数,平均无故障时间MTTF与单位长度的剩余故障个数成反比,即 MTTF = 1/(K*εr )。其中εr 为单位长度剩余故障个数,K的典型值现取为200。
(3) 测试中发现的错误都得到了及时改正,在测试过程中没有引入新的错误。评测部对ASP软件人为地植入了10个错误,即NS = 10,在开始测试的一小段时间内,发现了160个固有故障,即n = 160,又发现了植入的故障2个,即nS = 2,被测程序ASP的长度(机器指令条数)为105 。
问题1:用故障播种(植入)的数学模型,估算出被测程序ASP的固有故障的个数N的值。如果通过测试一段时间后,发现的固有错误个数为ED = 795时,请估算此程序的平均无故障时间MTTF值。
问题2:若要求把此MTTF再提高4倍,应至少再排除多少个固有错误? 请简要地列出有关计算式。
参考答案
一、答案:A. ③ B. ⑤ C. ⑥ D. ① E. ⑤
二、答案:A. ③ B. ② C. ③ D. ⑤ E. ①
三、答案:正确的叙述有:(1)、(4)、(5)、(7)、(10)
说明:(1) 利用括号可以明确地规定表达式中各运算符的优先顺序,这样可以提供表达式运算的清晰性,因此是对的。(4) 对于不好的程序,一是程序逻辑混乱以致理解困难,二是隐藏错误多,三是错误定位和修改容易出问题,所以修修补补,越补越糟,不如重新写。(5) 浮点数的运算有其近似性,两个浮点数可能会非常接近但永远不会相等,所以做浮点数的相等比较可能不会有结果。(7) 利用数据类型来检查数据值,这是静态分析的一种手段,叫做类型分析,因此是对的。(10) 使用有意义的标识符,可以提高程序的可读性,因此是对的。
其它的叙述都不对。(2) 对递归定义的数据结构,应当使用递归过程来解决基于这种数据结构的应用问题。(3) 程序代码的优化工作应交给编译器来做,程序设计时应首先考虑程序代码的清晰性、简明性、可读性、正确性、以至于可维护性。(6) 输出中间结果只是在调试程序时才有用,其它时候输出大量中间结果,不但浪费资源,而且给使用者造成麻烦。(8) 从文件输入数据时,应当使用文件结束符来判断输入的结束,使用计数方法判断输入结束不一定是最佳方式。(9) 程序中的注释是必须的,不是可有可无的。
四、答案:正确的叙述有:(1)、(2)、(3)、(4)、(8)。
说明:(1) 使用高级语言编写的程序模块化、结构化程度都比较好,可读性强,容易测试。(2) 程序测试本身应当是一个程序的执行过程,而不是静态的逻辑分析,其目的是发现程序中潜藏的错误。(3) 连锁式分支结构有n个判定,其路径数有2n条,因此当n = 8时程序中总的路径数有28条。(4) 白盒测试基于程序的内部结构设计测试用例,可以不考虑程序的功能要求。(8) 由于在等价类的边界上最容易出错,所以边界值分析方法选取输入∕输出等价类的边界值作为测试用例,可以有效地查错。
不正确的叙述,如(5) 采用一次性集成方式进行模块组装,往往成功的可能性低,而且出现错误时,不容易确定在什么地方出了问题,因此应采用增殖式集成方式,可以把出错的范围局限到少数模块中间。(6) 测试的实践表明,对一批模块进行测试,发现错误多的模块中残留的错误也多,因此必需注意这一现象,弄清哪些模块问题发现得多,对这些模块重点测试。(7) 好的测试用例是能够发现新错误的测试用例,发现不了问题的测试用例就不是好的测试用例,用它们做测试是浪费时间和金钱。(9) 等价类划分法是选择输入等价类的代表值作为测试用例,而因果图法才是考虑了各等价类之间取值的组合情况及可能的结果来设计测试用例的。(10) 语句覆盖法可能查不出在判定中逻辑运算符使用有误时产生的错误。而判定覆盖法则可能查不出在判定中某些条件中关系运算符使用有误时产生的错误。
五、答案:正确的叙述有:(3)、(5)、(7)、(8)、(10)
说明:(3) 尽可能在软件生产过程中保证各阶段文档的正确性,对于保证软件的可靠性、功能性等有相当大的作用,这样可减少用户提出维护请求的可能,即使要更新,工作的难度和工作量也会降低。(5) 选择时间效率和空间效率尽可能高的算法,可以让编程者把注意力集中在提供程序的正确性、可理解性、可修改性、可测试性、可使用性等方面,从而提高可维护性,不必为追求效率而把程序编写得让人看不懂。(7) 如果程序结构设计得较好,层次结构合理,在维护时理解程序和修改程序容易,不易出错。(8) 使用维护工具或支撑环境可以大大降低维护的工作量。(10) 用高级语言编写程序,易读易懂,可以提高可维护性。
不正确的叙述,如(1) 在需求分析时主要考虑软件要“做什么?”这一阶段对可维护性可以提出要求,要达到什么指标,而如何实现可维护性,是在设计和实现阶段考虑的问题。(2) 在程序中加入注释,这是提高程序可读性,从而提高可维护性的重要手段,不能因为测试通过就删去它们。(9) 在软件概要设计时,对产生的程序模块结构的评价方法就是看模块之间的耦合(联系)是否松散。如果联系密切,这样的结构各部分牵连太多,是不好的。(4) 因此在编程时尽可能用参数表,而不应当用全局变量来传送信息。(6) 尽可能利用硬件的特点,这样的程序可移植性很差,自然维护起来就相当困难了。(11) 增加维护人员会降低维护的生产率,有可能对维护进度带来不利的影响。
六、答案:(1) 结构化的程序流程图:
word/media/image1.gif
word/media/image2.gif
(2) N-S图:
word/media/image3.gif
(3) McCabe环路复杂性度量V(G) = 判定语句个数+1 = 8