阅读以下函数说明和C代码,回答问题 [说明] 对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShe

admin2012-02-20  33

问题 阅读以下函数说明和C代码,回答问题
[说明]
   对多个元素的聚合进行遍历访问时,需要依次推移元素,例如对数组通过递增下标的方式,数组下标功能抽象化、一般化的结果就称为迭代器(Iterator)。模式以下程序模拟将书籍(Book)放到书架(BookShelf)上并依次输出书名。这样就要涉及到遍历整个书架的过程。使用迭代器Iterator实现。图7-1显示了各个类间的关系。以下是JAVA语言实现,能够正确编译通过。
   [图7-1]

[C代码]
   typedef bool(*fun1)();
   typedef  (1)  (*fun2)();
   const int BOOK_MAX = 10;//最大书本数
   struct Book{
   char name30;
   };
   struct BookShelf{//书架
   struct Book books[BOOK MAX];
   int index;//书架上最后一本书的下标加1,即下一本书的下标,如0表示有0本书
   };
   Struct Book* getBookAt(struct BookShelf *BS, int index)
   //从书架BS上取得下标为index的书
   //只有当下标大于等于0且不大于当前书架上的最后一本书对应的下标,才取书成功:
   //否则失败,返回NULL
   {
   if(index >= 0 &&  (2)  ){
   return &BS->books[index];
   }
   return NULL;
   }
   bool appendBook(struct BookShelf *BS, struct Book book)
   {
   if(BS->index < BOOK_MAX){
   BS->books[BS->index++] = book;
   return true;
   }
   return false;
   }
   int getLength(struct BookShelf *bookShelf)
   {
   return bookShelf->index;
   }
   struct Iterator{//迭代器
   fun1 hasNext;//判断是否还有下一个元素
   fun2 next;//取得下一个元素
   };
   struct BookshelfIteratorf{//书架迭代器
   int index;
   struet BookShelf* bookShelf;
   }bookShelfIterator = {0, NULL};
   bool BShasNext()//判断是否还有下一本书
   {
   if(bookShelfIterator.index
       return true;
   }else{
   return false;
   }
   }
   struct Book* BSnext()//取得下一本书,并将index加1,以便下一次正确访问
   {
   return getBookAt(bookShelfIterator.bookShelf,
     (3)  );
   }
   void main()
   {
   struct BookShelf bookShelf;
   bookShelf.index = 0;
   //将书籍上架,省略代码
   //将bookShelf与bookShelfIterator相关联
   bookShelfIterator.bookShelf =  (4)  ;
   struct Iterator iterator;
   iterator.hasNext = BShasNext;
   iterator.next = BSnext;
   struct Book* b;
   while(  (5)  ){//遍历书架,输出书名
   b=iterator.next();
   printf("%s\n", b->name);
   }
   }

选项

答案(1)struct Book* indexindex bookShelfIterator.index++ &bookShelf iterator.hasNext()

解析 是某个函数类型定义,先看空(2),根据注释,此处应填下标index“不大于当前书架上的最后一本书对应的下标”,而结构体BookShelf中的字段index是表示“书架上最后一本书的下标加1,即下一本书的下标,如0表示有0本书”,故空(2)应填:indexindex。
   继续看空(3),根据注释函数BSnext()的功能是“取得下一本书,并将index加1,以便下一次正确访问”,而函数getBookAt(BS,index)是“从书架BS上取得下标为index的书”,因此空(3)应填欲取书的下标,应为bookShelfIterator.index,故空(3)应填bookShelflterator.index++。
   书架迭代器BookShelflterator中的字段bookShelf是struct BookShelf*类型的,因此空(4)应填&bookshelf,注意取地址符&。
   while循环是遍历书架,输出书名,循环条件是“还有下一记录(书)”,故空(5)应填iterator.hasNext()。
   现在再来看空(1),由迭代器Iterator中字段next的定义:fun2 next;以及赋值语句iterator.next=BSnext;可得,fun2应该定义了与BSnext函数同参数的函数指针,函数指针的定义原型为:函数返回类型函数指针变量名(参数列表),又知函数BSnext的定义为struct Book*BSnext(),故空(1)应填struct Book*。
转载请注明原文地址:https://kaotiyun.com/show/XlDZ777K
0

最新回复(0)