您的位置:首页 > 其它

171114—程序学习:猜数游戏。

2017-11-14 20:38 225 查看
这题自己折腾很久了。没搞出来。看了参考的程序,当时学习了,存点自己的考虑。

原题:

猜数游戏。玩家想好了一个 1~1000 之内的整数,由计算机来猜这个数。如果计算机猜出的数比 玩家想的数大,则玩家输入1;如果计算机猜出的数比玩家想的数小,则玩家输入-1;这个过程一直进行到 计算机猜中为止,玩家输入0。

一针见血的问题:

怎么实现多次输入数值加回车?你之前写的程序可是只能玩一次就挂掉了。。!

答:

while(1)
{
cin>>....;
if(。。。)break;
}


由此便可实现,while语句的循环条件永远成立,可多次读取新的输入数值,并完成计算。

而“break”则承担着跳出循环,终结程序的作用。(详见转向语句。另有continue可从此次循环中跳出,进行下一次循环。)

另外,猜数的主要算法如何实现?

而且,显然这个程序需要纠错机制:

保证输入值合乎范围(0,1,-1)

保证所猜的值在合理范围【1,1000】

防止出现赖皮操作。(猜500嫌大,猜499嫌小。或者命名猜中却刻意继续)

看参考的代码:

#include<iostream>
using namespace std;
int guess(int k=0);

int main()
{
int feedback,t=1;
cout<<"请你想好一个1~1000之内的整数,别告诉我,让我来猜猜!\n";
cout<<"猜中了,请输入0;若猜的数小了,请输入-1;若猜的数大了,请输入1\n";
cout<<"开始猜了……\n";
cout<<"是 "<<guess()<<" 吗?\t";
while(1)                               //用while(1)和break来实现多次操作。
{
cin>>feedback;
if(feedback==0)                       //主函数只完成对反馈值的初步判断和计数。追求低耦合度。
{                                     //自己写的时候发现很容易写得很多很多层。。自己搞晕自己。
cout<<"我猜中啦!只猜了 "<<t<<" 次,很强吧!\n";
break;
}
cout<<"是 "<<guess(feedback)<<" 吗?\t";
t++;
}
}

//算法的主要思想是,利用二分法,其中,left和right给出了猜数的区间端点,每次猜数即去区间中值,而在每次反馈之后,按反馈结果将上次所猜的数值g赋给left或right,得到新的区间。重复进行。很好的用Cpp描述了这个方法的过程,佩服佩服。

int guess(int k)
{
static int left=1;
static int right=1000;
static int g = 500;
switch(k)
{
case 0: break;
case 1: right=g-1; break;
case -1: left=g+1;  break;
default : cout<<"你输入错了,请再输入。\n";    return g;
}

//switch语句只负责了判断输入值并赋值的准备工作,没有直接输出.很智慧。
//如果不这样的话,在完成赋值之后,最起码赖皮操作就没法判断。。因为你还要输出,读都费劲,写更容易出错!

if(right<=left)
{
cout<<"你耍赖…不跟你玩了!\n";
//防赖皮通过在一次反馈之后,输出新值之前判断区间是否符合left《right来达到。(我这是严格小于号!)
exit(0);
}
g=(left+right)/2;
return g;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: