IfTABLE(I)>ITEMSetFINISHto(I-1)
If(FINISH-START)>1gotoLOOP
IfTABLE(START)=ITEMgotoFOUND
IfTABLE(FINISH)=ITEMgotoFOUND
SetFLAGto0
GotoDONE
FOUND:
SetFLAGto1
DONE:
Exit
(1)画出程序流程图。
(2)程序是结构化吗?
说明理由。
(3)若程序是非结构化的,设计一个等价的结构化程序并且画出流程图。
(4)此程序的功能是什么?
它完成预定功能有什么隐含的前提条件。
答:
(1)该程序流程图如下:
(2)该程序不是结构化的,结构化的程序只有一个入口和一个出口,而该程序的流程途中有两个出口。
(3)等价的结构化程序的流程图如下:
(4)此程序有二分查找的功能,它完成预定功能的隐含前提条件是现有序列为从小到大顺序排好的有序序列。
6-7.某交易所规定给经纪人的手续费计算方法如下:
总手续费等于基本手续费加上与交易中的每股价格和股数有关的附加手续费。
如果交易总金额少于1000元,则基本手续费为交易金额的8.4%;如果交易总金额在1000元到10000元之间,则基本手续费为交易金额的5%,再加34元;如果交易总金额超过10000元,则基本手续费为交易金额的4%加上134元。
当每股售价低于14元时,附加手续费为基本手续费的5%,除非买进、卖出的股数不是100的倍数,在这种情况下附加手续费为基本手续费的9%。
当每股售价在14元到25元之间时,附加手续费为基本手续费的2%,除非交易的股数不是100的倍数,在这种情况下附加手续费为基本手续费的6%。
当每股售价超过25元时,如果交易的股数零散(即,不是100的倍数),则附加手续费为基本手续费的4%,否则附加手续费为基本手续费的1%。
要求:
(1)用判定表表示手续费的计算方法;
(2)用判定树表示手续费的计算方法。
答:
(1)判定表如图6-6所示:
图6-6判定表
(2)判定树如图6-7所示:
图6-7判定树
6-8.画出下列伪码程序的流图,计算它的环形复杂度。
你觉得这个程序的逻辑有什么问题吗?
CEXAMPLE
LOOP:
DOWHILEX>0
A=B+1
IFA>10
THENX=A
ELSEY=Z
ENDIF
IFY<5
THENPRINTX,Y
ELSEIFY=2
THENGOTOLOOP
ELSEC=3
ENDIF
ENDIF
G=H+R
ENDDO
IFF>0
THENPRINTG
ELSEPRINTK
ENDIF
STOP
答:
(1)该伪码的流程图如图6-8所示:
图6-8程序流程图
根据该程序流程图,可得该程序流图如图6-9所示:
图6-9程序流图
环形复杂度V(G)=流图中的区域数
=流图中判定结点数目+1=5+1=6
(2)该算法问题在于控制最外层循环的变量Z不仅没有经过初始化,并且在该循环内部没有任何有可能该变Z的语句。
因此,该段代码中的WHILE循环部分代码要么不会执行,要么可能出现死循环。
6-9:
把统计空格程序的jackson图改画为等价的程序流程图和盒图
第七章
7-4:
回答下列问题。
(1)什么是模块测试和集成测试?
它们各有什么特点?
(2)假设有一个由1000行FORTRAN语句构成的程序(经编译后大约有5000条机器指令),估计在对它进行测试期间将发现多少个错误?
为什么?
(3)设计下列伪码程序的语句覆盖和路径覆盖测试用例。
解答:
(1)模块测试:
保证每个模块能完成一个清晰定义的子功能而且和统计其他模块的功能之间没有相互依赖的关系。
集成测试:
又称为组装测试,就是将软件产品中各个模块组装起来,检查其接口是否存在问题,以及组装后的整体功能、性能表现
(2)经验表明,在类似的程序中,单位长度里的错误数ET/IT近似为常数。
美国的一些统计数字表明,通常:
0.005<=ET/IT<=0.02,即在测试之前,每1000条指令中大约有5~20个错误。
所以,在对1000行FORTRAN语句构成的程序进行测试期间将发现的错误的个数大约有25~100个。
(3)该伪码程序对应的程序流程图如下:
从上到下每个判定依次命名为a、b、c:
7-8:
对一个包含10000条机器指令的程序进行一个月集成测试后,总共改正了15个错误,此时MTTF=10h;经过两个月测试后,总共改正了25个错误(第二个月改正了10个错误),MTTF=15h。
要求:
(1)根据上述数据确定MTTF与测试时间之间的函数关系,画出MTTF与测试时间τ的关系曲线。
在画这条曲线时做了什么假设?
(2)为做到MTTF=100h,必须进行多长时间的集成测试?
(3)当集成测试结束时总共改正了多少个错误,还有多少个错误潜伏在程序中?
解答:
(1)因为平均无故障时间MTTF与测试时间τ之间存在线性关系,即MTTF=a+bτ,
由于:
10=a+b,15=a+2b,
得到:
a=5,b=5
故:
平均无故障时间MTTF与测试时间τ之间存在线性关系为:
MTTF=5+5τ
(2)为做到MTTF=100h,有方程:
100=5+5τ,故τ=19
即必须进行19个月的集成测试。
(3)由于经验:
平均无故障时间与单位长度程序中剩余的错误数成反比,故有:
MTTF=10000/(K*(ET-EC(τ)))
由于:
10=10000/(K*(ET-15)),15=10000/(K*(ET-25))
得到:
ET=45,K=33.33
当集成测试结束时,MTTF=100h,有:
100=10000/(33.33*(45-EC(19)))
故:
EC(19)=42,即当集成测试结束时总共改正了42个错误,还有45-42=3个错误潜伏在程序中。
7-9:
如对一个长度为100000条指令的程序进行集成测试期间记录下下面的数据:
(a)7月1日:
集成测试开始,没有发现错误。
(b)8月2日:
总共改正100个错误,此时MTTF=0.4h
(c)9月1日:
总共改正300个错误,此时MTTF=2h
根据上列数据完成下列各题。
(1)估计程序中的错误总数。
(2)为使MTTF达到10h,必须测试和调试这个程序多长时间?
(3)画出MTTF和测试时间τ之间的函数关系曲线。
解答:
(1)据估算平均无故障时间MTTF的公式有:
1/K(Et/100000-100/100000)=0.4
1/K (Et/100000-300/100000)=2
得:
K=1000,Et=350 即程序中的错误总数达350。
(2)当MTTF=10h时,有
1/K(350/100000-Ec/100000)=10
得:
Ec=340.按七八月分测试改错进度估算,还需进行2个月的集成测试。
(3)MTTF和测试时间τ之间的函数关系曲线如下:
7-10:
在测试一个长度为24000条指令的程序时,第一个月由甲、乙两名测试员各自独立测试这个程序。
经一个月测试后,甲发现并改正20个错误,使MTTF达到10h。
与此同时,乙发现24个错误,其中6个甲也发现了。
以后由甲一个人继续测试这个程序。
问:
(1)刚开始测试时程序中总共有多少个潜藏的错误?
(2)为使MTTF达到60h,必须再改正多少个错误?
还需用多长测试时间?
(3)画出MTTF与集成测试时间τ之间的函数关系曲线。
解答:
(1)本题中采用的是分别测试法,测试前程序中的错误总数:
B0=B1*B2/bc=20*24/6=80
(2)由于经验:
平均无故障时间与单位长度程序中剩余的错误数成反比,故有:
MTTF=24000/(K*(ET-EC(τ)))
由于:
10=24000/(K*(80-20))
得到:
K=40
为使MTTF达到60h,有:
60=24000/(40*(80-EC(τ)))
故:
EC(τ)=70,即总共需要改正70个错误,由于测试员甲和乙分别测试时,测试员甲已经更正了20个错误,以后由甲一个人继续测试这个程序,因此,还需要更正70-20=50个错误。
补充:
【复旦大学2001年博士研究生入学考试试题】某模块的程序流程图如下。
试分别根据判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖等覆盖标准设计最少的测试用例。
$:
从上到下给每个判定依次编号为a、b。
路径覆盖与判定覆盖或判定/条件覆盖一致。
第八章
8-1:
软件的可维护性与哪些因素有关?
在软件开发过程中应该采取哪些措施来提高软件产品的可维护性?
(1)1可理解性2可测试性3可修改性4可移植性5可重用性
8-2:
假设自己的任务是对一个已有的软件做重大修改,而且只允许从下述文档中选取两份:
(a)程序的规格说明; (b)程序的详细设计结果(自然语言描述加上某种设计工具表示); (c)源程序清单(其中有适当数量的注解)。
应选取哪两份文档?
为什么这样选取?
打算怎样完成交给自己的任务?
解答:
(1)选AC
(2)原因:
首先需要对软件做修改,就必须得有源代码,C是必选。
其次,软件规格说明书作为产品需求的最终成果,具有综合性,包括了所有的需求;其中主要的有:
任务概述,数据描述,功能需求,性能需求,运行需求,其他需求;这些都是修改软件必须参考的内容,故选择A
综上,根据规格说明再结合源程序以及源程序里的注释,足够对软件进行修改。
(3)结合需求,规格说明书以及源代码,按照软件工程的方法一步步去理解,修改,测试,调试代码。
第九章
9-5:
什么是模型?
开发软件为何要建模?
所谓模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。
建模的目的主要是为了减少复杂性。
9-6:
什么是对象模型?
建立对象模型时主要使用哪些图形符号?
这些符号的含义是什么?
(1)对象模型表示静态的、结构化的系统的“数据”性质。
它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。
(2)通常使用UML提供的类图来建立对象模型。
(3)在UML中术语“类“的实际含义是,一个类及属于该类的对象
9-7:
什么是动态模型?
建立动态模型时主要使用哪些图形符号?
这些符号的含义是什么?
(1)动态模型表示瞬时的、行为化的系统的“控制”性质, 它规定了对象模型中 的对象的合法变化序列。
(2)通常,用 UML 提供的状态图来描绘对象的状态、触发状态转换的事件以及对 象的行为(对事件的响应)。
每个类的动态行为用一张状态图来描绘, 各个类的状态图通过共享事件合并 起来,从而构成系统的动态模型。
也就是说,动态模型是基于事件共享而互相关 联的一组状态图的集合。
9-8:
什么是功能模型?
简历功能模型时主要使用哪些图形符号?
(1)功能模型表示变化的系统的功能性质,它指明了系统应该做什么,因此更直接地反映了用户对目标系统的需求。
(2)功能模型由一组数据流图组成。
在面向对象方法学中,数据流图远不如在结杂对象提供的服务, 简单的处理(或用例)对应于更 基本的对象提供的服务。
有时一个处理(或用例)对应多个服务,也有一个服务对 应多个处理(或用例)的时候。
(1)数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的 对象。
(2)数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个 对象。
(3)用例图中的行为者,可能是对象模型中的对象。
(4)功能模型中的处理(或用例)可能产生动态模型中的事件。
(5)对象模型描述了数据流图中的数据流、 数据存储以及数据源点/终点的结构。
第十三章
13-4:
假设自己被指定为项目负责人,任务是开发一个应用系统,该系统类似于自己的小组以前做过的那些系统,但是规模更大且更复杂一些。
客户已经写出了完整的需求文档。
应选用哪些项目组结构?
为什么?
打算采用哪种(些)软件过程模型?
为什么?
解答:
根据上述,应该主程序员组的项目组结构。
因为项目小组已经开发过类似的系统,开发人员已经具备了一定的经验。
这个时候开发过程遇到的难题不会很多,所以应该减少通信开销,充分发挥技术骨干的作用,统一意志统一行动,提高生产率,加快开发进度。
应该采用“已定义级”的软件过程模型。
因为客户已经写出了完整的需求文档,而且项目小组已经有过类似的开发经验。
软件过程已经文档化和标准化。
这种过程模型是基于在软件机构中对已定义的过程模型的活动、人员和职责都有共同的理解。
13-5:
13-6:
13-7:
什么是软件质量?
叙述它与软件可靠性的关系。
概括的说,软件质量就是“软件与明确地和隐含地定义的需求相一致的程度”。
更具体的说,软件质量是软件与明确的叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。
13-10:
什么是基线,为什么要建立基线?
(1)基线是软件文档或源码(或其它产出物)的一个稳定版本,它是进一步开发的基础。
(2)1、重现性
重现性是指及时返回并重新生成软件系统给定发布版的能力,或者是在项目中的早些时候重新生成开发环境的能力。
2、可追踪性
可追踪性建立项目工件之间的前后继承关系。
其目的在于确保设计满足要求、代码实施设计以及用正确代码编译可执行文件。
3、报告
报告来源于一个基线内容同另一个基线内容的比较。
基线比较有助于调试并生成发布说明。
建立基线后,需要标注所有组成构件和基线,以便能够对其进行识别和重新建立。
13-11:
配置审计和技术复审有何不同?
可否把它们的功能放在一次复审中完成?
正式的技术复审关注被修改后的配置对象的技术正确性。
复审者审查该对象以确定它与其他软件配置项的一致性,并检查是否有遗漏或副作用。
软件配置审计通过评估配置对象的那些通常不在复审过程中考虑的特征,而成为对正式技术复审的补充。
13-12:
CMM的基本思想是什么?
为什么要把能力成熟度划分成5个等级?
答:
(1)CMM指能力成熟度模型,其基本思想是:
由于问题是由人们管理软件过程的方法不当引起的,所以新软件技术的运用并不会自动提高软件的生产率和质量。
(2)由于对软件过程的改进,是在完成了一个又一个小的改进步骤基础上不断进行的渐进过程,而不是一蹴而就的彻底革命。
所以CMM把软件过程从无序到有序的进化过程分成5个阶段。