软件工程第三章习题及参考答案.docx
- 文档编号:16307315
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:34
- 大小:889.58KB
软件工程第三章习题及参考答案.docx
《软件工程第三章习题及参考答案.docx》由会员分享,可在线阅读,更多相关《软件工程第三章习题及参考答案.docx(34页珍藏版)》请在冰点文库上搜索。
软件工程第三章习题及参考答案
第二章习题及参考答案
1■用逐步求精方法解决下述的更新顺序主文件的问题。
美国某杂志社需要一个软件,以更新存有该杂志订户姓名、地址等数据的顺序主文件。
共有插入、修改和删除等3种类型的事务,分别对应于事务代码1、2和3。
也就是说,事务类型如下:
类型1:
INSERT(插入一个新订户到主文件中)
类型2:
MODIFY(修改一个已有的订户记录)
类型3:
DELETE(删除一个已有的订户记录)
事务是按订户名字的字母顺序排序的。
如果对一个订户既有修改事务又有删除事务,则已对那个订户的事务排好次序了,以便使修改发生在删除之前。
2■分析图3.1所示的层次图,确定每个模块的内聚类型。
的H平也温度
初樹化变试sum
ftJKSr的
祁储隘腹
关闭文件井
并打开艾件
温度忙录
记录
打印平均SJK
程女咆点、
U耳捋定地点
的FT平匕用1煖
BX1计算多地点HI比丸度的程序
3■分析图3.2,确定模块之间的耦合类型。
在图3.2中已经给模块之间的接口编了号码,表3.1描述了模块间的接口
闻3.2—个程序的模块互连图
编号
■入
输出
1
E机类锻
狀态标志
2
飞机零件淸单
3
功能代码
4
飞机零件淸单
5
容件编号
零件制览商
6
零件编号
零件名称
4•假设你在一所职业高中工作,负责该校信息系统的建设与维护。
财务科长请你研究用学校拥有的微型计算机生成工资明细表和各种财务报表的可能性。
请详
细描述你用结构化分析方法分析上述问题的过程。
用面向数据流方法设计工资支付系统的软件结构。
5.用3种方法计算图3.3所示流图的环形复杂度。
©—*®—
图3V-个程序的流图
6.图3.4是用程序流程图描绘的程序算法,请把它改画为等价的盒图
图乳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)找出并改正程序逻辑中的错误。
COMMENT:
PR()(;R.\MSEARCHESFORFIRST、REFERENCES
TOATOPICINANINFORMATIONRETRIEVALSYSTEMWITHTTOTALENTRIES
INTPLTN
INPUTKEYWORD(S)FORTOPIC
1=()
MATCH=0
DOWHILEIWT
1=1+1
IFWORD=KEYWORD
THENMATCH=MATCH+1
STOREINBLFFER
END
IFMATCH=N
THEN(X)T()OLTPLT
END
END
IFN=0
THENPRINT'NOMATCH"
orrriT:
ELSECALLSUBROUTINETOPRINTBUFFERINFORMATION
EM)
参考答案
1.答:
解决任何问题之前都必须首先理解问题,对问题理解得越深入,解决起来也就越容易。
为了获得对顺序主文件更新问题的直观、具体的认识,首先设想一个典型的主文件(称为旧的主文件)、一个事务文件和更新后得到的新的主文件及异常情况报告,如图3.8所示。
为了简单起见,在图3.8中忽略了主文件和事务文件中所包含的订户地址信息。
从图3.8可以看出,更新顺序主文件系统有下述2个输入文件:
1旧的主文件(由包含订户姓名、地址信息的记录组成);
2
事务文件。
界常报色SmilJIi
图工*典舉的撕序主文件更新问題
系统还有3个输出文件:
1新的主文件;
2异常报告;
3摘要和工作结束信息。
图3.9描绘了设想的顺序主文件更新系统的概貌
然后用逐步求精方法设计图3.9中关键的黑盒子“更新主文件”的实现算法。
逐步求精方法实质上是“自顶向下”的设计方法,它通过不断分层细化解决问题的算法来设计软件。
它不像“各个击破”技术那样把整个问题分解为若干个重要程序相同的子问题。
在用逐步求精方法设计软件的过程中,软件的某个特定方面的重要性在一次又一次的求精中是变化的。
最初,某个问题可能无关紧要,但后来同样的问题会变得相当重要。
换句话说,可以把逐步求精方法看作是建立某个阶段内需要解决的各种问题的优先级的一种技术。
它能确保每个问题都在恰当的时间得到解决,而且在任何时刻都不需要同时解决7个以上问题。
使用逐步求精方法设计软件的难点在于,在当前的求精步骤中确定哪些是必须处理的重要事项,哪些事项应该
推迟到后面的求精步骤中去处理。
作为对“更新主文件”的第一步求精,我们把它分解为3个处理框,分别称为“输入”、“处理”和“输出”,如图3.10所示。
曲i4辽ft
图工10第一步求精
在这个设计步骤中假设,当“处理”需要一个记录时,我们能够在那个时候输入正确的记录。
同样,我们也能够在当时把正确的记录写入到正确的文件中。
也就是说,在把逐步求精方法法运用到解决更新主文件这个问题时,我们是把输
入和输出这两方面的问题暂时分离出去,集中精力设计“处理”的算法。
为了搞清楚怎样按照事务文件的指示,更新旧的主文件产生新的主文件,也
就是说,为了设计出处理的算法,让我们再一次研究图3.8所示的例子。
把第一
个事务记录(Brown)的关键字与第一个旧的主文件记录(Abel)的关键字相比较。
因为Brown按字母顺序排在Abel的后面,把Abel记录不加更改地写入新的主文件后,读取下一个旧的主文件记录(Brown)。
现在,事务记录的关键字与旧的主文件记录的关键字相同,又因为事务的类型是3(删除),所以必须删
除Brown记录,这可通过不把Brown记录复制到新的主文件中来实现。
接下来读取下一个事务记录(Haris)和下一个旧的主文件记录(Jame®,分别在各自的缓冲区里覆盖Brown记录,因为Haris在James之前,而且事务类型为1(插入),所以把Haris记录写到新的主文件中以实现插入。
读取下一个事务记录
(Jones,因为Jones在James之后,把James记录复制到新的主文件中,然后读取下一个旧的主文件记录,在旧文件记录缓冲区中得到Jones记录。
现在事务
记录关键字与旧的主文件记录关键字相同,正如从事务文件中看到的那样,先修
改旧的主文件记录(Jones记录),然后把它删除,以便读取下一个事务记录
(Smith)和下一个旧的主文件记录(也是Smith)。
遗憾的是,事务类型是1(插入),但是在旧的主文件中已经有Smith记录了,因此,在输入数据中有错误,将Smith记录写入异常报告中。
更确切地说,将Smith事务记录写入异常报告,而把Smith旧的主文件记录写入新的主文件。
总结上述例子中揭示出的处理过程,得到表3.2所示的处理规则。
表3.2处理规则
事务记录关键宁=1口的土文件记录关键字
L插入:
而出错信息
2.修改:
修改主文件记录
3一删除:
删除主文件记录〕
事务记录关键宁>1口的土文件记录关键字
把旧的主文件记录复制到新的主丈件中
事务记录关键字<1口的土文件记录关键字
L插入:
把事务记录写入新的主文件
2.修改:
打印出错信息
3一删除:
打印出错信息
根据表3.2所示的处理规则,可以对图3.10中的“处理”框求精,得图3.11所示的第2步求精结果。
为减少连线(特别是为了减少交叉线),在这张流程图中用标有相同字母(例如,字母A)的圆代表应该连在一起的点。
图中连到“输入”和“输出”方框的虚线表示把如何处理输入和输出的设计决定推迟到较晚的
求精步骤中再做出,该图其余部分是实现“处理”的流程图,或者说是对处理事务的算法的初步求精结果。
正如刚才讲过的,已把对输入和输出问题的考虑推迟了,此外,还没有规定文件结束的条件,也没有规定遇到出错条件时应该怎样处理。
逐步求精方法的优点就在于可以把这类问题推迟到后面的求精步骤中去解决。
A
图第.步求精
下一个设计步骤是求精图3.11中的“输入”和“输出”两个处理框,得到图3.12。
在这个设计步骤中仍然没有处理到文件结束的条件,也没有写入工作结
束的信息,这些设计工作可以在后面的求精步骤中完成。
使用逐步求精方法设计
软件时,每完成一个求精步骤都必须对这个求精步骤得出的设计结果仔细审查,没有发现错误才能进行下一个求精步骤的设计工作,如果发现了错误则应该及时纠正。
审查图3.12可以发现,该设计包含一个严重错误。
考虑图3.8中给出的数据可以发现这个错误。
假设当前的事务是2Jones也就是修改Jones记录,并且当前的旧的主文件记录是Jones在图3.12的设计中,因为事务记录的关键字与旧的主文件记录的关键字相同,沿最左边的路径到达“测试事务类型”判定框。
因为当前的事务类型是“修改”,所以修改旧的主文件记录并把修改后的记录写入新的主文件。
然后读取下一个事务记录,该记录是3Jones也就是删除Jones
记录,但是,已经把修改后的Jones记录写入新的主文件记录了。
在用逐步求精方法设计软件的过程中对每个求精步骤得出的设计结果都进行严格审查的好处是,一旦发现了错误,不必从头开始重做一遍,只需回到前一步的设计结果,从那里开始重新设计即可。
在本设计中,第二步求精的结果(见图3.11)是正确的,可以把它作为第三步求精的基础。
正如刚才讲过的,图3.12所示设计的错误在于,当事务类型为2(修改)时没有考虑下一个事务的影响,就把修改后的主文件记录写入新的主文件了。
为了改正上述错误,我们采用“前瞻一步”的策略,也就是说,只有在分析了一个事务记录的下一个事务记录之后,才能处理该事务记录。
更具体地说,当一个事务记录的类型为“修改”时,修改缓冲区中的旧主文件记录,然后读取下一个事务记录,如果刚读出的事务记录的关键字与缓冲区中的旧主文件记录的关键字不相同,则把缓冲区中已经修改过的旧主文件记录写入新的主文件;如果新读出的事
务记录的关键字与主文件记录关键字相同,则依据新的事务记录的类型来处理缓冲区中的旧主文件记录。
由于事务文件是预先排好序的,当新读出的事务记录与主文件记录有相同的关键字时,也就是新读出的事务记录与前一个事务记录是针对同一个订户的事务时,新读出的事务记录的类型只可能是“修改”或“删除”
(已知前一个事务记录的类型是“修改”)。
采用“前瞻一步”的设计策略,得出图3.13所示的第三步求精结果。
更新主丈件
*
谏|日的主文件和爭另文件
T
I写工忡结嘲的倩息
为简单起见,当针对同一位订户有多个事务时,仅考虑了在修改事务之后又有修改事务或删除事务的情况。
实际上,如果对事务文件先进行预处理,使得针对每位订户最多只有一个事务,则更新顺序主文件的算法可大大简化。
下面列出对事务文件可能做的一些预处理:
如果针对同一个订户有多个修改事务,则仅保
留最后一个修改事务(本问题中的主文件记录仅有订户姓名和地址两项信息,多次修改地址则以最后一次修改为准);若插入一位新订户记录后,又有零或多个修改事务,最后是一个删除事务,则略去这一系列事务;若对一个订户记录既有修改事务又有删除事务,则略去修改事务,仅保留删除事务;若针对一位订户既有插入事务又有修改事务,则用修改事务的内容(地址信息)更正插入事务的内容(地址信息),然后删去这个修改事务。
在第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・14個有流边界的I贯支付系统数据沆图
下一个设计步骤是,完成“第一级分解”。
所谓第一级分解就是确定系统的总体控制结构。
通常,变换分析得出的系统高层结构是一个“三叉”的控制结构,针对工资支付系统得出的高层控制结构如图3.15所示。
计爲教职工
再下一个设计步骤是,完成“第二级分解”。
所谓第二级分解,就是把数据流图中的每个处理映射成软件结构中的一个适当的模块。
变换分析的映射规则是,从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射
成软件结构中“输入信息处理控制模块”控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受“输出信息处理控制模块”控制的一个低层模块;最后把变换中心内的每个处理映射成受“变换中心控制模块”控制的一个低层模块。
对于工资支付系统来说,第二级分解的结果如图3.16所示。
讣算敦职丁
匸贲|
按收一护
计讯丄儒
i[俅殊杲
1-
11
ttUiE常|T®
计岸超81
i年度般把
事务数抵卩竹其孔
图3.R工资支付系统的第二级分解
最后一个设计步骤是,对工资支付系统的初步设计结果进行优化。
结合工资
支付系统的功能研究图3.16所示的系统初步结构可以看出,“接收工资数据”这个控制模块是多余的:
“取数据”模块本身就具有根据需要读取相应数据的功能,没必要在它上面再加一个控制模块。
此外,完成具体输出功能的模块只有一个,无须再额外设置一个输出信息处理控制模块,因此应该去掉“印出计算结果”模
块。
优化后的工资支付系统结构如图3.17所示。
T.8T
计算正常
图工]7优化垢的匸资支付软件給构
5.答:
计算环形复杂度的方法主要有下述3种
(1)环形复杂度等于流图中的区域数
图3.3所示流图共有5个区域,因此它的环形复杂度等于5。
图3.18用罗
马数字标注出该流图中的区域,其中区域I为图的外部区域。
®
1513.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所示流图的环形复杂度为
2X1+1X(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.答:
B.S:
令P代衣兗易的总盒额,Q代我每股的曹价」代衣交易的股数炉
(1)S示手续躅计算方法的判是衣如图3.加所示。
判定表的每一列是一条计算规则。
例如+第】歹11(规则1)规定•当交易总金额P少于
1000元,且每股件价0低于14元,H空易的股数”是10()的倍数时,给经纪人的于-续费为
(1+0.(15)xOJ)84F
弟lb列(规则1仍我明,肖交易总金额P超过10000尤,11每股诃价Q在14元到笳尤之间*11交易的股数n不是100的倍数时,手续费为
(1+(}A)6)xCO.(MP+134)
(2)衣示手续费计算方法的判立树如图工21所示*
X
(n:
L+jtoa(»x(70P+i)
X
(比【1dIO*0)X(10*()11)
X
(TKT1Jtoa0)x<90-01T)
tFt»-hdIMXi叶”
x
f^rr-L^r^nvrah*nxt)%•wf•v•••
X
(Kl+JfrO•O)X(SO*O+l)
乂
(fCH-JSO•0)X(W0+1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 第三 习题 参考答案