1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 59及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和数据流图,回答问题 l至问题 3,将解答填入答题纸的对应栏内。【说明】图书管理系统旨在用计算机对图书进行管理,包括图书的购入、借阅、归还以及注销。管理人员可以查询某位读者、某种图书的借阅情况,还可以对当前图书借阅情况进行一些统计,给出统计表格,以便掌握图书的流通情况。系统要实现以下四方面的功能:购入新书、读者借书、读者还书以及图书注销。 (1)购入新书:需要为该书编制图书卡片 ,包括分类目录号、图书流水号 (要保证每本书都有唯一的流水号,即使同类图书也是
2、如此 )、书名、作者、内容摘要、价格和购书日期等信息,写入图书目录文件中。 (2)读者借书:填写借书单,包括读者号、欲借图书分类目录号,系统首先检查该读者号是否有效,若无效,则拒绝借书,否则进一步检查该读者所借图书是否超过最大限制数,若已达到最大借阅数,则拒绝借书,否则读者可以借出该书,登记图书分类目录号、图书流水号、读者号和借阅日期等,写回到借书文件中去。 (3)读者还书:根据图书流水号,从借书文件中读出和该图书相关的借阅记录,表明还书 日期,再写回借书文件中;如果图书逾期未还,则处以相应罚款。 (4)图书注销:将一些过时或无保留价值的图书注销,从图书文件中删除相关记录。 (5)流通查询:管
3、理员可以对图书流通情况进行查询,包括某位读者、某种图书和全局图书,给出流通情况统计表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图 1-1是顶层数据流图,图 12是第 0层数据流图,图 13是第 1层数据流图。【图11】 【图 12】【图 13】【数据字典】 (1)数据流条目图书管理要求 =入库单借书单还书单注 销单 入库单 =分类目录号 +数量 +书名 +作者 +内容摘要 +价格 +购书口期借书单 =读者号 +(d)+借阅日期还书单 =盟 +还书日期 (2)文件说明文件名:目录文件组成: (分类目录号 +书名 +作者 +内容摘要 +价格 +入库日期
4、 +总数 +库存数 +(f) 1 根据题意,指出数据流图中缺失的数据流 (a)的名称,并指出该数据流的起点。 2 将下述文件正确填充在数据流图 (b)、 (c)处:读者文件、借书文件。 3 根据题意,补充数据字典中 (d)、 (e)、 (f)处的空缺。 3 阅读下列说明和图,回答问题 1到问题 3,将解答填入 答题纸的对应栏内。 【说明】 目前大多数操作系统都采用虚拟存储技术,这样可在较小的可用内存中执行较大的用户程序,可在内存中容纳更多程序并发执行。引入虚拟存储技术,其基本思想是利用大容量的外存来扩充内存,产生一个比有限的实际空间大得多、逻辑的虚拟内存空间,以便能够有效地支持多道程序系统的实
5、现和大型程序运行的需要,从而增强系统的处理能力。虚拟存储技术主要分为虚拟页式存储管理和虚拟段式存储管理。虚拟页式存储管理中,在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面之后根据进程运行的需要,动态装入其他页面 ;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。在简单页式存储管理的基础上,增加请求调页和页面置换功能。使用虚拟页式存储管理时需要在页表中增加以下内容:页号、驻留号、内存块号、外存地址、访问位、修改位。其中,驻留位,又称中断位,表示该页是在内存还是在外存;访问位表示该页在内存期间是否被访问过;修改位表示该页在内存中是否被修改过。访问
6、位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定。 4 执行指令时,计算页号与页内地址,判断 “该页在内存吗 ”,若在,则进行地 址映射过程;若不在内存,则产生缺页中断。当发生缺页中断时,保存当前进程现场,判断 “有空闲页面吗 ”,如有,直接调入所需的页面。若没有,按照某种算法选择一页置换,判断 “该页被修改过吗 ”,如果被修改过,就必须把它写回磁盘以便更新该页在磁盘上的副本;如果该页没有被修改过,那么它在磁盘上的副本已经是最新的了,则不需要写回,调入的所需的页面直接覆盖被淘汰的页。调整页表及内存分配表,恢复被中断进程现场。补充缺页中断处理流程图 4一 1中的判断 (1) (3) 5
7、 发生缺页时,通常需要进行页面置换,页面置换算法的优劣将会影响 虚拟存储系统的性能。常用的页面置换算法有理想页面置换算法 (OPT: Optimal)、先进先出页面置换算法 (FIFO: FirstIn FirstOut)以及最近最少使用页面置换算法 (LRU:Least Recentlv Used)。某程序在内存中分配 3页,初始为空,页面走向为 4、 3、2、 1、 4、 3、 5、 4、 3、 2、 1、 5。给出采用先进先出 (FIFO)、最近最少使用 (LRU)和理想 (OPT)页面置换算法所得到的内存中的页面变化序列。注:缺页标记栏 6 简述 Belady异常。 6 【说明】有个关
8、于运动会 的管理系统,在该系统中,委员会为每一个参赛的运动员赋以一个唯一的编号 “运动员号 ”,同时记录姓名、性别、年龄和队名,姓名和队名必须填写。一个运动员属于且只属于一个队,一个运动员可以参赛多个项目。运动员参加比赛取得一个成绩,相应有一个积分:第一名积分 6分,第二名积分 4分,第三名积分 2分,其他的没有积分。一个队的总积分是该队的所有队员的积分之和。下图是该系统的 ER图。图中的实体和属性同时给出了中英文两种名字,回答问题时只需写出英文名即可。【图 2一 1】7 根据 ER图中给出的词汇,按照 “有关模式名 (属性, 属性, )” 的格式,将此ER图转换为 3个关系模式,指出每个关系
9、模式中的主码和外码,其中模式名根据需要取实体名或联系名。 8 创建 Athlete表时, ANo使用 CHAR(6)并且唯一, AName使用 CI-IAR(20),ASex使用 CHAR(1), ATeam使用 CHAR(20)。请在下列用于创建表 Athelete的SQL语句空缺处填入正确的内容。 CREATETABLEAthlete(ANoCHAR(6)NOTNULL, ANarrleCHAR(20), ASexCHAR(1), ATeamCHAR(20)NOTNULL, (1); 9 假定 Games表存储参赛情况,如下的 SQL语句是委员会用于查询 “队名为China的各个运动员各自
10、夺取得的总积分 ”的不完整语句,请在空缺处填入正确的内容。 SELECT(1) FROMGames WHEREAONO (2) (SELECT AN() FROM (3) WHERE ATeam=“China”) GROUp BY ANo: 9 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。【说明】某大型旅店为了便于管理,欲开发一个客房管理系统。希望 实现客房预定、入住登记、帐务结算、退房,以及将服务项目记入客人帐单。旅客包括散客和团体,散客预定或入住时需要提供姓名、性别、身份证和联系电话,团体则提供团体名称、负责人的姓名、性别、身份证和联系电话,以及团体人数。对于散客
11、,还要提供换房。旅店还提供了很多服务项目,比如早餐。对每一个入住客人,服务列表记录了住宿期间的各项服务,包括服务类型、日期、数量等。当然,客人也可以不要任何服务。旅店的客房有一个唯一的房间号,分为不同的类别,不同的房间床位数和价格不同。为了有效的管理,需要记录每天的客房状态。客房的状态有: 空闲、占用、已预定和维修。客人入住后,客房处于占用状态;客人退房后,客房处于空闲状态;客人预定后,客房处于已预定状态;预定客人入住后,客房处于占用状态;预定客人取消预定后客房处于空闲状态;需要维修时客房处于维修状态;维修完成后客房处于空闲状态。该系统采用面向对象方法开发,系统中的类以及类之间的关系用 UML
12、类图表示,图 3一 1是该系统的类图的一部分,图 3 2描述了客房状态的转变情况。【图 3一 1】【图32】 10 请用图 31的属性和方法的名称给出客人类的属性和方法。 (注意:团体类中的负责人姓名等与散客 的对应属性含义相同,不必区分 ) 11 在 UML中,重复度 (Multiplicity)定义了某个类的一个实例可以与另一个类的多少个实例相关联。通常把它写成一个表示取值范围的表达式或者一个具体的值。例如图 3一 1中的类客人和住宿,客人端的 “1”表示:一个住宿类的实例只能与一个1个客人类的实例相关联;住宿类端的 “0.*”表示:一个住宿类的实例可以与 0个或多个客人类的实例相关。请指
13、出图 3一 l中 (1)到 (4)处的重复度分别为多少 ? 12 根据题意,请指出图 32中状态 A、 B分别是什么状态,事件 C、 D分别是什么事件。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 13 阅读下列函数说明和 C+代码,将应填入 (n)处的字句写在答题纸对应栏内。【说明】在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能 (包括不用的功能 )都要全面初始化的话,会导致应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功
14、能。以下示例展示了 Pmxy(代理 )模式, PriterProxy类执行一 些比较 “轻 ”的方法,需要真正执行 “重 ”的方法时才初始化 Print类。图 51显示了各个类间的关系。【图 5-1】【 C+代码】 class printable(public: virtual void setPrinterName(string name) = 0; Virtual string getprinterName()=0; virtual V0id prin七 (string name)=0; ; class printer: public printableprivate: string na
15、me; public: printer(string name) coutname=name: void setprinterName(string name) this一 name=name; string getprinterName() return name: void print(string msg)( coutname=name: void setPrinterName(string name)if( (3) )real一 setprinterName(name); this一 name=name: string getPrinterName()( return name: Vo
16、id print(string msg) (4) ; real print(msg); Void realize() if(real =NULL)real=(5); : 14 阅读以下说明和 Java代码,将应填入 (n)处的字句写在答题纸对应栏内。【说明】在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能 (连不用的功能 )都要全面初始化的话,会连带影响到应 用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。以下示例展示了 Proxy(代理 )模式, PrinterProxy类执行一些比较 “轻 ”的方法 设置名称和取得
17、名称,需要真正执行 “重 ”的方法 (真正打印 )时才初始化 Print类。图 61显示了各个类间的关系。【图 61】【 Java代码】printable javapublic (1) printable public abstract V。 id setprin七 erName(String name); publ ic abstract String getPrinterName(); publ ic abstract V。 id print(String string); printer javapublic class Printer implements Printable ; pr
18、iVate String name; public Printer() system out println(“正在产生 printer的对象实例 ”); publ ic Printer(String name) this name: name: heaVyJob(“正在产牛 printer的对象实例(“+name+”)”); publ ic void setprinterName(String name) this name=name: publ ic String getPrinterName() return name: public void print(String string)(
19、 System , out println(“=” +name+ “=”); System out println(string); printerproxy java public class PrinterProxy (2) printable priVate String name; priVate Printer real: public Printerproxy()() public printerPr。 xy(String name) this name=name; public synchr。 nized Void setPrinterName(String name) i f(
20、 (3) ) real setPrinterName(name); this name:name: publ ic String ge七 printerName() return name: public void print(String string) (4) ; real print(string); provate synchronized Void realize()产生真正的 printer对象 1上 (real=null); real= (5); 15 阅读以下说明和 c代码, 将应填入 (n)处的字句写在答题纸对应栏内。 【说明】 下面程序用来将打乱的单 词还原为原来的次序,比
21、如将 rty还原为 try。单词的原来次序存储于 wordlist txt文件中,原则上可用穷举法 (ny对应的穷举为: rty、 ryt、try、 tyr、 ytr、 yrt),但考虑到破译速度,采用如下方法:注意到单词列表中不存在组成字符完全相同的单词 (如 Hackl2与 Hack21包含完全相同的字符 ),因此将单词中的字符进行重组再进行比较,例如, try单词重组为 rty(按 AscII码顺序 ),这样不管打乱的单词是什么顺序,只要是由 r、 t、 y三个字母组成的均破译为 try,大大提高破译速度。程序中借助二叉 排序树以进一步提高查找效率,二叉排序树左子树(如果有 )上的节点对
22、应的值均小于根节点的值,右子树 (如果有 )上的节点对应的值均大于根节点的值。函数中使用的符号定义如下: #define Numberofwords 1275单词总数 #de fine MaxLength 10最长单词所含字符数 char wordListNumberofwordsMaxLength;存储单词列表 intcmp(Node*q, Node*p); q与 p比较。 p小,返回负值; p大返回正值;相等,返回 O typedef struct N0de(二叉树节点 char*eleLetters;重组后的字符串 int index;对应单词表中的下标 struct Node*1chi
23、ld, *rchild;左右子节点 Node; 【 C代码】 void reCompose(Node *p, char p=(2);临时存储 recompose(p, temp);将 temp重组 q= root; while(flag= (3) ) q !=NULL) if(flaglChild; )else( 搜索右子树 q=q一 rChild; while if(flag=0)(找到匹配的,保存下标 return (4); if(5)(查找失败 printf(”cant unscramble the following word : s”, temp); return一 1: : 软件水
24、平考试(中级)软件设计师下午(应用技术)试题模拟试卷 59答案与解析 一、必答题(共 4道大题,每道 大题 15分) 1 【正确答案】 (a)名称:当前日期,起点:系统时钟 【试题解析】 加工 2的输入数据流有 “当前日期 ”和 “有效的图书管理要求 ”。根据平衡原则,加工 2 1的输入数据流 (a)应为 “当前日期 ”,其起点自然是 “系统时钟 ”。 2 【正确答案】 (b)读者文件 (c)借书文件 【试题解析】 加工 3 2“读者查询 ”需要 “借书文件 ”及 “读者文件 ”,而加工 3-3“图书查询 ”与 “读者文件 ”不相关,因此 b处应填 “读者文件 ”, c处应填 “借书文件 ”。
25、 3 【正确答案】 (d)分类目录号 (e)图书流水号 (f)图书流水号 ) 【试题解析】 根据说明 “填写借书单,包括读者号、欲借图书分类目录号 ”可得,借书单应包括 “读者号 ”和 “图书分类号 ”。故 d应填 “分类目录号 ”。还书时是根据“图书流水号 ”的,因此还书单应包括 “图书流水号 ”。故 e应填图书流水号。 “目录文件 ”存储图书的情况,包括分类目录号、图书流水号、书名、作者、内容摘要、价格,可见 “目录文件 ”需要存储图书流水号,而且 “一种 ”书有多个副本,因此 f应填 图书流水号 。注意,大括号 表示多个数据项。 4 【正确答案】 (1)该页在内存吗 ?(2)有空闲页面吗
26、 ?(3)该页被修改过吗 ? 【试题解析】 根据缺页中断处理的说明,易于判断: (1)该页在内存吗 ?(2)有空闲页面吗 ?(3)该页被修改过吗 ? 5 【正确答案】 OPT7次FIF09次LRU10次【试题解析】 常用页面置换算法有: (a)理想页面置换算法 (OPT: Optimal)。选择淘汰不再使用或最远的将来才使用的页。 (b)先进先出页面置换算法 (FIFO: FirstIn FirstOut)。选择淘汰主存驻留时间最长的页。 (c)最近最少使用页面置换算法 (LRU: Least Recently Used)。选择淘汰离当前时刻最近的一段时间使用得最少的页。 (d)随机算法 (R
27、and)。随机地选择淘汰的页。 (e)最近未使用页面置换算法 (NFU: Not Recentlv Used)。 6 【正确答案】 一般来讲,在内存中的物理页面数越多,程序的缺页次数应该越少,但令人吃惊的是,实际情况并不是这样。使用 FIFO算法时,有时会出现分配的页面数增多,缺页率反而提高的异常现象。 7 【正确答案】 Athlete(ANo, AName, ASex, Age, ATeam),主键为 ANo。 Item(INo, IName, ITime, IPlace),主键为 INo。 Games(ANo, INo, Score, Credit),主键为 (ANo, INo)。 【试题
28、解析】 ER模型向关系模型的转换应遵循如下原则: 每个实体类型转换成一个关系模式; 一个 1: 1的联系 (一对一联系 )可转换为一个关系模式,或与任意一端的关系模式合并。若独立转换为一个关系模式,那么两端关系的码及其联系的属性为该关系的属性;若与一端合并,那么将另一端的码及属性的属性合并到该端。 一个 1: n的联系 (一对多联系 )可转换为 一个关系模式,或与 n端的关系模式合并。若独立转换为一个关系模式,那么两端关系的码及其联系的属性为该关系的属性,而 n端的码为关系的码。 一个 n: m的联系 (多对多联系 )可转换为一个关系模式,两端关系的码及其联系的属性为该关系的属性,而关系的码为
29、两端实体的码的组合。 三个或三个以上多对多的联系可转换为一个关系模式,诸关系的码及联系的属性为关系的属性,而关系的码为各实体的码的组合。 具有相同码的关系可以合并。根据上述规则,可得如下关系模式:Athlete(ANo, AName, ASex, Age, ATeam),主键为 ANo。 Item(INo,IName, ITime, IPlace),主键为 INo。 Games(imo, INO, Score, Credit),主键为 (ANo, INo)。 8 【正确答案】 (1)PRIMARY KEY ANo 【试题解析】 Athlete表中 ANo是主键,创建表时需要说明主键,故空 (1
30、)应填PRIMARY KEY ANo。 9 【正确答案】 (1)SUM(Credit) (2)IN (3)Athlete 【试题解析】 SELECTALLIDISTINCT, . FROM, WHERE GROUP BYHAVING ORDER BYASC 1 DESC 子句顺序为 SELECT、 FROM、 WHERE、 GROUP BY、 HAVING、 ORDER BY,但 SELECT和 FROM是必须的, HAVING子句只能与 GROUP BY搭配起来使用。 SELECT子句对应的是关系代数中的投影运算,用来列出查询结果中的属性,其输出可以是列名、表达式、集函数 (AVG、 COU
31、NT、 MAX、 MIN、SUM), DISTINCT选项可以保证查询的结果集中不存在重复元组; FROM子句对应的是关系代数中的笛卡儿积,它列出的是表达式求值过程中须扫描的关系;WHERE子句对应的是关系代数中的选择谓词。根据题意,空 (1)应填SUM(Credit),空 (2)应填 IN,空 (3)应填 Athlete。 10 【正确答案】 属性:姓名、性别、身份证、联系电话 方法:预定、入住、结帐 【试题解析】 “客人 ”类是 “散客 ”类和 “团体 ”类的泛化,具有二二者的公共属性和公共方法。比对 二者属性及方法得, “客人 ”类属性有:姓名、性别、身份证、联系电话;方法有:预定、入住
32、、结账。 11 【正确答案】 (1)0.1(2)1.*(3)1 (4)0.1 【试题解析】 散客入住时只改变一个客房状态,而团体入住时则有可能改变多个客房状态;客房状态改变不一定是住宿导致的,客房维修同样改变客房状态。因此 (1)处应填 0.1, (2)处应填 1.*。客人可以有多项服务,但只需用一张 “服务列表 ”,当然也可能不需要任何服务;而一张服务列表必然属于而且只输于一个住宿。因此 (3)处应填 1, (4)处应填 0.1。 12 【正确答案】 A:空闲 B:占用 C:入住 D:取消预定 【试题解析】 “维修 ”完成后客房处于 “空闲 ”状态,故状态 A为 “空闲 ”;客人入住后,客房
33、由 “空闲 ”转为 “占用 ”,故状态 B为 “占用 ”;状态 “已预订 ”经 “入住 ”转为 “占用 ”,故 C为 “入住 ”:状态 “已预订 ”经 “取消 ”转为 “空闲 ”,故 D为 “取消 ”。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 13 【正确答案】 (1)Printable (2)real (3)real!=NULL (4)realize() (5)newPrinter(name) 【试题解析】 由类图可知 PrinterProxy类是 Printable子类,因此应声明为继承自
34、Printable,故空 (1)应填 Printable。 real是一个 Printer对象指针,应该进行初始化,初始化工作是在构造函数中完成的,若不进行初始化的话, realize()方法将不可预期,故空 (2)应填 real。 real是一个指针,调用之前当然得先判断 real是否为空指针,只有不是空指针才能进行调用,否则将出现不可预期的结果,因此空 (3)应填 real! =NULL。在执行打印时,需要保证已经正确生成 Treal对象,否则打印将无法完成,这也正是 Proxy的核心所在,到真正需要打印时,才生产 real对象,因此空 (4)应填 realize()。 real是 Pri
35、nter对象指针,空 (5)是生成一个 Printer对象,注意 Printer类的构造函数是 Printer(stringname),故应填newPrinter(name)。 14 【正确答案】 (1)interface (2)implements (3)real!=null (4)realize() (5)newPrinter(name) 【试题解析】 在 Java中, interface和 abstractclass均能包含抽象方法, “类是用来继承的 (extends),接口是用来实现的 (implements)。 ”由类 Printer的声明可判知Printable应为接口,故空 (
36、1)应填 interface。因 Printable是一个接口,故空 (2)应填 implements。该空比较简单。 real是一个引用,调用之 前当然得先判断 real是否为空,只有不是空才能进行调用,否则将出现不可预期的结果,因此空 (3)应填real!=NULL。在执行打印时,需要保证已经正确生 Treal对象,否则打印将无法完成,这也正是 Proxy的核心所在,到真正需要打印时,才生产 real对象,因此空 (4)应填 realize()。 real是 Printer对象引用,空 (5)是生成一个 Printer对象,注意 Printer类的构造函数是 Printer(stringn
37、ame),故应填 newPrinter(name)。顺便说一下,生成 real对象时,进行 Treal是否为空的判断,并将方法 realize()声明为synchronized,这是为了避免生成多个 real对象,有一个即可。 15 【正确答案】 (1)k!=i (2)(Node*)maIloc(sizeofp) (3)q一 cmp(p) (4)q一 index (5)q=NULL 【试题解析】 该题涉及二叉排序树的应用、直接插入排序算法等。空 (1)所在函数是直接插入排序的一个实现,理解了商接插入排序算法很容易得出答案,条件 (1)成立时,需要进行交换,故空 (1)应填 “k!=i”。空 (
38、2)比 较简单, p声明为指针,在引用 reCompse(P, temp)之前需要申请空间,故空 (2)应填“(Node*)malloc(sizeofp)”。接下来在二叉排序上进行查找。 while循环体内只有两个分支,一个是 flag 0时继续往左子树搜索,另一个就是往右子树搜索,此时应该对应的是 flag 0。据此可判知, flag存储的是查找节点 P与当前节点 q之间的大小关系,显然是调用类 Node的 cmp方法,故空 (3)应填 “cmp(q, p)”。注意,不能填成 “cmp(p, q)”,那样将不可能找到匹配的,因为该二叉排序树是左子 树小于根节点,而 cmp(q, p)当 p比 q小时返回负值,搜索应往左子树继续。空 (4)是找到匹配时返回,根据函数注释,函数 nnd的返回值是匹配单词在 WordList数组中的下标,结构 Node的 index域正好存储的是下标。故空 (4)应填 “q一 index”。空(5)是查找失败的情况,对应条件为 “q=NuLL”。故空 (5)应填 “q=NULL”。