2

我正在使用 C++ 解决文本原则和实践中的一些问题,我遇到的具体问题如下。用户必须想出一个介于 1 到 100 之间的数字,然后计算机将通过一系列猜测找出问题所在。

当前代码除数字 1 外都有效(由于除以 2 时整数舍入)。我似乎想不出办法来解决这个问题。

这是当前的源代码:

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 1;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while((high-low)!=1){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

system("pause");
return 0;
}
4

3 回答 3

2

你选择while((high-low)!=1)作为你的while表达式背后的想法是什么?

您的代码基本上是在说 - 当 和 之间的差highlow1 时,正确的数字必须是high. 这就是为什么当有人选择最低值(在本例中为 1 )时它不起作用的原因。

您需要确保将最低值low作为guess.

所以 - 单步执行您的代码:

让我们使用一个例子,你有一个MIN_VALUE1,玩家选择了 1 作为他们的想法。现在,当high是 3 和guess2 时,您将通过 while 循环,因为当被问及他们选择的数字是否小于或等于 时,玩家回答“Y” guesshigh最终结果为 2。

有趣guess的是,它保持在 2,因为它减少了(high-low)/2. 向下舍入为 0。这意味着guess永远不会达到最低值 - 这是一个问题。

继续 - 下次评估 while 表达式时,它返回 false (因为 2-1 == 1 )。

然后您返回high(当前为 2 )。

所以我认为你有两个问题。

1) 当你发现自己减guess0 时,玩家对数字的想法必须low,你应该设置guesslow允许将其作为计算机的猜测呈现给用户。

并且 2) 你需要找到一种方法来允许进入你的 while 循环,当 和 之间的差highlow1 时。这允许guess在它等于 时呈现给玩家的可能性low

有人发帖

while(high > low)

我认为这很好。

high但是您还需要检查和之间的差异何时low为1,因为a)您不想只是无休止地减少guess0,并且b)此时必须考虑数字low

所以:

while((high>low){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n"` ;
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        if( high-low == 1)
        {
          guess = low;
        }
        else
        {
          guess -= ( high - low ) / 2; 
        }
    }
于 2013-11-14T15:48:24.997 回答
1

该程序存在三个缺陷,但仅解决了一个无法自行运行的缺陷:

  • 循环的正确退出条件是while(guess>low),既不while(high>low)也不while(guess!=high)退出,除非猜测的数字是 1 和guess=low

  • 最小值必须设置为 0,const int MIN_VALUE = 0;否则数字 1 需要 8 次猜测,但只允许 7 个问题。它还可以防止循环在满足数字 1 的条件之前退出:

  • 当达到猜测的数字时,guess 将设置为低并且循环退出:

    if(high-low==1) guess=low;
    else guess -= ( high - low ) / 2;

请参阅下面的更正和测试代码:

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 0;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while(guess>low){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        if(high-low==1) guess=low;
        else guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

return 0;
}
于 2018-10-17T06:16:55.327 回答
0

你试过了吗:

while(high>low){
...
}
于 2013-11-14T15:00:25.283 回答