阅读以下说明和C代码,将应填入(n)处。 [说明] 在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性(字段)。当公文的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个Of

admin2008-01-15  38

问题 阅读以下说明和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 || ob==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相关的其他结构。
转载请注明原文地址:https://kaotiyun.com/show/9fDZ777K
0

相关试题推荐
最新回复(0)