我正在使用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;
}
答案 0 :(得分:2)
你选择while((high-low)!=1)
作为你的表达方式后你有什么想法?
您的代码基本上是在说 - 当high
和low
之间的差异为1时,正确的数字必须为high
。这就是为什么当有人选择最低值(在这种情况下为1)时它不起作用。
您需要确保将最低值low
作为guess
呈现给用户。
所以 - 单步执行代码:
让我们使用MIN_VALUE
为1的示例,并且玩家选择1作为他们的数字。现在,当high
为3而guess
为2时,您会经历while循环,因为当被问及所选数字是否小于或等于guess
时,玩家会回答“Y” ,high
最终为2。
有趣的是guess
保持在2,因为它会减少(high-low)/2
。哪个向下舍入为0.这意味着guess
将永远不会达到最低值 - 这是一个问题。
继续 - 下次评估while表达式时,它返回false(因为2-1 == 1)。
然后您返回high
(目前为2)。
所以我认为你有两个问题。
1)当你发现自己将guess
减少0时,玩家对数字的想法为low
,你应该将guess
设为{ {1}}允许将其作为计算机的猜测呈现给用户。
并且2)
当low
和high
之间的差异为1时,您需要找到一种方法来允许输入while循环。这允许在low
向玩家展示时guess
的可能性它等于low
。
有人发布了
while(high > low)
我认为没问题。
但是您还需要检查high
和low
之间的差异何时为1,因为a)您不希望无休止地将guess
减少0和b)在这一点上,数字的想法必须<{1>}。
所以:
low
答案 1 :(得分:0)
while(high>low){
...
}
答案 2 :(得分:0)
此程序存在三个缺陷,但仅解决了一个缺陷,该缺陷不能单独起作用:
该循环的正确退出条件是while(guess>low)
,while(high>low)
和while(guess!=high)
都不退出,除非猜测的数字是1和guess=low
。
最小值必须设置为0,const int MIN_VALUE = 0;
,否则您需要对数字1进行8个猜测,但仅允许7个问题。它还可以防止循环在满足数字1的条件之前退出:
达到猜中的数字时,猜测将设置为低,循环退出:
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;
}