问题 问答题

[说明]
任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。
以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。
以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。
[C代码]
typedef (1) (*funl)();
enum HandValueHANDVALUE_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;

答案

参考答案: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*。

单项选择题
单项选择题

阅读下面的文章,并回答下列4题。

文艺不单是作者人格的表现,也是一般人生世相的返照。培养人格是一套工夫,对于一般人生世相积蓄丰富而正确的学识经验又是另一套工夫。这可以分两层说。一是读书。从前中国文人以能熔经铸史为贵。韩愈在《进学解》里发挥这个意思,最为详尽。读书功用在储知蓄理,扩充眼界改变气质。读的范围愈广,知识愈丰富审辩愈精当胸襟也愈恢阔。在近代,一个文人不但要博习本国古典,还要涉猎近代各种学问,否则见解难免偏蔽。这事固然很难。我们第一要精选,不要浪费精力于无用之书。第二要持恒,日积月累涓涓终成江河。第三要有哲学的高瞻远瞩,科学地客观剖析,否则食而不化,学问反而足以梏没性灵。其次是实地观察体验。这对于文艺创作或比读书还更重要。从前中国文人喜游名山大川,一则增长阅历,一则增加自然界瑰奇壮丽之气与幽深玄渺之趣。其实这种“气”与“趣”不只在自然中可以见出,在一般的人生世相中也可得到。许多著名的悲喜剧与近代小说所表现的学超精神气魄正不让于名山大川。观察体验的最大功用还不仅在此,尤其在洞达人情物理。文学超现实而不能脱离现实,它所创造的世界尽管有时是理想的,却不能不有现实的真实性。近代写实主义者主张文学须有“凭证”,就因为这个道理。你想写某一种社会或某一种人物,你必须对于那种社会人物的外在生活与内心生活都有彻底的了解,这非多观察体验不可。要观察得正确,体验得深刻,你最好投身他们中间,和他们过同样的生活。你过的生活愈丰富,对于人性的了解愈深刻,你的作品就愈有真实性,不至于如雾里看花。

对“韩愈在《进学解》里发挥这个意思”一句中“这个意思”的理解正确的一项是()。

A.读书

B.中国文化以能熔经铸史为贵

C.熔经铸史

D.通过读书培养人格积蓄丰富而正确的学识经验