猜数游戏:程序利用随机函数产生一个[1,10]内的随机整数,让用户反复猜测,直到猜对为止,程序能提示猜数范围,并统计猜数次数。 甲乙二人先后进行猜数游戏,记录二人猜中花费的次数。比较二人次数,次数少的获胜。当二者猜的次数相同,则输出 平局。 请按要求编程: 1、补充完善下面的int guess()函数,函数的功能是: 随机函数先产生一个[1,10]内的随机整数,让用户输入猜测的数,当输入的数比随机数大时,输出提示“大了”;当输入的数比随机数小时,输出提示“小了”,让用户反复猜,直到猜对为止。该函数要求记录猜数的次数。返回值为猜中的数。 #include <stdio.h> #include <stdlib.h> #include <time.h> int guess() { int magic; //magic用于保存随机数 srand(time(0)); //用系统时间初始化随机函数 magic=rand()%10+1; //产生一个1到10的随机整数 .......... //请完善函数的功能 } 2、编写main()函数,完成如下功能: 输出提示:请甲开始猜数。 调用guess函数,获得甲猜中的数、猜的次数,并输出。 输出提示:请乙开始猜数。 调用guess函数,获得乙猜中的数、猜的次数,并输出。 比较二人次数,次数少的获胜。当二者猜的次数相同,则输出 平局。 输入、输出样例:提示: 1、随机函数每次产生的数不同,甲、乙要猜的数可能不同 2、guess函数只能用return语句返回一个值(猜中的数),猜中的次数无法直接return,可以设计1个全局变量,用于保存每次调用guess求出的猜中次数。 (可参阅附加例题“歌唱比赛程序“中全局变量min或max的作用) (也可参考本周课件“变量的作用域”中第一个学习内容“请先动手做2---”中的例题。)
第2题
【说明】
有一种猜数字游戏,开始时程序随机产生四个不相同的个位数字(顺序固定),然后玩家输入猜测的四个数字。程序比较后给出提示,本次猜数字有几个数字完全正确,有几个数字数值正确但是位置错误。玩家重复猜测直至结果完全正确。例如,程序生成“1234”,玩家猜测“1630”,则提示"位置正确的有:“1”个,位置错误的有:“1”个,完全错误的有“2”个。
下面的两个Java函数是猜数字游戏里面使用的两个函数,第一个用于产生四个不相同的数字。第二个函数先判断输入是否合法,若合法则进行比较,并给出提示。
【Java程序】
………………
private String randNum()//产生答案数字
{
int[] digits={0,1,2,3,4,5,6,7,8,9};
Random mum=new Random((new Date()).getTime());
for(int i=0;i<10;i++)
{
int p=Math.abs(rnum.nextInt())%10;
int tmp=digits[p];//tmp是临时存储数字的变量
(1);
digits[i]=tmp;
}
return Integer.toString(digits[0])+Integer.toString(digits[1])
+Integer.toString(digits[2])+Integer.toString(digits[3]);
}
String checkAnswer(String guess,Stdng answer)
{
if guess.length()!=4)return "要输入4个数字!";
int num=0;
try{ num=(2);} //判断输入是否是数字
catch(NumberFormatException ex)
{return "要输入数字!";}//catch
int[]timesDigit={0,0,0,0,0,0,0,0,0,0};
for(int i=0;i<4;i++){
int ptr=num%10;
num=num/10;
if (3) //输入数字有重复
return "数字有重复!";
}//for
int a=0;
int b=0;
for(int j=0;j<4;j++)
{
int pos=answer.indexOf(guess.substring(j,j+1));
if (4) //当前数字完全正确
a++;
else if(pos>=0)
b++;
}
if (5) //答案完全正确
return "恭喜!答对了!!";
else{
textAreaContent+= "位置正确的有:"+a+"个,位置错误的有:"+b+"
个,完全错误的有"+(4-a-b)+"个\n";
return "继续努力";
}
}
………………
第3题
【算法说明】
程序实现了常见的猜数字游戏。游戏开始时由程序自动产生一个1到100的随机数,接收用户输入,并给出提示信息,直至用户猜对。用户猜对后,显示猜测次数,并提供“重新开始”和“退出”功能。
算法采用两层循环实现。外层循环采用do-while循环,由循环条件控制是否重新开始。内层采用for循环,用于判断用户的每次输入。m是随机产生的整数,键盘输入是字符串类型变量,n是整型变量。
【问题1】内循环还需要一个变量,其作用为(1)。
【问题2】请将流程图5.2补充完整。
第4题
第5题
Q 先生和S 先生、P 先生在一起做游戏。Q 先生用两张小纸片,各写一个数。
这两个数都是正整数,差数是1。他把一张纸片贴在S 先生额头上,另一张贴在
P 先生额头上。于是,两个人只能看见对方额头上的数。
Q 先生不断地问:你们谁能猜到自己头上的数吗?S 先生说:“我猜不到。”
P 先生说:“我也猜不到。”S 先生又说:“我还是猜不到。”P 先生又说:“我
也猜不到。”S 先生仍然猜不到;P 先生也猜不到。S 先生和P 先生都己经三次
猜不到了。可是,到了第四次,S 先生喊起来:“我知道了!”P 先生也喊道:
“我也知道了!”
问:S 先生和P 先生头上各是什么数?
第6题
[说明]
任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(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;
}
第7题
[说明]
任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。
以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式中,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是C++语言实现,能够正确编译通过。
[C++代码]
class Hand{
private:
int handvalue;
static Hand *hand0;
static Hand *hand1;
static Hand *hand2;
(1) ;
Hand(int handvalue){
this->handvalue = handvalue;
}
public:
(2) Hand* getHand(int handvalue){
/*省略具体实现*/
}
};
Hand *Hand::hand0 = new Hand(0);
Hand *Hand::hand1 = new Hand(1);
Hand *Hand::hand2 = new Hand(2);
class Strategy{
public:
(3) Hand* nextHand() = 0;
};
class WinningStrategy : public Strategy{
private:
bool won;
Hand *prevHand;
public:
winningStrategy(){
won = false;
}
Hand* nextHand(){
if(!won){
prevHand = Hand::getHand(rand()%3);
}
return prevHand;
}
};
class probstrategy : public Strategy{
public:
Hand* nextHand(){
int handvalue = 0;
/*省略具体实现*/
return Hand::getHand(handvalue);
}
};
class Player{
private:
string name;
Strategy* strategy;
public:
Player(string name, (4) strategy){
this->name = name;
this->strategy = strategy;
}
Hand *nextHand()(//向战略请示手势
return (5) ;
}
};
第8题
A.1/9
B.2/9
C.7/8
D.4/9
第9题
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!