文档视界 最新最全的文档下载
当前位置:文档视界 › 软件工程第三章习题及参考答案

软件工程第三章习题及参考答案

软件工程第三章习题及参考答案
软件工程第三章习题及参考答案

第三章习题及参考答案

1、用逐步求精方法解决下述得更新顺序主文件得问题。

美国某杂志社需要一个软件,以更新存有该杂志订户姓名、地址等数据得顺序主文件。共有插入、修改与删除等3种类型得事务,分别对应于事务代码1、2与3。也就就是说,事务类型如下:

类型1:INSERT(插入一个新订户到主文件中)

类型2:MODIFY(修改一个已有得订户记录)

类型3:DELETE(删除一个已有得订户记录)

事务就是按订户名字得字母顺序排序得。如果对一个订户既有修改事务又有删除事务,则已对那个订户得事务排好次序了,以便使修改发生在删除之前。

2.分析图3、1所示得层次图,确定每个模块得内聚类型。

3.分析图3、2,确定模块之间得耦合类型。

在图3、2中已经给模块之间得接口编了号码,表3、1描述了模块间得接口。

4、假设您在一所职业高中工作,负责该校信息系统得建设与维护。财务科长请您研究用学校拥有得微型计算机生成工资明细表与各种财务报表得可能性。请详细描述您用结构化分析方法分析上述问题得过程。用面向数据流方法设计工资支付系统得软件结构。

5.用3种方法计算图3、3所示流图得环形复杂度。

6、图3、4就是用程序流程图描绘得程序算法,请把它改画为等价得盒图。

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)用判定树表示手续费得计算方法。

8、画出下列伪码程序得程序流程图与盒图。

START

IFPTHEN

WHILEqDO

f

ENDDO

ELSE

BLOCK

g

n

ENDBLOCK

ENDIF

STOP

9、图3、5给出得程序流程图代表一个非结构化得程序,请问:

(1)为什么说它就是非结构化得?

(2)设计一个与它等价得结构化程序。

(3)在(2)题得设计中您使用附加得标志变量flag了吗?若没用,请再设计一个使用flag得程序;若用了,请再设计一个不用flag得程序。

10、研究下面给出得伪码程序,要求:

(1)画出它得程序流程图;

(2)它就是结构化得还就是非结构化得?说明您得理由;

(3)若就是非结构化得,则

(a)把它改造成仅用三种控制结构得结构化程序;

(b)写出这个结构化设计得伪码;

(c)用盒图表示这个结构化程序。

(4)找出并改正程序逻辑中得错误。

参考答案

1、答:解决任何问题之前都必须首先理解问题,对问题理解得越深入,解决起来也就越容易。为了获得对顺序主文件更新问题得直观、具体得认识,首先设想一个典型得主文件(称为旧得主文件)、一个事务文件与更新后得到得新得主文件及异常情况报告,如图3、8所示。

为了简单起见,在图3、8中忽略了主文件与事务文件中所包含得订户地址信息。从图3、8可以瞧出,更新顺序主文件系统有下述2个输入文件:

①旧得主文件(由包含订户姓名、地址信息得记录组成);

②事务文件。

系统还有3个输出文件:

①新得主文件;

②异常报告;

③摘要与工作结束信息。

图3、9描绘了设想得顺序主文件更新系统得概貌。

然后用逐步求精方法设计图3、9中关键得黑盒子“更新主文件”得实现算法。逐步求精方法实质上就是“自顶向下”得设计方法,它通过不断分层细化解决问题得算法来设计软件。它不像“各个击破”技术那样把整个问题分解为若干个重要程序相同得子问题。

在用逐步求精方法设计软件得过程中,软件得某个特定方面得重要性在一次又一次得求精中就是变化得。最初,某个问题可能无关紧要,但后来同样得问题会变得相当重要。换句话说,可以把逐步求精方法瞧作就是建立某个阶段内需要解决得各种问题得优先级得一种技术。它能确保每个问题都在恰当得时间得到解决,而且在任何时刻都不需要同时解决7个以上问题。使用逐步求精方法设计软件得难点在于,在当前得求精步骤中确定哪些就是必须处理得重要事项,哪些事项应该推迟到后面得求精步骤中去处理。

作为对“更新主文件”得第一步求精,我们把它分解为3个处理框,分别称为“输入”、“处理”与“输出”,如图3、10所示。

在这个设计步骤中假设,当“处理”需要一个记录时,我们能够在那个时候输入正确得记录。同样,我们也能够在当时把正确得记录写入到正确得文件中。也就就是说,在把逐步求精方法法运用到解决更新主文件这个问题时,我们就是把输入与输出这两方面得问题暂时分离出去,集中精力设计“处理”得算法。

为了搞清楚怎样按照事务文件得指示,更新旧得主文件产生新得主文件,也就就是说,为了设计出处理得算法,让我们再一次研究图3、8所示得例子。把第一个事务记录(Brown)得关键字与第一个旧得主文件记录(Abel)得关键字相比较。因为

Brown按字母顺序排在Abel得后面,把Abel记录不加更改地写入新得主文件后,读取下一个旧得主文件记录(Brown)。现在,事务记录得关键字与旧得主文件记录得关键字相同,又因为事务得类型就是3(删除),所以必须删除Brown记录,这可通过不把Brown记录复制到新得主文件中来实现。接下来读取下一个事务记录(Haris)与下一个旧得主文件记录(James),分别在各自得缓冲区里覆盖Brown记录,因为Haris在James之前,而且事务类型为1(插入),所以把Haris记录写到新得主文件中以实现插入。读取下一个事务记录(Jones),因为Jones在James之后,把James记录复制到新得主文件中,然后读取下一个旧得主文件记录,在旧文件记录缓冲区中得到Jones记录。现在事务记录关键字与旧得主文件记录关键字相同,

正如从事务文件中瞧到得那样,先修改旧得主文件记录(Jones记录),然后把它删除,以便读取下一个事务记录(Smith)与下一个旧得主文件记录(也就是Smith)。遗憾得就是,事务类型就是1(插入),但就是在旧得主文件中已经有Smith记录了,因此,在输入数据中有错误,将Smith记录写入异常报告中。更确切地说,将Smith事务记录写入异常报告,而把Smith旧得主文件记录写入新得主文件。

总结上述例子中揭示出得处理过程,得到表3、2所示得处理规则。

根据表3、2所示得处理规则,可以对图3、10中得“处理”框求精,得图3、11所示得第2步求精结果。为减少连线(特别就是为了减少交叉线),在这张流程图中用标有相同字母(例如,字母A)得圆代表应该连在一起得点。图中连到“输入”与“输出”方框得虚线表示把如何处理输入与输出得设计决定推迟到较晚得求精步骤中再做出,该图其余部分就是实现“处理”得流程图,或者说就是对处理事务得算法得初步求精结果。正如刚才讲过得,已把对输入与输出问题得考虑推迟了,此外,还没有规定文件结束得条件,也没有规定遇到出错条件时应该怎样处理。逐步求精方法得优点就在于可以把这类问题推迟到后面得求精步骤中去解决。

下一个设计步骤就是求精图3、11中得“输入”与“输出”两个处理框,得到图3、12。在这个设计步骤中仍然没有处理到文件结束得条件,也没有写入工作结束得信息,这些设计工作可以在后面得求精步骤中完成。使用逐步求精方法设计软件时,每完成一个求精步骤都必须对这个求精步骤得出得设计结果仔细审查,没有发现错误才能进行下一个求精步骤得设计工作,如果发现了错误则应该及时纠正。审查图3、12可以发现,该设计包含一个严重错误。考虑图3、8中给出得数据可以发现这个错误。假设当前得事务就是2Jones,也就就是修改Jones记录,并且当前得旧得主文件记录就是Jones。在图3、12得设计中,因为事务记录得关键字与旧得主文件记录得关键字相同,沿最左边得路径到达“测试事务类型”判定框。因为当前得事务类型就是“修改”,所以修改旧得主文件记录并把修改后得记录写入新得主文件。然后读取下一个事务记录,该记录就是3Jones,也就就是删除Jones记录,但就是,已经把修改后得Jones记录写入新得主文件记录了。

在用逐步求精方法设计软件得过程中对每个求精步骤得出得设计结果都进行严格审查得好处就是,一旦发现了错误,不必从头开始重做一遍,只需回到前一

步得设计结果,从那里开始重新设计即可。在本设计中,第二步求精得结果(见图3、11)就是正确得,可以把它作为第三步求精得基础。

正如刚才讲过得,图3、12所示设计得错误在于,当事务类型为2(修改)时没有考虑下一个事务得影响,就把修改后得主文件记录写入新得主文件了。为了改正

上述错误,我们采用“前瞻一步”得策略,也就就是说,只有在分析了一个事务记录得下一个事务记录之后,才能处理该事务记录。更具体地说,当一个事务记录得类型为“修改”时,修改缓冲区中得旧主文件记录,然后读取下一个事务记录,如果刚读出得事务记录得关键字与缓冲区中得旧主文件记录得关键字不相同,则把缓冲区中已经修改过得旧主文件记录写入新得主文件;如果新读出得事务记录得关键字与主文件记录关键字相同,则依据新得事务记录得类型来处理缓冲区中得旧主文件记录。由于事务文件就是预先排好序得,当新读出得事务记录与主文件记录有相同得关键字时,也就就是新读出得事务记录与前一个事务记录就是针对同一个订户得事务时,新读出得事务记录得类型只可能就是“修改”或“删除”(已知前一个事务记录得类型就是“修改”)。采用“前瞻一步”得设计策略,得出图3、13所示得第三步求精结果。

为简单起见,当针对同一位订户有多个事务时,仅考虑了在修改事务之后又有修改事务或删除事务得情况。实际上,如果对事务文件先进行预处理,使得针对每位订户最多只有一个事务,则更新顺序主文件得算法可大大简化。下面列出对事务文件可能做得一些预处理:如果针对同一个订户有多个修改事务,则仅保留最后

一个修改事务(本问题中得主文件记录仅有订户姓名与地址两项信息,多次修改地址则以最后一次修改为准);若插入一位新订户记录后,又有零或多个修改事务,最后就是一个删除事务,则略去这一系列事务;若对一个订户记录既有修改事务又有删除事务,则略去修改事务,仅保留删除事务;若针对一位订户既有插入事务又有修改事务,则用修改事务得内容(地址信息)更正插入事务得内容(地址信息),然后删去这个修改事务。

在第4次求精得过程中,应该考虑迄今为止被忽略得诸如打开与关闭文件这样得细节问题。采用逐步求精方法设计软件时,这样得细节问题就是在基本算法被完全设计出来之后,最后处理得。显然,不打开与关闭文件,程序就是不可能正常运行得,也就就是说,这些问题就是必须处理得,但就是,重要得就是,处理这类细节问题应该在设计得最后阶段进行。在设计得早期阶段,设计者集中精力关注得7个左右问题就是不应该包括打开与关闭文件这样得细节问题得。打开与关闭文件与特定软件得设计无关,它们只就是作为任何设计得一部分得实现细节。然而,在后面得求精步骤中,打开与关闭文件变得重要起来,必须加以处理。

从前述设计过程可知,可以把逐步求精方法瞧作就是建立在某个阶段内需要解决得各种问题得优先级得一种技术。逐步求精方法能够确保每个问题都得到解决,并且就是在合适得时间解决,在任何时刻都不需要同时考虑7个以上得问题。

2、答:从图

3、1所示得层次图可以瞧出,这个程序得功能就是计算若干个指定地点得每日平均温度。变量sum保存某地一天之内在指定得时间取样点得温度之与。程序运行时首先初始化变量sum并打开文件,然后读取地点、时间与温度等原始数据,创建用于保存这些数据得温度记录,接下来计算特定地点得日平均温度,存储温度记录。重复调用“读取地点、时间与温度”、“创建新得温度记录”、“计算特定地点得日平均温度”与“存储温度记录”等模块,直至计算出并保存好所有指定地点得日平均温度。最后,打印平均温度并关闭文件。

从上述叙述可知,“计算多个地点得日平均温度”、“读取地点、时间与温度”、“创建新得温度记录”、“计算特定地点得日平均温度”与“存储温度记录”等5个模块,每个都完成一个单一得功能,模块内所有处理元素都为完成同一个功能服务,彼此结合得十分紧密,因此,这5个模块得内聚类型都就是功能内聚。

初瞧起来,由于初始化变量sum与打开文件这两个操作都就是在程序运行得初始阶段完成得,“初始化变量sum并打开文件”这个模块得内聚类型似乎就是时间

内聚。但就是,初始化变量sum就是本程序特有得操作,而打开文件就是硬件要求得操作,就是任何使用文件得程序都包含得一个操作,并非本程序特有得操作。当可以分配两个或更多个不同级别得内聚类型给一个模块时,规则就是分配最低级别得内聚类型给该模块。因此,“初始化变量sum并打开文件”这个模块得内聚类型就是偶然内聚。同理,“关闭文件并打印平均温度”这个模块得内聚类型也就是偶然内聚。这个模块得内聚类型也就是偶然内聚。

3、答:综合分析图3、2与表3、1所提供得信息可知各个模块之间得耦合情况。例如,当模块p调用模块q时(接口1),它传递了一个参数———飞机类型。当模块q把控制返还给模块p时,它传回一个状态标志。

某些模块之间得耦合类型就是明显得,例如,模块p与q之间(接口1)、模块r 与t之间(接口5)及模块s与u之间(接口6)都就是数据耦合,因为它们传递得都就是一个简单变量。如果两个模块中得一个模块给另一个模块传递控制元素,也就就是说,如果一个模块明显地控制另一个模块得逻辑,则它们之间具有控制耦合。例如,当给具有逻辑内聚得模块传递功能代码时就传递了控制元素。另一个控制耦合得例子就是把控制开关作为一个参数传递。图3、2中模块q调用模块r时(接口3)传递一个功能代码,因此,这两个模块之间就是控制耦合。

图3、2右侧文字说明,模块p、t与u更新同一个数据库,因此,它们之间具有公共环境耦合。

当模块p调用模块s时(接口2),如果模块s使用或更新模块p传递给它得零件清单中得所有元素,则模块p与s之间得耦合就是数据耦合;但就是,如果模块s 只访问该清单中得一部分元素,则模块p与s之间得耦合就是特征耦合。模块q

与s之间(接口4)得耦合情况与此类似。由于图3、2与表3、1中给出得信息尚不足以准确地描述各个模块得功能,所以不能确定这两对模块之间得耦合就是数据耦合还就是特征耦合。

4、答:我们在解答第2章第11题得过程中,已经用结构化分析方法详细地分析了这个工资支付系统,并且认真审查了结构化分析所得出得结果。因此,可以从图2、19所示得工资支付系统完整数据流图出发,设计工资支付系统得结构。

从图2、19可以瞧出,事务数据与人事数据沿着两条输入通路进入系统,输出数据沿着一条输出通路离开系统,数据流图中没有明显得事务中心。因此,从整体上瞧

这个数据流图具有变换流得基本特征。

接下来应该分析确定输入流与输出流得边界,以孤立出变换中心。“取数据”与“收集数据”显然位于输入流中。“审核数据”仅仅对收集来得事务数据进行校核,并不对数据进行加工处理,它得基本功能就是确保输入得事务数据就是合理得,因此,也应该归入输入流得行列。“更新人事数据”由人事科通过另一个程序完成,不属于本系统应完成得功能。“印表格”显然应该位于输出流中。“分发工资明细表”由人工完成,它不就是工资支付程序得一部分。综上所述,得出画有流边界得数据流图,如图3、14所示。

下一个设计步骤就是,完成“第一级分解”。所谓第一级分解就就是确定系统得总体控制结构。通常,变换分析得出得系统高层结构就是一个“三叉”得控制结构,针对工资支付系统得出得高层控制结构如图3、15所示。

再下一个设计步骤就是,完成“第二级分解”。所谓第二级分解,就就是把数据流图中得每个处理映射成软件结构中得一个适当得模块。变换分析得映射规则就是,从变换中心得边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中“输入信息处理控制模块”控制下得一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受“输出信息处理控制模块”控制得一个低层模块;最后把变换中心内得每个处理映射成受“变换中心控制模块”控制得一个低层模块。

对于工资支付系统来说,第二级分解得结果如图3、16所示。

最后一个设计步骤就是,对工资支付系统得初步设计结果进行优化。结合工资支付系统得功能研究图3、16所示得系统初步结构可以瞧出,“接收工资数据”这个控制模块就是多余得:“取数据”模块本身就具有根据需要读取相应数据得功能,没必要在它上面再加一个控制模块。此外,完成具体输出功能得模块只有一个,无须再额外设置一个输出信息处理控制模块,因此应该去掉“印出计算结果”模块。优化后得工资支付系统结构如图3、17所示。

5、答:计算环形复杂度得方法主要有下述3种。

(1)环形复杂度等于流图中得区域数

图3、3所示流图共有5个区域,因此它得环形复杂度等于5。图3、18用罗马数字标注出该流图中得区域,其中区域Ⅰ为图得外部区域。

(2)环形复杂度等于流图中边得条数减去结点数之后再加2

图3、3所示流图共有11条边,8个结点,所以它得环形复杂度为

(3)环形复杂度等于程序中得判断数加1

流图中有2条输出弧得结点(例如,图3、3中得结点c与f)对应于程序中得1个判断,有n(n>2)条输出弧得结点(例如,图3、3中得结点a有3条输出弧)对应于程序中得n-1个判断。因此,图3、3所示流图得环形复杂度为

2×1+1×(3-1)+1=5

6、答:分析图3、4可以瞧出,该处理过程由顺序执行得3个程序块组成:首先执行处理a,然后执行一个DO-UNTIL型循环,最后执行处理j。

DO-UNTIL型循环得循环体就是处理b与一个IF-THEN-ELSE型分支结构,循环结束条件为x8。其中,IF-THEN-ELSE型分支结构得分支条件就是x1,THEN部分就是处理f与另一个分支条件为x6得IF-THEN-ELSE型分支结构;ELSE部分就是一个CASE型多分支结构。……

这样一层一层地分析下去,可以画出图3、19所示得与图3、4等价得盒图。

7、答:

8、答:(1)从该伪码程序转变成得程序流程图示于图3、22中。

(2)由该伪码转变成得盒图如图3、23所示。

9、答:(1)通常所说得结构化程序,就是按照狭义得结构程序得定义衡量,符合定义规定得程序。图3、5所示得程序得循环控制结构有两个出口,显然不符合狭义得结构程序得定义,因此就是非结构化得程序。

(2)使用附加得标志变量flag,至少有两种方法可以把该程序改造为等价得结构化程序,图3、24所示盒图描绘了等价得结构化程序。

(3)不使用flag把该程序改造为等价得结构化程序得方法如图3、25所示。

10、答:(1)根据这个伪码程序画出得程序流程图如图3、26所示。

相关文档