1、2005年下半年软件水平考试(中级)软件设计师下午(应用技术)试题真题试卷及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读下列说明和图,回答问题 1问题 3。 说明 某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托软件开发公司 A开发一套信息管理系统。该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。 A公司决定采用面向对象的分析和设计方法开发此系统。图 1-1所示为某类图书或唱碟被借阅时应记录的信息,图 1-2描述了系统定义的两个类 Book和 CD,分别表示图书和唱碟的信 息。1 经过进一步分析,设计人员决定定义一个类 Items on loan
2、,以表示类 Book和 CD的共有属性和方法。请采用图 1-2中属性和方法的名称给出类 Items_on_loan应该具有的属性和方法 (注意:不同名称的属性和方法表示不同的含义,如 CD中的composer与 Book甲的 author无任何关系 )。 2 为了记录每种图书或唱碟租借的历史记录,引入类 CirculationHistory,类中存储的信息是图 1-1中所表示的内容。请采用 UML表示法将下列四个类间的关系表示出来。 3 现需了 解十大最畅销 (借出次数最多 )图书或唱碟。为此,引入 TenPopulate类以存储所有十大畅销图书或 CD的名称及其被借出的次数。下列顺序图描述了
3、某类图书或唱碟被借出后成为十大畅销图书或唱碟时对象间的消息交互。系统在一次运行过程中,应有 (1)个 TenPopulate实例对象最合适,一个 TenPopulate类实例对象最多需要和 (2)个 Items_on_loan实例对象交互。4 阅读下列说明和图,回答问题 1至问题 3。 说明 某企业决定开发一个企业仓储管理系统,山李工承担系统的设计工作。该系统的网络连接如图 2-1 所示。 图 2-1 该企业有多个仓库,图 2-1所示的中心数据库存储了各个仓库中每种货物的库存信息。每个仓库配备一台前端机,进出货物均由前端机辅助实现。管理员每天上班时,通过前端机从中心数据库的库存表中读取本仓库各
4、种货物的库存数,每个仓库的当日业务数据也都暂存在前端机,当天业务结束后,再将前端机中存储的数据传输到主机进行存储与汇总。 每个仓库可以存放多种货物,但同一种货物不能存放在不同的仓库中。每个仓库有多个管理员,但每个管理员只管理一个仓库。货物出库 /入库时,由仓库管理员将货物的条码通过阅读器输入前 端机中,货物数量的默认值为 1,可以由管理员修改。前端机根据输入的货物信息,打印 “出库 /入库 ”清单。出库 /入库单中同一种货物最多只出现一次,每份出库 /入库单由流水号唯一标识。图 2-2是一个出库单的实例。 图 2-2 该系统处理业务的过程如下。 1初始化:前端机根据仓库号从货物表中读取本仓库中
5、每种货物的货物编码、库存量、货物名称和单价; 2登记出库 /入库信息:由前端机存储每一笔 “出库从库 ”记录: 3汇总:在每个工作日结束前汇总当日各种货物的 “出库 /入库 ”量至日汇总表; 4更新库存表:根据当日的汇总信息 更新货物的库存。 李工经过分析,设计出如图 2-3所示的关系模式。 图 2-3 出入库单 (流水号,出入库标志,管理员号,时间 ) 出入库记录 (货物编码,数量,流水号 ) 日汇总表 (日期,货物编码,数量,出入库标志 ) 仓库 (仓库号,仓库名,仓库电话 ) 管理员 (管理员号,姓名,仓库号 ) 货物 (a) 注:时间格式为年 -月 -日时:分;日期格式为年 -月 -日
6、。 卖体联系图的表示方法如图 2-4所示,其中方框表示实体,菱形表示联系,联系的类型在实体与联系的边上标出。图 2-5为与该系统对应的实体联系图。4 根据题意,补 充图 2-3中 (a)处的空缺,即货物关系模式的属性。 5 根据题意,补充图 2-5中缺失的联系和联系的类型,使其成为完善的实体联系图。其中,联系名分别取名为联系 1,联系 2,联系 3, 。 6 写出每种关系模式的主键。 7 阅读下列说明和图,回答问题 1至问题 4,将解答填入答题纸的对应栏内。 说明 某公司计划与客户通过 Internet交换电子邮件和数据 (以下统一称为 “消息 ”)。为保障安全,在对传输的数据进行加密的同时,
7、还要对参与通信的实体进行身份认证。因此,需同时使用对称与非对称密钥体系。图 3-1描述了 接收者 B使用非对称密钥体系对发送者 A进行认证的过程。 图 3-1 图 3-2描述了发送和接收消息的过程,其中的认证过程使用了图 3-1中的方法。图 31中的方框 a和方框 b与图 3-2中的方框 a和方框 b相同。 图 3-2 图 3-2中发送和接收消息的过程是: 1)发送者 A使用与接收者 B共享的对称密钥体系的密钥加密将要发送的消息。 2)为了实现身份认证, A使用与 B共享的摘要算法生成消息摘要,并使用公钥密码体系把生成的消息摘要加密后发送给 B(这里假设 A和 B都能通过安全的方法获得对方的公
8、钥 )。 3)B使用非对称密钥体系解 密收到的消息摘要,使用与A共享的对称密钥体系的密钥解密加密后的消息,再使用与 A共享的摘要算法针对解密后的消息生成消息摘要。 4)B对比自己生成的消息摘要与接收到的 A发送的消息摘要是否相同,从而验证发送者 A的身份。 7 请在下列选项中选择合适的答案,填入图 3-1、图 3-2的方框 a和方框 b。 B的公钥, B的私钥,摘要算法, A的私钥, A的公钥,会话密钥 8 请在下列选项中选择合适的答案,填入图 3-2的方框 c至方框 f。 B的公钥, B的私钥,摘要算法, A的私钥, A的公钥,会话密钥 9 按照 图 3-2中的方法发送邮件时,使用不同的密码
9、体制加密消息和消息摘要,请用 150字以内文字简要说明这样做的理由。 10 请从下面关于摘要函数的说法中选出所有正确的描述。 a很容易使不同的输入数据生成相同的输出数据。 b根据输入数据获取输出数据的时间非常短。 c根据输入数据获取输出数据的时间非常长。 d输出数据的长度比输入数据的长度要长。 e根据输出数据无法还原出输入数据。 11 阅读下列函数说明、图和 C代码,将应填入 (n)处的字句。 说明 散列文件的存储单位称为桶 (BUCKET)。假如一个桶能存放 m个记录,当桶中已有 m个同义词(散列函数值相同 )的记录时,存放第 m+1个同义词会发生 “溢出 ”。此时需要将第m+1个同义词存放
10、到另一个称为 “溢出桶 ”的桶中。相对地,称存放前 m个同义词的桶为 “基桶 ”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。 例如:设散列函数为 Hash(Key)=Key mod 7,记录的关键字序列为15,14,21,87,97,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图 4-1所示。 图 4-1 为简化起见,散列文件的存储单位以内存单元表示。 函数 InsertToHashTable(int NewElemKey)
11、的功能是:将元素 NewEIemKey插入散列桶中,若插入成功则返回 0,否则返回 -1。 采用的散列函数为 Hash(NewElemKey)=NewElemKey % P,其中 P为设定的基桶数目。 函数中使用的预定义符号如下: #define NULLKEY -1 /*散 列桶的空闲单元标识 */ #define P 7 /*散列文件中基桶的数目 */ #define ITEMS 3 /*基桶和溢出桶的容量 */ typedef struct BucketNode /*基桶和溢出桶的类型定义 */ int KcyDataITEMS; struct BucketNode *Link; BUC
12、KET; BUCKET BucketP; /*基桶空间定义 */函数 int lnsertToHashTable(int NewElemKey) /*将元素 NewElemKey插入散 列桶中,若插入成功则返回 0,否则返回 -1*/ /*设插入第一个元素前基桶的所有 KeyData、 Link域已分别初始化为 NULLKEY、 NULL*/ int Index; /*基桶编号 */ int i,k; BUCKET *s,*front,*t; (1) ; for(i=0; i ITEMS;i+)/*在基桶查找空闲单元,若找到则将元素存入 */ if(BucketIndex.KeyDatai=N
13、ULLKEY) BucketIndex.KeyDatai=NewElemKey; break; if( (2) ) return 0; /*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶 */ (3) ; t=BucketIndex.Link; if(t!=NULL) /*有溢出桶 */ while (t!=NULL) for(k=0; k ITEMS; k+) if(t- KeyDatak=NULLKEY)/*在溢出桶链表中找到空闲单元 */ t- KeyDatak=NewElemKey; break; /*if*/ front=t; if( (4) )t=t- Link;
14、else break; /*while*/ /*if*/ if( (5) ) /*申请新溢出桶并将元素存入 */ s=(BUCKET*)malloe(sizeof(BUCKET); if(!s) return-1; s- Link=NULL; for(k=0; kITEMS; k+) s- KeyDatak=NULLKEY; s- KeyData0=NewElemKey; (6) ; /*if*/ return 0; /*InsertToHashTable*/ 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有
15、效。 12 阅读以下说明和 C+代码,将应填入 (n)处。 说明 在一公文处理系统中,开发者定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的 DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当 OfficeDoc对象的内容或状态发生变化时,所有与之相关联的 DocExplorcr对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个 C+源文件中,能够正确编译通过。 C+代码 #include iostream con
16、st OBS_MAXNUM=20;/最多与 OfficeDoc对象相关联的 DocExplorer对象的个数 (1); class DocExplorer /关注 OfficeDoc公文对象的类 public: DocExplorer( (2) *doc); /构造函数 (3) void update(OfficeDoc *doc)=0;/更新自身状态的函数 /其他相关属性和方法省略 ; class OfficeDoc /公文类 private: DocExplorer *myObsOBS_MAXNUM; /关注此公文类的 DocExplorer类对象指针数组 int index; /与 Of
17、ficeDoc对象关联的 DocExplorer对象的个数 public: OfficeDoe() index=0; void attach(DocExplorer *o) /将一 DoeExplorer对象与 OfficeDoe对象相关联 if(index =OBS_MAXNUM |o=NULL)return; for(int loop=0; loop index; loop+) if(myObsloop=o) return; myObsindex=o; index+; void detaeh(DocExplorer *o) /接触某 DoeExplorer对象与 OfficeDoc对象的关
18、联 if(0=NULL) return; for(int loop=0; loop index; loop+) if(myObsloop=o) if(loop =index-2)myObsloop=myObsindex-1; myObsindex-1=NULL; index-; break; private: void notifyObs() /通知所有的 DocExplorer对象更改自身状态 for(int loop=0; loop index; loop+) myObsloop- (4); /DocExplorer对象更新自身状态 /其他公文类的相关属性和方法 ; DocExplorer
19、:DocExplorer(OfficeDoc *doc)/DocExplorer 类对象的构造函数 doc- (5); /将此 DocExplorer对象与 doc对象相关联 13 阅读以下说明和 Java代码,将应填入 (n)处。 说明 在一公文处理系统中,开发者定义了一个公文类 OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文的内容或状态发生变化时,关注此OfficeDoc类对象的相应的 DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组 DocExplorer对象。当 OfficeDoc对象的内容或状态发生变化时,所有与之相关联
20、的 DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码采用 Java语言实现,能够正确编译通过。 Java代码 /Subject.java 文件 public interface Subject public void attach(Observer DocExplorer); public void detach(Observer DocExplorer); void notifyObservers(); /Observer.java 文件 public interface Observer void update(1) ); /OfficeDoc.java 文件 i
21、mport java.util.*; public class OfficeDoc implements Subject(/OfficeDoc 类实现 Subject 接口 private Vector ObserverVeetor=new java.util.Vector(); /存储与 OfficeDoc相关联的 DocExplorer 对象 public void attach(Observer observer) /将某 DocExplorer 对象与 OfficeDoc 相关联 ObserverVector.addElement(observer); public void deta
22、ch(Observer observer) /解除某 DocExplorer 对象与 OfficeDoc的关联关系 ObserverVector.removeElement(observer); public void notifyObservers() /当 OfficeDoc对象状态已发生变化时,通知所有的 DocExplorer对象 Enumeration enumeration=(2); while (enumeration.hasMoreElements() (Observer)enumeration.nextElement().(3); public Enumeration Obs
23、ervers() return ObserverVector.elements(); /其他公文类的属性和方法省略 /DoeExplorer.java 文件 public class DocExplorer implements (4) public void update( (5) ) /更新 DocExplorer自身的状态,代码省略 14 阅读以下说明和 C代码,将应填入 (n)处。 说明 在一公文处理系统中,开发者定义了一个公文结构 OfficeDoc,其中定义了公文应该具有的属性 (字段 )。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个
24、 OfficeDoc结构能够关联一组DocExplorer结构。当 OfficeDoc结构的内容或状态发生变化时,所有与之相关联的 DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用 C语言实现,能够正确编译通过。 C代码 #include stdio.h #define OBS_MAXNUM 20 /*一个 OfficeDoc变量最多能够关联的 */ /*DoeExplorer变量的个数 */ typedef void(1)(struct OfficeDoc*,street DocExplorer*); struct DocExplorer func update;
25、/* DocExplorer结构采用的更新函数 */ /*其他的结构字段省略 */ ; struct OfficeDoc (2) myObsOBS_MAXNUM; /*存储所有与 OfficeDoc相关联的 DoeExplorer结构指针 */ int index;/*与 OfficeDoc结构变量相关联的 DocExplorer结构变量的个数 */ ; void attach(struet OfficeDoc *doc, struet DocExplorer *ob) /*关联 Obersver结构 ob与 OfficeDoe结构 doc*/ int loop=0; if(doc- inde
26、x =OBS_MAXNUM | ob=NULL) return; for(loop=0; loop doc- index; loop+) if(doc- myObsloop=ob)return; doc- myObsdoe- index=ob; doc- index+; ) void detach(struct OfficeDoc *doc, struct DocExplorer *ob) /*解除 doc结构与 ob结构间的关系 */ int loop; if(ob=NULL)return; for(loop=0; loop doc- index; loop6+) if(doc- myObs
27、loop=ob) if(loop =doc- index-2) doe- myObsloop=doc- myObs (3) ; doc- myObsdoe- indox-1=NULL; doe- index-; break; void updatel(struct OfficeDoc *doc,struct DocExplorer *ob) /*更新 ob结构的值,更新代码省略 */ void update2(stmct OfficeDoc *doc, struct DocExplorer *ob) /*更新 ob结构的值,更新代码省略 */ void notifyObs(struet Off
28、iceDoc *doc) /*当 doc结构的值发生变化时,通知与之关联的所有 DocExplorer结构变量 */ int loop; for(loop=0; loop doc- index; loop+) (doc- myObsloop)- update(4); void main() stmct OfficeDoc doc;/*定义一 OfficeDoc变量 */ struct DocExplorer explorer1, explorer2;/*定义两个 DocExplorer变量 */ /*初始化与 OfficeDoc变量相关的 DocExplorer变量个数为 0*/ doc.in
29、dex=0; explorer1.update=update1;/*设置 explorer1变量的更新函数 */ explorer2.update=update2;/*设置 explorer2变量的更新函数 */ attaeh(/*关联 explorer1与 doc对象 */ attach(/*关联 explorer2与 doc对象 */ /*其他代码省略 */ (5);/*通知与 OfficeDoc相关的所有 DocExplorer变量 */ return; 2005年下半年软件水平考试(中级)软件设计师下午(应用技术)试题真题试卷答案与解析 一、必答题(共 4道大题,每道大题 15分) 1
30、 【正确答案】 属性: title 方法: Reference Title 【试题解析】 如果要求设计一个类表示 Book和 CD的共有属性和方法,那么就需要从 Book和 CD中找出相同的属性和方法, Book和 CD都有 title属性和reference title方法,所以 Item on loan的属性为 title,方法为 reference title。 Book和 CD应该继承 item_on_loan类,所以它们之间的关系是继承关系,而CirculationHistory表示对象的租借次数,它不属于 Item_on_loan的属性,但Item_on_loan应该能够查询到 C
31、irculationHistory记录的信息,所以它们之间是聚集关系。 Tenpopulate类存储十大畅销图书或 CD的名称及其被借出的次数,顺序图中明确的给出了其对象,通常 整个系统中有一个对象就可以了,但是为了记录图书或唱片的借出信息,每当有图书或唱片被借出时,都需要和 TenPopulate类的对象发生交互。因此有可能所有的图书和唱片都要和 TenPopulate类对象发生交互。 2 【正确答案】 其中,类 Items_on_loan与CirculationHistory之间是聚集关系; Book、 CD与 Items_on_loan之间是继承关系。 3 【正确答案】 (1)1 (2)
32、图书和唱碟种类数 4 【正确答案】 货物编码,货物名称,单价,仓库号,库存量 【试 题解析】 货物关系模式要保存货物的信息,因此需要有货物编码,这是货物的唯一标识,由于其他的关系模式中未出现货物名称和单价,因此关系模式需要有单价和货物名称两项,因为每一种货物只能放在一个仓库中,因此需要有仓库号信息,每天前端机获取货物的库存信息,还需要有库存量属性,因此, (a)处应填写: 货物编码,货物名称,单价,仓库号,库存量 5 【正确答案】 其中,联系名中的序号可任意排列。 若联系 3建立在出入库单和日汇总表之间也正确,或者同时建立两个联系也正确。 【试题解析】 根据题目说明部分的描述, 一张出 /入库
33、单上有多条出库记录,而每条出库记录只能在一张出库单上显示,一条出库记录只能表示一种货物的出库或入库,而一种货物可以出、入库多次。因此出入库单与出入库记录之间的联系是一对多 (1:n),货物与出入库记录之间的联系是一对多 (1:n)。同时,每条出 /入库记录只能汇总到一条日汇总表记录,而一张日汇总表记录对应了多条出入库记录,因此日汇总表与出入库记录之间的联系是一对多 (1:n)。由于每种货物只能放在一个仓库中,而一个仓库可以存放多种货物,因此仓库与货物之间的联系是一对多 (1:n)。每个仓库可以有多个管理员 ,而一个管理员只能管理一个仓库,因此仓库与管理员之间的联系是 (1“n)。 ER图见参考
34、答案。 6 【正确答案】 出入库单的主键:流水号 出入库记录的主键:流水号,货物编码 日汇总表的主键:日期,货物编码,出入库标志 仓库的主键:仓库号 管理员的主键:管理员号 货物的主键:货物编码 【试题解析】 分析出入库单 (流水号,出入库标志,管理员号,时间 )的属性可知,只有流水号可以标识唯一的一张出入库单,因此出入库单的主键为流水号。在出入库记录 (货物编码,数量,流水号 )中,流水号加货物编码可以唯一地标识一条出入 库记录,因此出入库记录的主键为流水号和货物编码。在日汇总表 (日期,货物编码,数量,出入库标志 )中,同一货物可在多条记录中出现,在同一时间,相同货物可在多条记录中出现,因
35、此日期、货物编码和出入库标志标识一张日汇总表的一条记录,即日汇总表的主键为日期、货物编码和出入库标志。显然,从管理的角度出发,一个仓库号唯一标识一个仓库,每名管理员被分配唯一的管理员号,每种货物都分配了唯一的货物编码。 7 【正确答案】 方框 a: A的私钥,方框 b: A的公钥 【试题解析】 本题考查有关安全和密码的知识。 这里主要 解决发送方和接收方的认证问题。发送方应该使用只有自己才掌握的私钥对数据进行加密,这样才能确保在认证过程中对发送方的认证。接收方应使用发送方的公钥对认证数据进行解密,以达到认证目的,因此方框 a和 b分别为, A的私钥, A的公钥。 8 【正确答案】 方框 c:摘
36、要算法 方框 d:会话密钥 方框 e:会话密钥 方框 f:摘要算法 【试题解析】 在传输大量数据时,会由发送方和接收方协商会话密钥,使用会话密钥对数据进行加解密。与此同时,使用摘要算法对数据生成摘要进行认证,因此方框 c、 d、 e、 f分别为摘要算法 、会话密钥、会话密钥、摘要算法。 9 【正确答案】 对称密钥体系的加解密效率非常高,适合于加解密大量的数据,因此可用于加密消息。公钥密码体系的加解密效率较低,更适合用于加密少量数据的场合,因此可用于加密消息摘要和会话密钥。 【试题解析】 对称密钥体系的加解密效率非常高,适合于加解密大量的数据,因此可用于加密消息。公钥密码体系的加解密效率较低,更
37、适合用于加密少量数据的场合,因此可用于加密消息摘要和会话密钥。 10 【正确答案】 b根据输入数据获取输出数据的时间非常短 e根据输出数据无法还 原出输入数据 【试题解析】 摘要函数具有如下特点:根据输入数据获取输出数据的时间非常短,并且根据输出数据无法还原出输入数据。 11 【正确答案】 (1) Index=NewElemKey % P (2) i ITEMS (3) front= k ITEMS;k+) if(t- KeyDatak=NULLKEY)/*在溢出桶链表中找到空闲单元 */ t- KeyDatak=NewElemKey; break; /*if*/ front=t; if(4)
38、t=t- Link; else break; /*while*/ /*if*/ 由于每个溢出桶都可以存储 ITEMS个元素,所以在溢出桶中查找空闲单元与在基桶中的查找过程相同,代码如下。 for(k=0;k ITEMS;k+) if(t- KcyDatak=NULLKEY)/*在溢出桶链表中找到空闲单元 */ t- KeyDatak=NewElemKey; break; /*if*/ 若在指针 t指向的溢出桶中找到空闲单元则插入元素,否则,由 “t=t- Link”得到下一个溢出桶的指针,因此 “k ITEMS”可作为 是否在当前溢出桶中找到空闲单元的判定条件。 显然,在桶号 Index的基桶
39、和其所有溢出桶都已满的情况下, t的值为空指针。此时才需要申请新的溢出桶并建立链接关系,因此在上面查找溢出桶中空闲单元时,进行指针 t的后移 “t=t- Link”前应先用 front记录 t的值,以便于后面建立链接关系。所以空 (3)处应给 front置初值,即 “front=&BucketIndex”,空 (4)填入“k=ITEMS”,空 (5)填入 “t NULL”。空 (6)处建立新申请溢出桶的链接关系“front- Link=s”。 二 、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 12 【正
40、确答案】 (1) class OfficeDoc (2) OfficeDoc (3) virtual (4) update(this) (5) attach(this) 【试题解析】 首先, DocExplorer需要知道 OfficeDoc是一个类,但因为OfficeDoc定义在 DocExplorer之后,所以需要在 DocExplorer类的定义前加上class OfficeDoc的声明,因此 (1)空处应该填写 class OfficeDoc 第 (2)空可根据程序最后的构造函数的实现知道,应该填写 OfficeDoc;在观察者模式中,不同的观察者更新自身的方法不同,因此第 (3)空处
41、应该填写 virtual,而且程序最后的 =0也表明是一个纯虚拟函数; 第 (4)空处,程序注释说明所有与 OfficeDoc相关联的对象更新自身状态因此需要使用 update函数,但 update函数的参数是一个 OfficeDoc类的对象。所以,参数应该为 this; 第 (5)空将 OfficeDoc类的对象和 DocExplorer类的对象相关联,关联的函数是 OfficeDoc中的 attach方法,其参数是一个 DocExplorer对象,使用 this能够表示当前的对象,所以应该填写 attach(this)。 13 【正确答案】 (1) Subject subject(注:第二
42、个 subject可用其他标识符替换 ) (2) Observers() (3) update(this) (4) Observer (5) Subject subject(注:第二个 subject可用其他标识符替换 ) 【试题解析】 第 (1)空处观察者对象更新自身的状态,更新的数据应该来自被观察者对象,所以此处应该为一 Subject,因此第 (1)空的答案为 Subject subject。同样的道理,第 (5)空和第 (1)空是相同的。 notifyObservers方法通知所有的观察者对象更新自身的状态,所以 (2)空处应该返回所有的观察者对象,调用方法 Observers()即可
43、获得。第 (3)空处对每个观察者对象更新状态,所以应该调用 update方法, update方法需要此被观察者对象作为参数,所以使用 this来获 取对象自身。 DocExplorer是一个观察者,因此需要实现接口 Observer,第 (4)空为 Observer。 14 【正确答案】 (1) *func (2) struct DocExplorer* (3) doc- index-1,或等价形式 (4) doc和 doc- myObsloop,或等价形式 (5) notifyObs(&doc) 【试题解析】 DocExplorer中 func是中类型,而且根据 (1)处的其余部分,此定义是
44、一个函数类型的定义,因此 (1)处答案为 *func。 一个 OfficeDoc关联多个 DocExplorer,因此 (2)处应该为 Docexplorer或者 DocExplorer*,注释中明确说明是指针,所以答案为 DocExplorer*。 for循环中检测 doc结构指针是否是需要解除关联的结构,如果是,那么将 doc结构数组中最后一个指针覆盖此 doc指针所在位置,然后将最后一个指针域置空。所以 (3)处应为 index-1。 notifyObs函数更新所有与 OfficeDoc doc结构相关联的 DocExplorer结构。因为 update的第一个参数是 OfficeDoc结构指针,第二个参数是 DocExplorer结构指针。因此, (4)空处应该填写 doc和 doc- myObsloop,表示 doc结构和其相关的DocExplorer结构。 第 (5)空处要求调用 notifyObs方法,其参数要求为一个 OfficeDoc结构指针,所以将 doc的地址传递给参数,答案为 notifyObs(&doc),表示通知所有与 doc相关的其他结构。