阅读以下函数说明和C代码,回答问题 [说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。 以

admin2012-02-20  29

问题 阅读以下函数说明和C代码,回答问题
[说明]
   任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。
   以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。
   以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。
   [C代码]
   typedef  (1)  (*funl)();
   enum HandValue{HANDVALUE_GUU=0, HANDVALUE_CHO=1, HANDVALUE_PAA=2};
   //手势可取值,依次为“石头”、“剪刀”、“布”
   //其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头
   bool won;
   struct Hand *WSprevHand;
   struct Hand{//手势
   enum HandValue handvalue;
   }hand[3]={HANDVALUE_GUU, HANDVALUE_CHO, HANDVALUE_PAA};
   int fight(struct Hand *h1, struct Hand *h2)
   //比较h1和h2。h1代表的手势较大时返回1,h1较小时返回-1,相等时返回0
   //
   {
   if(h1->handvalue == h2->handvalue){
   return 0;
   }else if((h1->handvalue+1)%  (2)  == h2>handvalue){
   return 1;
   }else{
   return -1;
   }
   }
   struct Hand* getHand(int handvalue){
   //依据手势代表的值取得手势,若handvalue不合法,返回NULL
   switch(handvalue){
   case 0:
   return &hand[0];
   break;
   case 1:
   return &hand[1];
   bteak;
   case 2;
   return &hand[2];
   break;
   }
   return  (3)  ;
   }
   struct Strategy{//策略
   funl nextHand;//下一个手势
   };
   struct Hand* WSnextHand()
   {
   if(!won){
   PSprevHand = getHand(rand()%3);
   }
   return PSprevHand;
   }
   struct Player{
   char name[20];
     (4)  strategy;//策略
   int wincount;
   int losecount;
   int gamecount;
   };
   void main()
   {
   Strategy WS;
   WS.nextHand = WSnextHand;
   WSpreVHand = NULL;
   struct Player WSplayer;
   (5)(WSplayer.name,"ww");
   WSplayer.wincount = 0;
   WSplayer.losecount = 0;
   WSplayer.gamecount = 0;
   WSplayer.strategy = &WS;
   }

选项

答案struct Hand* 3 NULL struct Strategy* strcpy

解析 条件(h1->handvalue+1)%  (2)  ==h2->handvalue是指h1大于h2,根据手势间大小顺序:石头(0)赢剪刀(1),剪刀(1)赢布(2),布(2)赢石头(0)。可得应填3。例如h1为布(2),h2为石头(0)时,h1->handvalue+1)%  (2)  的值应为0。所以空(2)填3。
   handvalue取值为:0、1、2,由注释“若handbalue不合法,返回NULL”可得空(3)应填NULL。
   先看空(5)。结构体WSplayer的strategy是字符数组,对字符数组的赋值需要调用strcpy库函数。故空(5)应填strcpy。
   来看空(4)。由语句“WSplayer.strategy = &WS;”及“Strategy WS;”可知,结构体WSplayer的strategy应该是Strategy结构体指针。故空(4)应填struct Strategy*。
   最后来看空(1)。这明显是一个函数指针,函数指针的定义:函数返回类型函数指针变量名(参数列表)。故空(1)是该函数的函数返回类型。用到该定义的是在结构体Strategy中,“funl nextHand;//下一个手势”,此处只是一个声明,不能判断其返回类型,真正应用的是语句“WS.nextHand = WSnextHand;”,而其右端的函数原型为struct Hand* WSnextHand(),因此该函数指针的返回类型应为struct Hand*。故空(1)应填struct Hand*。
转载请注明原文地址:https://kaotiyun.com/show/klDZ777K
0

最新回复(0)