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

这题自己折腾很久了。没搞出来。看了参考的程序,当时学习了,存点自己的考虑。
原题:
猜数游戏。玩家想好了一个 1~1000 之内的整数,由计算机来猜这个数。如果计算机猜出的数比 玩家想的数大,则玩家输入1;如果计算机猜出的数比玩家想的数小,则玩家输入-1;这个过程一直进行到 计算机猜中为止,玩家输入0。

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

while1)
{
cin>>....;
if(。。。)break;
}

由此便可实现,while语句的循环条件永远成立,可多次读取新的输入数值,并完成计算。
而“break”则承担着跳出循环,终结程序的作用。(详见转向语句。另有continue可从此次循环中跳出,进行下一次循环。)

另外,猜数的主要算法如何实现?
而且,显然这个程序需要纠错机制:

  1. 保证输入值合乎范围(0,1,-1)
  2. 保证所猜的值在合理范围【1,1000】
  3. 防止出现赖皮操作。(猜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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值