为什么100这个计划不包括在内?

时间:2017-02-21 17:43:14

标签: c++

我正在编写这个程序,它将猜测用户正在考虑的数字。经过几天的工作,我无法弄清楚它有什么问题。 我提议的作业成绩也不是我的预期。 请帮忙。

  1. 用户可以猜100,但我的程序使用中点规则,所以最多只能达到99.如何才能使100包容?
  2. 如果我一直按下“l”,程序最终会突破循环打印如果你想再试一次?
  3. 有没有更好的方法来编写这个程序?请举例。
  4. 这是实际的程序:

    编写一个程序,可以找出人类用户选择的数字。人类用户会想到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;
    }
    

3 个答案:

答案 0 :(得分:4)

你的问题只是在评论中提到的xy的计算中误解了。

应该阅读

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 / 299.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