我正在编写这个程序,它将猜测用户正在考虑的数字。经过几天的工作,我无法弄清楚它有什么问题。 我提议的作业成绩也不是我的预期。 请帮忙。
这是实际的程序:
编写一个程序,可以找出人类用户选择的数字。人类用户会想到1到100之间的数字。程序将进行猜测,用户将告诉程序猜测更高或更低。程序应找到两个数字的中点,并询问数字是高还是低。
#include <iostream>
using namespace std;
int main() {
char check;
char tryagain;
do {
int midpoint;
const int MAX = 100;
const int MIN = 1;
int y = MAX;
int x = MIN;
cout << "Think of a number between 1 and 100." << endl;
midpoint = (x + y) / 2;
while (x != y || y != x) {
cout << endl << "Is it" << " " << midpoint << " " << "?";
cin >> check;
if (check == 'l' || check == 'L') {
y = midpoint;
midpoint = (x + y) / 2;
}
else if (check == 'h' || check == 'H') {
x = midpoint;
midpoint = (x + y) / 2;
}
else if (check == 'c' || check == 'C') {
break;
}
else {
cout << "Incorrect choice." << endl;
}
}
cout << "Great! Do you want to try again? (y/n)";
cout << endl;
cin >> tryagain;
} while (tryagain == 'y' || tryagain != 'n');
return 0;
}
答案 0 :(得分:4)
你的问题只是在评论中提到的x
和y
的计算中误解了。
应该阅读
y = midpoint - 1;
和
x = midpoint + 1;
分别。原因很简单。您使用midpoint
作为猜测。然后,猜测不再是可用猜测的一部分。你的第一次猜测是50,x或y应该是51或49作为区间内的新最小值或最大值。
这也将使100包括在可用的猜测中。计算的最后一步是当中点为99并且用户选择“h”时。
x = 99 + 1;
下限为100,midpoint
猜测结果为
midpoint = (100 + 100) / 2;
这是正确的。
至于编写此程序的更好方法。这取决于您的课程教授您的内容,课程内容等等。您可能想查看code-review
答案 1 :(得分:1)
当你的x和y太近时,它们的和的除法会产生一个不正确的中点。 100 + 99 / 2 = 99 (which is 99.5 rounded down)
。你需要检查这个特例。在闭合括号之前的循环结束时插入:
if ( y-x < 2) midpoint = y;
答案 2 :(得分:0)
用户可以猜100,但我的程序使用中点规则,所以最多只能达到99.如何才能使100包容?
c ++中的整数除法丢弃任何小数。它总是向下舍入。考虑当midpoint
为99时会发生什么。您得到的midpoint = (99 + 100) / 2
199 / 2
是99.5
。丢弃小数每次都会留下99
。一种可能的解决方案是将y = midpoint;
更改为y = midpoint - 1;
,将x = midpoint;
更改为x = midpoint + 1;
这将阻止您的应用程序多次猜测相同的值。通过此更改,当midpoint
为99时,x
将首先递增到100
,为我们提供一个新的中点(100 + 100) / 2
,其评估为100
。
如果我继续按下&#39; l&#39;程序最终会打破循环和打印如果你想再试一次?
如果用户一直按l
,那么最终唯一可能的解决方案是1.看来您选择不在此时提出您的猜测并假设用户遵守规则。在推断出答案时添加额外的打印件。
if (x == y) {
// Answer was deduced
cout << "You guessed " << x << ".\n";
}
有没有更好的方法来编写这个程序?请举例。
请参阅此答案的前两部分。除此之外,很难客观地说出更好的编码方式&#34;手段。您可能需要考虑一个系统来检测用户何时撒谎。例如,如果midpoint == x
,则用户无法在不说谎的情况下选择l
。