早教吧 育儿知识 作业答案 考试题库 百科 知识分享
早教吧考试题库频道 --> 计算机类考试 -->软考中级 -->

阅读以下说明和C代码(代码13-4),将应填入(n)处的字句写在对应栏内。 【说明】在一公文处理系统中,开

题目

阅读以下说明和C代码(代码13-4),将应填入(n)处的字句写在对应栏内。

【说明】

在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。

【代码13-4】

include<stdio.h>

define OBS_MAXNUM 20 /*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/

typedef void( (1) )(struc OffieeDoc*, struct DoeExplorer*)I;

struct DocExplorer{

func update;/*DocExplorer结构采用的更新函数*/

/*其它的结构字段省略*/

};

struet OffieeDoc{

(2) myObs[OBS_MAXNUM];

/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/

int index;/*与OffieeDoc结构变量相关联的DoeExplorer结构变量的个数*/

};

void attaeh(struct OfficeDoc*doc, struct DocExplorer*ob){

/*关联Observer结构ob与OffieeDoe结构doe*/

int loop=0;

if(doc->index>=OBS_MAXNUM||ob==NULL)return;

for(loop=0, loop<doc->index; loop++)

if(doc->myObs[loop]==ob)return;

doc->myObs[doe->index]=ob;

doc->index++;

}

void detaeh(struct OfficeDoc*doc, struct DocExplorer*ob){

/*解除doc结构与ob结构间的关联*/

int loop;

if(ob==NULL)return;

for(loop=0;loop<doc->index; loop++){

if(doe->myObs[loop]==ob){

if(loop<=doc->index-2)

doc->myObs[loop]=doc->myObs[(3)];

doc->myObs[doc->index-1]=NULL;

doc->index——;

breack;

}

}

}

void updatel(struct OfficeDoe*doe, struct DoeExplorer *ob){

/*更新ob结构的值,更新代码省略*/

} void update2(struct OffieeDoc*doc,struet DocExplorer *ob){

/*更新ob结构的值,更新代码省略*/

}

void notifyObs(struct OfficeDoc* doc){

/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/

int loop;

for(loop=0; loop<doc->index; loop++){

(doc->myObs[loop])->update((4));

}

}

void main(){

struct OfficeDoc doc; /*定义一了OfficeDoe变量*/

struct DocExplorer explorer1, explorer2; /*定义两个DocExplorer变量*/

/*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/

doc.index=0;

explorer1.update=update1; /*设置explorer1变量的更新函数*/

explorer2. update=update2; /*设置explorer2变量的更新函数*/

attach(&doc, &explorer1); /*关联explorer1与doc对象*/

attach(&doc, &explorer2); /*关联explorer2与doc对象*/

/*其它代码省略*/

(5); /*通知与OfficeDoe相关的所有DoeExploer变量*/

return;

}

参考答案
正确答案:(1)*func (2)struct DocExplorer* (3)doc->index-1或等价形式(4)docdoc->myObs[loop]或等价形式 (5)notifyObs(&doc)
(1)*func (2)struct DocExplorer* (3)doc->index-1,或等价形式(4)doc,doc->myObs[loop],或等价形式 (5)notifyObs(&doc) 解析:在结构体DocExplorer的定义中,func是一种类型,语句“func update;”定义了类型为 func的变量update,又根据(1)空所在行的其它信息,可知typedef是在声明指向函数的指针类型,该函数的参数列表为(struc OfficeDoc*,struct DocExplorer*),返回值类型为 void,因此第(1)空填:*func。这是用tpyedet。声明指向函数的指针类型的格式。
根据第(2)空下一行的注释可知,该语句是将DocExplorer结构体指针存储在OfficeDoc中,所以可知第(2)空是定义一个DocExplorer指针数组变量,因此,第(2)空填: struct DocExplorer*。
根据函数detach里面的语句“doc->myObs[doc->index-1]=NULL;doe-> index——;”可知,其功能是使关联个数减1。并将数组。myObs的最后一个关联结构体的指针置空。如果要解除关联的是数组的最后一个元素doc->myObs[doc->—index-1],那么可直接将其置空;但如果要解除关联的结构体不是最后一个呢?显然,语句:
if(loop=doc->—index-2)
doc->—myObs[loop]=doc->—myObs[(3)];便是用来处理这种情况的。由于关联总个数减1,导致最后一个元素丢失,而在这种情况下要解除关联的结构体并非最后一个元素,因此不能丢失最后一个元素,而要将其保存在要解除关联的结构体指针中,这样一举两得,既保存了不该解除的,又解除了该解除的结构体。因此,第(3)空填:doe->index-1。
第(4)空是要填函数update的实参列表,而update是func类型,对照第(1)空所在行的形参列表,显然可得第(4)空填“doc,doc->myObs[loop]”。特别要注意,不能少了逗号,因为update函数有两个参数。
函数notifyObs的形参为结构体OfficeDoc的指针类型,因此第(5)空在调用该函数时要传递一个地址,所以填:notifyObs(&doc)。
看了阅读以下说明和C代码(代码13...的网友还看了以下:

在封闭系统中用弹簧秤称一物体的重力,由弹簧秤读数的变化可以判定系统的运动状态,下面说法正确的是A. 物理 2020-05-22 …

在计算机系统中,操作系统是()。A.一般应用软件B.核心系统软件C.一般系统软件D.用户应用软件 计算机类考试 2020-05-23 …

阅读以下说明和Java代码,将应填入(n)处的字句写在对应栏内。 [说明] 在一些大型系统中,大多数 计算机类考试 2020-05-26 …

821升级850的001帐套的应收系统中选择对部门权限进行控制,在系统管理中设置某一非帐套主管的操作 计算机类考试 2020-05-31 …

阅读丁肇中的《应有格物致知精神》(选段),完成下面各题。①但是传统的中国教育并不重视真正的格物和致知 语文 2020-11-05 …

在高中阅读训练中经常提到精读和泛读的问题,究竟什么时候应该精读,什么时候应该泛读?对什么样的文章应该 语文 2020-12-04 …

学习地理,有统计图表的应读懂统计图表,然后答题.试读中国人口增长曲线图,回答7-9题.估算一下,不实 其他 2020-12-04 …

学习地理,有统计图表的应读懂统计图表,然后答题.试读中国人口增长曲线图,回答7-9题.十八届五中全会 其他 2020-12-04 …

阅读丁肇中的《应有格物致知精神》(选段),完成问题。①但是传统的中国教育并不重视真正的格物和致知。这 语文 2021-01-13 …

求老师解答:阅读丁肇中的《应有格阅读丁肇中的《应有格物致知精神》(选段),①但是传统的中国教育并不重 语文 2021-01-13 …