1、2006年下半年软件水平考试(中级)软件设计师下午(应用技术)试题真题试卷及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读以下说明以及数据流图,回答问题 1至问题 5。【说明】 某银行已有一套基于客户机 /服务器模式的储蓄系统 A和一套建账软件。建账软件主要用于将储蓄所手工处理的原始数据转换为系统 A所需的数据格式。该建账软件具有以下功能。 (1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。 (2)初录 /复录比对:将初录员和复录员录入的数据进行一一 比较,并标记两套数据是否一致。 (3)数据确认:当上述两套数据完全一致后,
2、将其中任一套作为最终进入系统 A的原始数据。 (4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。 (5)数据转换:将经过确认的数据转换为储蓄系统 A需要的中间格式数据。 (6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。 该软件的数据流图如图 10-1至图 10-3所示。图中部分数 据流数据文件的格式如下: 初录分户账 =储蓄所号 +账号 +户名 +开户日 +开户金额 +当前余额 +性质 复录分户账 =储蓄所号 +账号 +户名 +开
3、户日 +开户金额 +当前余额 +性质 初录数据 =手工分户账 +一致性标志 复录数据 =手工分户账 +一致性标志 会计账目 =储蓄所号 +总户数 +总余额 操作结果 =初录操作结果 +比对操作结果 +复录操作结果 软件需要打印的分户账清单样式如表 10-1所示:1 请采用说明中的词汇,给出数据确认处理所需的数据流在第 1层图中的全部可选起点 (第 0层图和第 1层图中均未给出 )。 2 不考虑数据确认处 理 (加工 2),请指出数据流图中存在的错误。 3 打印分户账清单时,必须以下列哪一组数据作为关键字进行排序,才能满足需求 ?请从下面选项中选择。 储蓄所 账号 开户日 总户数和总余额 4 加
4、工 1(录入比对处理 )除能够检查出初录数据和复录数据不一致外,还应当检测出下列哪些错误。 输入的无效字符 输入的半个汉字 显示器无法显示 初录员重复录入同一账户 汇总数据与会计账目不符 打印机卡纸 5 请使用数据字典条目 定义形式,给出第 0层 DFD中的 “手工分户账 ”数据流和第1层 DFD中的 “初录分户账 ”、 “复录分户账 ”的关系。 6 阅读以下说明,回答问题 1至问题 4。【说明】 某宾馆需要建立一个住房管理系统,部分的需求分析结果如下: (1)一个房间有多个床位,同一房间内的床位具有相同的收费标准,不同房间的床位收费标准可能不同; (2)每个房间有房间号 (如201、 202
5、等 )、收费标准、床位数目等信息; (3)每位客人有身份证号码、姓名、性别、出生日期和地址等信息: (4)对每位客人的每次住宿,应该记录其入住日期、退房日期和预付 款额信息; (5)管理系统可查询出客人所住房间号。 根据以上的需求分析结果,设计一种关系模型如下图所示: 6 根据上述说明和实体 -联系图,得到该住房管理系统的关系模式如下所示,请补充住宿关系。 房间 (房间号,收费标准,床位数目 ) 客人 (身份证号,姓名,性别,出生日期,地址 ) 住宿 (1),入住日期,退房日期,预付款额 ) 7 请给出问题 1中住宿关系的主键和外键。 8 若将上述各关系直接实现为对应的物理表,现需查询在 20
6、05年 1月 1日到 2005年 12月 31日期间,在该宾馆住宿 次数大于 5次的客人身份证号,并且按照入住次数进行降序排列。下面是实现该功能的 SQL语句,请填补语句中的空缺。 SELECT 住宿身份证号, count (入住日期 ) FROM 住宿,客人 WHERE 入住日期 =20050101AND入住日期 =20051231 AND 住宿身份证号 =客人身份证号 GROUP BY (2) (3) count(入住日期 ) 5 (4) 9 为提交 SQL语句的执行效率,可在相应的表上创建索引。根据问题 3中的 SQL语句,除主键和外键外,还需要在哪个表的哪些属性上创建索引,应该创建什么
7、类型的索引,请说明原因。 10 阅读以下说明和图,回答问题 1至问题 3。【说明】 S公司开办了在线电子商务网站,主要为各注册的商家提供在线商品销售功能。为更好地吸引用户, S公司计划为注册的商家提供商品 (Commodity)促销 (Promotion)功能。商品的分类 (Category)不同,促销的方式和内容也会有所不同。 注册商家可发布促销信息。商家首先要在自己所销售的商品的分类中,选择促销涉及的某一具体分类,然后选出该分类的一个 或多个商品 (一种商品仅仅属于一种分类 ),接着制定出一个比较优惠的折扣政策和促销活动的优惠时间,最后由系统生成促销信息并将该促销信息公布在网站上。 商家发
8、布促销信息后,网站的注册用户便可通过网站购买促销商品。用户可选择参与某一个促销活动,并选择具体的促销商品,输入购买数量等购买信息。系统生成相应的一份促销订单 (POrder)。只要用户在优惠活动的时间范围内,通过网站提供的在线支付系统,确认在线支付该促销订单 (即完成支付 ),就可以优惠的价格完成商品的购买活动,否则该促销订单失效。 系统采用面向对象方法开发,系统 中的类以及类之间的关系用 UML类图表示,图 10-4是该系统类图中的一部分;系统的动态行为采用 UML序列图表示,图 10-5是发布促销的序列图。10 识别关联的多重度是面向对象建模过程中的一个重要步骤。根据说明中给出的描述,完成
9、图 10-4中的 (1) (6)。 11 请从表 10-2中选择方法,完成图 10-5中的 (7) (10)。12 关联 (Association)和聚集 (Aggregation)是 UML中两种非常重要的关系。请说明关联和聚集的关系,并说明其不同点。 13 阅读以下说明和图,填 补流程图中的空缺。 【说明】 某汽车制造工厂有两条装配线。汽车装配过程如图 10-6所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。 (1)e0和 e1表示底盘分别进入装配线 0和装配线 1所需要的时间。 (2)每条装配线有 n个工位,第一条装配线的工位为 S0,0, S0,1, , S
10、0,n-0,第二条装配线的工位为 S1,0, S1,1, , S1,n-1。其中 S0,k和 S1,k(0kn-1)完成相同的任务,但所需时间可能不同。 (3)aij表示在工位 Sij处的装配时间,其中 i表示装配线 (i=0或i=1), j表示工位号 (0jn-1)。 (4)tij表示从 Sij处装配完成后转移到另一条装配线下一个工位的时间。 (5)X0和 X1表示装配结束后,汽车分别从装配线 0和装配线1下线所需要的时间。 (6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。 图 10-7所示的流程图描述了求最短装配时间的算法,该算法的输入为; n: 表示装配线上的
11、工位数; ei: 表示 e1和 e2, i取值为 0或1: aij: 表示 ai,j, i的取值为 0或 1, j的取值范围为 0 n-1; tij: 表示ti,j, i的取值为 0或 1, j的取值范围为 0 n-1; xi: 表示 X0和 X1, i取值为 0或 1。 算法的输出为: fi:最短的装配时间; li:获得最短装配时间的下线装配线号 (0或者 1)。 算法中使用的 fij表示从开始点到 Si,j处的最短装配时间。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 14 阅读以下说明、图和
12、C代码。 【说明】 一般的树结构常采用孩子 -兄弟表示法表示,即用二叉链表作树 的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。例如,图 10-8(a)所示的树的孩子 -兄弟表示如图10-8(b)所示。 函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对图 10-1所示的树进行层序遍历时,结点的访问次序为 D B A E F P C。 对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示: Bool、 Status类型定义如下: typedef enum FALSE=0, TRUE=1 Bool; typedef enum
13、 OVERFLOW=-2, UNDERFLOW=-1, ERROR=0, OK=1Status; 树的二叉链表结点定义如下: typedef struct Node char data; struct Node *firstchild,*nextbrother; Node, *TreeNode;【函数】 Status LevelTraverse ( TreeNode root ) /*层序遍历树,树采用孩子 -兄弟表示法, root是树根结点的指针 */ Queue tempQ; TreeNode ptr, brotherptr; if (! root) return ERROR; InitQ
14、ueue( void click() /发生 click事件时进行状态转换 if (1) setState(OPENING); else if (2) setState(CLOSING); else if (3) setState(STAYOPEN); void timeout() /发生 timeout事件时进行状态转换 if (state = OPEN) setState(CLOSING); void complete() /发生 complete事件时进行状态转换 if (state = OPENING) setState(OPEN); else if (state = CLOSING)
15、 setState(CLOSED); ; int main() Door aDoor; aDoor.getState(); aDoor.click(); aDoor.getState(); aDplete(); aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click(); aDoor.getState(); return 0; 【 C+代码 2】 class Door public: DoorState *CLOSED, *OPENING, *OPEN, *CLOSING,*STAYOPEN, *state; Door();
16、 virtual Door()/ 释放申请的内存,此处代码省略 ); void setState(DoorState *state) this- state = state; void getState() /此处代码省略,本方法输出状态字符串, /例如,当前状态为 CLOSED时,输出字符串为 “CLOSED” ; void click(); void timeout(); void complete(); ; Door:Door() CLOSED = new DoorClosed(this); OPENING = new DoorOpening(this); OPEN = new Door
17、Open(this); CLOSING = new DoorClosing(this); STAYOPEN = new DoorStayOpen(this); state = CLOSED; void Door : click() (4); ) void Door : timeout() (5); ) void Door : complete() (6); class DoorState/定义一个抽象的状态,它是所有状态类的基类 protected: Door *door; public: DoorState(Door *door) this- door = door; virtualDoor
18、State(void); virtual void click() virtual void complete() virtual void timeout() ; class DoorClosed :public DoorState/定义一个基本的 Closed状态 public: DoorClosed(Door *door) :DoorState(door) virtual DoorClosed() void click(); ; void DoorClosed : click() (7); /其他状态类的定义与实现代码省略 int main() Door aDoor; aDoor.get
19、State(); aDoor.click(); aDoor.getState();aDplete(); aDoor.getState(); aDoor.timeout(); aDoor.getState(); return 0; 16 阅读以下说明以及 Java程序。 【说明】 传输门是传输系统中的重要装置。传输门具有 Open(打开 )、 Closed(关闭 )、 Opening (正在打开 )、 StayOpen(保持打开 )和Closing(正在关闭 )五种状态。触发状态的转换事件有 click、 complete和 timeout三种。事件与其相应的状态转换如下图所示。 下面的 Jav
20、a代码 1与 Java代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。【 Java代码 1】 public class Door public static final int CLOSED = 1; public static final int OPENING = 2; public static final int OPEN = 3; public static final int CLOSING = 4; public static final int STAYOPEN = 5; private int state = CLOSED; /定义状态变量,用不同的整
21、数表示不同状态 private void setState(int state) this.state = state; /设置传输门当前状态 public void getState() /此处代码省略,本方法输出状态字符串, /例如,当前状态为 CLOSED时,输出字符串为“CLOSED“ public void click() /发生 click事件时进行状态转换 if (1); ) setState(OPENING); else if (2); ) setStateCLOSING); else if (3); ) setState(STAYOPEN); /发生 timeout事件时进行
22、状态转换 public void timeout() if (state = OPEN) setState(CLOSING); public void complete() /发生 complete事件时进行状态转换 if (state = OPENING) setState(OPEN); else if (state = CLOSING) setState(CLOSED); public static void main(String args) Door aDoor = new Door(); aDoor.getState(); aDoor.click(); aDoor.getState(
23、); aDplete(); aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click(); aDoor.getState();return; 【 Java代码 2】 public class Door public final DoorState CLOSED = new DoorClosed(this); public final DoorState OPENING = new DoorOpening(this); public final DoorState OPEN = new DoorOpen(this); publi
24、c final DoorState CLOSING = new DoorClosing(this); public final DoorState STAYOPEN = new DoorStayOpen(this); private DoorState state = CLOSED; /设置传输门当前状态 public void setState(DoorState state) this.state=state; public void getState() /根据当前状态输出对应的状态字符串 System.out.println(state.getClass().getName(); pu
25、blic void click()(4); /发生 click事件时进行状态转换 public void timeout()(5); /发生 timeout事件时进行状态转换 public void complete()(6); )/发生 complete事件时进行状态转换 public static void main(Stringargs) Door aDoor = new Door(); aDoor.getState(); aDoor.click(); aDoor.getState(); aDplete(); aDoor.getState(); aDoor.timeout(); aDoo
26、r.getState(); return; public abstract class DoorState /定义所有状态类的 基类 protected Door door ; public DoorState(Door doer) this.door = door; public void click() public void complete() public void timeout() class DoorClosed extends DoorState /定义一个基本的 Closed状态 public DoorClosed(Door door) super(door); publi
27、c void click() (7); ) /该类定义的其余代码省略 /其余代码省略 2006年下半年软件水平考试(中级)软件设计师下午(应用技术)试题真题试卷答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 初录数据、复录数据 【试题解析】 在本题说明中关于 “数据确认 ”功能的描述中,指出当初录员和复录员分别录入的数据比对正确后,可从其中任一套数据作为最终进入系统 A的原始数据 (即图 10-2中的确认数据 )。因此无论是初录数据还是复录数据都可作为 “数据确认处理 ”的数据 源。 2 【正确答案】 0层图 (图 10-2)中,数据清除处理 (加工 6)没有输入数
28、据流 【试题解析】 在 DFD中,一个加工就是对输入数据进行处理并生成输出数据的过程,所以数据流图中的每个加工都要求 (至少 )有一个输入数据流和一个输出数据流。而在 0层 DFD (图 10-2)中,加工 6(数据清除 )只有输出数据流而没有输入数据。 3 【正确答案】 【试题解析】 在表 10-1中,多行中的数据按照储蓄所分组输出并打印该储蓄所所有分户账的户数和余额合计,这就要求在数据查询操作中,至少要按照储蓄所进行排 序才能实现。当然在软件实现时,也可以按照账号、开户日等数据排序,但从表 10-1中无法确定是否需要这些额外的排序。 4 【正确答案】 、 、 【试题解析】 图 10-2中的
29、加工 1(录入比对 )包含了图 10-3中的三个加工:初录员录入数据、复录员录入数据、两组数据比对。按照本题说明,比对的任务就是在两组已经存储在数据文件中的数据之间一一比较,并指出那些不一致者、重复录入的同一账户数据,这个加工是完全由软件完成的,不再需要用户输入数据。但在手工录入过程中,有可能输入无效字符,比如输入的金额中有除小数点、 数字之外的其他字符、半个汉字 (这在某些运行环境中是可能存在的情况 )。另外,从图10-3和其他叙述中可以看出,录入比对处理不涉及打印,也不应该检查汇总数据和会计账目是否相符 (因为这是汇总核对的功能 )。 5 【正确答案】 手工分户账 =初录分户账 +复录分户
30、账 【试题解析】 在图 10-2给出的软件第 0层 DFD中, “手工分户账 ”是 “录入比对 ”加工的输入数据流,而该加工包含了图 10-3中的 “初录 ”加工和 “复录 ”加工。所以手工分户账由初录分户账和复录分户账组成。 6 【正确答案】 (1)房间号,身份证号 【试题解析】 房间号和身份证号分别是房间关系和客人关系的主键,作为外键出现在住宿关系中。住宿关系记录客人的身份证号和住宿的房间号。 7 【正确答案】 住宿主键:房间号,身份证号,入住日期 住宿外键:房间号,身份证号 【试题解析】 该题主要考核关系的主键。住宿关系主键包括房间号,身份证号和入住日期。房间号和身份证号是较明显的答案,
31、但仅是这两者并不能唯一识别一个记录,一位客人有可能多次在同一房间里住宿,故入住日期也要包含在主键中。 8 【正确答案】 (2)住宿身份证号 (3)HAVING (4)ORDER BY 2 DSC,或 ORDER BY 2 DESC 【试题解析】 该题主要考查 SQL语言。 GROUP BY后必须出现 SELECT后查询项中不包含聚集函数的部分; GROUP BY后跟的条件应该用 HAVING子句表示:题目要求按照入住次数降序排序,故最后应填入 ORDER BY子句。 9 【正确答案】 表:住宿 属性:入住日期 类型:聚簇索引,或聚集索引,或 cluster 原因:表中记录的物理顺序与索引项的顺
32、序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据, 因而可减少查询时间。 【试题解析】 该题主要考核索引的概念。在数据库中,索引使数据库程序无需对整个表进行扫描,就可以从其中找到所需的数据。索引分为两类:聚集索引和非聚集索引。聚集索引对表的物理数据页中的数据按列进行排序,然后重新存储到磁盘上,即聚集索引与数据是混为一体的,其叶结点中存储的是实际的数据。非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引的叶结点存储的是组成非聚集索引的关键字值和行定位器。 按题目要求,查询涉及的属性有身份证号和入住日期, 但它们均为主键属性,故不需要再为其
33、他属性创建索引。针对本题要求为提交 SQL语句的执行效率,对“入住日期 ”属性建立聚集索引,使得索引项顺序和物理数据顺序一致以提高查询性能。 问题 3中查询涉及到的属性有身份证号和入住日期,由于这两个属性均为住宿关系的主键,故不需要再在其他属性上创建索引。在主键上创建的索引类型应为聚簇索引 (或聚集索引或 cluster)。创建聚簇索引的原因是令表中记录的物理顺序与索引项的顺序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间。 10 【正确答案 】 (1)0 n或 1 n (2)1 (3)0 n (4)1 n (5)1 (6)0 n 【试题解析】 主要考查类的多样
34、性分析,在充分理解题目需求的基础上补充类图中的类间关系的多样性描述。根据题目中所描述: (1)(2)一个商品 (Commodity)属于一种分类,一个分类 (Category)中包含零个或多个商品对象,所以多样性关系为 0 n或 1 n个商品对象对应 1个分类对象; (3)(4)一个促销 (Promotion)中由一个或多个商品组成 (至少一个 ),而一个商品可以属于零个或多个促销,所以多 样性关系为 0 n个促销对象对应 1 n个商品对象。 (5)(6)一个促销可以产生多个促销订单 (POrder),一个促销订单只能对应一个促销。所以多样性关系为 1个促销对象涉及 0 n个促销订单对象。 1
35、1 【正确答案】 (7)getCategories (8)getCommodities (9)createPromotion (10)addCommodities 【试题解析】 主要考查用 UML序列图对系统的行为进行分析和建模。序列图描述对象间的消息交互,刻画系统的行为。根据题目的描述: 商 家在发布促销信息时,要先浏览自己所销售的商品的分类及分类中的具体商品信息:商家通过 getCategories消息将浏览请求提交给类 CatagoryManager实例,再由类 CatagoryManager的实例通过 getCommodities消息请求类 Category实例获得其分类中该商家的所有
36、商品:类 Category的实例通过 getCommodityinfo消息请求类 Commodity的实例返回商品的详细描述信息。 当把商家所销售的商品分类及分类中的具体商品信息返回给商家之后,商家在其中选择要促销的 一个或多个商品,并输入一些促销信息,通过 CreatePromotion消息请求类 PromotionManager实例生成促销信息。类 PromotionManager实例通过 Create消息创建一个促销对象,并通过 addCommodities消息向新建的促销对象中添加要促销的商品对象。 12 【正确答案】 关系:聚集 (聚合 )是关联的特例 (聚集是关联的一种 )。 不同
37、点:聚集表示部分与整体关系的关联。若从生命周期的角度考虑,则关联对象的生命周期一般无必然关系,聚集的整体对象往往对部分对象的生命周期负 责。 【试题解析】 主要考查面向对象分析设计中对类之间不同关系的理解。 关系:聚集 (聚合 )是关联的特例 (聚集是关联的一种 )。 不同点:聚集表示部分与整体关系的关联。若从生命周期的角度考虑,则关联对象的生命周期一般无必然关系,聚集的整体对象往往对部分对象的生命周期负责。 13 【正确答案】 (1)f00=e0+a00 f10=e1+a10 (2)f0j-1+a0j (3)fjj-1)+a1j f0j-1)+t0j-1+a1j, 或 f1j-1)+a1j
38、=f0j-1+t0j-1)+a1j, 或其等价形式 (4)fi=f0n-1+x0 li=0 (5)fi=f1n-1+x1 1i=1 【试题解析】 本题考查动态规划算法设计方法。 当问题具有两个特性,即最优子结构和重叠子问题时,可以考虑用动态规划求解问题。用动态规划求解问题具有四个步骤。 (1)刻画问题的最优子结构,描述问题的最优解包含子问题的最优解。对于本题来说 ,最短装配时间等于经过装配线。的第 n个工位的最短装配时间加上 x0,或者等于经过装配线 1的第 n个工位的最短装配时间加上 x1,取哪条装配线取决于哪个值更小。而经过某个装配线 0/1的第 i个工位的最短装配时间又等于经过装配线 0
39、/1的第 1-1个工位的最短装配时间,或者等于经过装配线 I/0的第i-1个工位的最短装配时间加上从这个工位到装配线 0/1的迁移时间,取决于哪个值更小。 (2)建立最优子结构的递归关系,这是非常关键的一步。对于本题来说,递归关系为 (3)根据递归关系求最优解的值。对于本题来说,最优解记录 在 fi中, fi= min(f(0, n-1)+x0,f(1, n-1)+x1): (4)构造最优解。对于本题来说,只是求出最优解是从哪条装配线装配出来,并没有记录最优解。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答
40、有效。 14 【正确答案】 (1)EnQueue(&tempQ, root) (2)brotherptr=brotherptr- nextbrother (3)!IsEmpty(tempQ),或其等价形式 (4)DeQueue(&tempQ, &ptr) (5)!ptr- firstchild,或其等价形式 (6)EnQueue(&tempQ, ptr- firstchild) (7)brotherptr=brotherptr- nextbrother 【试题解析】 本题考查树结构的存储及遍历运算。 借助队列结构对树进行层序遍历时,每个结点都进出队列一次,结点出队列时进行访问。其过程是:首先令
41、树根结点入队,若是森林 (树根之间互为兄弟 ),接着则令其余树的根结点入队,然后在队列非空的情况下,队头结点出队,访问该结点同时 令其孩子结点入队。以此类推,直到队列为空。 队列可以保证访问结点时按照层次和自左至右的顺序。 函数中,代码 “InitQueue(&tempQ); (1)”初始化队列并令根结点入队列,因此空(1)处应填入 “EnQueue(&tempQ, root)”。 采用二叉树存储树结构时,其右分支表示兄弟关系,因此队头结点出队时,应沿右分支将队头结点的所有孩子依次加入队列。以下代码处理第一棵树的兄弟结点,如下: while (brotherptr) EnQueue(&temp
42、Q, brotherptr); (2); /*end-while*/ 因此,空 (2)处应填入 “brotherptr=brotherptr - nextbrother”。这样,就完成了第一层结点的处理。 显然,空 (3)处应判断队列是否为空,即填入 “!IsEmpty(tempQ)”。队列非空的情况下,令队头元素出队列,即空 (4)处应填入 “DeQueue(&tempQ, &ptr)”。这是使用队列或栈结构存储元素以实现某种运算的基本特点。 若一个结点不存在孩子,则其 firstchild指针域为空,也无需令其孩子结点入队列。 因此,空 (5)处应填入 “!ptr- firstchild”
43、。反之,若一个结点有孩子,则应首先令其第一个孩子结点入队列,然后通过右分支链使其他孩子结点入队列。因此,空 (6)处应填入 “EnQueue(&tempQ, ptr- firstchild)”,空 (7)处应填入 “brotherptr =brotherptr- nextbrother”。 15 【正确答案】 (1)state = CLOSED | state = CLOSING (2)state = OPENING | state = STAYOPEN (3)state = OPEN (4)state- click() (5)state- timeout() (6)state- comple
44、te() (7)door- setState(door- OPENING) 【试题解析】 本题考查的是状态转换图的程序设计与实现。 空 (1)、 (2)和 (3)需要根据状态转换图来填写,空 (1)、 (2)和 (3)所在的方法为click,表示当发生 click事件时应该发生什么状态转换。根据代码 可知,发生 click事件时,状态分别跳转到 OPENING, CLOSING和 STAYOPEN,则发生 click前的状态由状态转换图可以得到,分别为 CLOSED或 CLOSING、 STAYOPEN或OPENING以及 OPEN。 代码 2中空 (4)、 (5)和 (6)考查当发生 cli
45、ck、 timeout以及 complete事件的时候,状态应该如何迁移。类 Door的 state成员变量用于记录类 Door所处的状态,而state变量的类型为 DoorState *, DoorState中分别具有 click、 timeout和 complete方法用来响应对应的事件,因此,空 (4)、 (5)和 (6)分别为: state- click()、 state-timeout()和 state- complete()。 空 (7)主要考查门的当前状态为 CLOSED时,发生 click事件时状态的迁移。根据状态图可知, CLOSED状态的在 click事件下将迁移到 OPE
46、NING,因此,此处应该将传输门状态设置为 OPENING, DoorState变量存储了当前其存储的传输门的实例,因此,可直接调用其方法 setState来设置状态,由于传输门状态采用类 的实例变量表示,所以此处应该填写 door- setState(door- OPENING)。 代码 1和代码 2的区别是:代码 2将状态间的转换规则封装到具体的类中,当状态转换图的转换规则发生变化时,只需更改部分对应类中的状态迁移规则,而代码 1中的迁移规则散落在程序中,维护起来较为困难。 16 【正确答案】 (1)state = CLOSED | state = CLOSING (2)state = O
47、PENING | state = STAYOPEN (3)state = OPEN (4)state.click() (5)state.timeout() (6)plete() (7)door.setState(door.OPENING) 【试题解析】 本题考查的是状态转换图的程序设计与实现。 空 (1)、 (2)和 (3)需要根据状态转换图来填写,空 (1)、 (2)和 (3)所在的方法为click,表示当发生 click事件时应该发生什么状态转换。根据代码可知,发生 click时,状态分别跳转到 OPENING, CLOSING和 STAYOPEN,则发生 click前的状态由状态转 换图
48、可以得到,分别为 CLOSED或 CLOSING、 STAYOPEN或OPENING以及 OPEN。 代码 2中空 (4)、 (5)和 (6)考查当发生 click、 timeout以及 complete事件的时候,状态应该如何迁移。类 Door的 state成员变量用于记录类 Door所处的状态,而state变量的类型为 DoorState, DoorState中分别具有 click、 timeout和 complete方法用来响应对应的事件,因此,空 (4)、 (5)和 (6)分别为 state.click()、state.timeout()和 plete()。 空 (7)主要考查门的当前状态为 CLOSED时候,发生 Click事件时状态的迁移,根据状态图可知, CLOSED状态的在 Click事件下将迁移到 OPENING,因此,此处应该将传输门状态设置为 OPENING, DoorState变量存储了当前其存储的传输门的实例,因此,可直接调用其方法