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

来源:互联网 发布:李腾飞 java 编辑:程序博客网 时间:2024/06/08 10:49

这题自己折腾很久了。没搞出来。看了参考的程序,当时学习了,存点自己的考虑。
原题:
猜数游戏。玩家想好了一个 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;}
原创粉丝点击