阅读以下说明和C代码,将应填入(n)处。[说明] 在一公文处理系统中,开发者定义了一个公文结构Office
阅读以下说明和C代码,将应填入(n)处。
[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性(字段)。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个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;/* DocExplorer结构采用的更新函数*/
/*其他的结构字段省略*/
};
struct OfficeDoc{
(2) myObs[OBS_MAXNUM];
/*存储所有与OfficeDoc相关联的DoeExplorer结构指针*/
int index;/*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/
};
void attach(struet OfficeDoc *doc, struet DocExplorer *ob){
/*关联Obersver结构ob与OfficeDoe结构doc*/
int loop=0;
if(doc->index >=OBS_MAXNUM || b==NULL) return;
for(loop=0; loop <doc->index; loop++)
if(doc->myObs[loop]==ob)return;
doc->myObs[doe->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[loop]==ob){
if(loop<=doc->index-2)
doe->myObs[loop]=doc->myObs[ (3) ];
doc->myObs[doe->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 OfficeDoc *doc){
/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/
int loop;
for(loop=0; loop <doc->index; loop++){
(doc->myObs[loop])->update((4));
}
}
void main(){
stmct OfficeDoc doc;/*定义一OfficeDoc变量*/
struct DocExplorer explorer1, explorer2;/*定义两个DocExplorer变量*/
/*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/
doc.index=0;
explorer1.update=update1;/*设置explorer1变量的更新函数*/
explorer2.update=update2;/*设置explorer2变量的更新函数*/
attaeh(&doc,&explorer1);/*关联explorer1与doc对象*/
attach(&doc,&explorer2);/*关联explorer2与doc对象*/
/*其他代码省略*/
(5);/*通知与OfficeDoc相关的所有DocExplorer变量*/
return;
}
(1) *func (2) struct DocExplorer* (3) doc->index-1,或等价形式 (4) doc和doc->myObs[loop],或等价形式 (5) notifyObs(&doc) 解析:DocExplorer中func是中类型,而且根据(1)处的其余部分,此定义是一个函数类型的定义,因此(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->myObs[loop],表示doc结构和其相关的DocExplorer结构。
第(5)空处要求调用notifyObs方法,其参数要求为一个OfficeDoc结构指针,所以将doc的地址传递给参数,答案为notifyObs(&doc),表示通知所有与doc相关的其他结构。
如图,B点不动,A点可以在Y轴上任意移动但不能和o点重合,直线AC是直线AB所做的垂线,点D是直线A 数学 2020-03-30 …
如图所示,平行六面体OABC-O‘A’B‘C’,且向量OA=a,OC=b,OO‘=c(1)用向量a 数学 2020-05-13 …
这些音标到底怎么读1.e读A还是唉怎么有的读A有的读唉如果读A那和ei有什么不一样2.eu(e倒过 语文 2020-06-30 …
有氧呼吸中的O2氧元素到哪里去了?Co2还是H2O?光合作用中CO2的C和O分别去...有氧呼吸中 其他 2020-06-30 …
根据维生素C的化学式C6H8O6计算:(相对原子质量:C:12H:1O:16)(1)维生素C的相对 化学 2020-07-16 …
如图,圆心在坐标原点的⊙O的半径为1,若抛物线y=-x2+c和⊙O刚好有三个公共点,则此时c=.若 其他 2020-07-26 …
如图:⊙O和⊙O'内切于P半径OA和OB切⊙O'于C、D连O'C和O'D如果两圆半径分别为9和3则 数学 2020-07-31 …
Cocl2的Co是钴还是一氧化碳怎么读,是氯化钴还是氯化啥?这东西不是由氯仿受光照2CHCl3+O2 化学 2020-11-01 …
老师列举过C和O的各种划分之最,1生物体内占细胞干重最多的的元素是C,2湿重是O.3…………(我记得 政治 2020-12-24 …
(2009•开封一模)下列叙述不正确的是()A.SiO2和CO2中Si和O,C和O之间都是共价键 化学 2021-02-01 …