软件工程第三章习题及参考答案 联系客服

发布时间 : 星期日 文章软件工程第三章习题及参考答案更新完毕开始阅读04ae274a102de2bd97058844

为了搞清楚怎样按照事务文件的指示,更新旧的主文件产生新的主文件,也就是说,为了设计出处理的算法,让我们再一次研究图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