簡體   English   中英

為什么100這個計划不包括在內?

[英]Why is 100 not inclusive in this program?

我正在編寫這個程序,它將猜測用戶正在思考的數字。 經過幾天的工作,我無法弄清楚它有什么問題。 我提議的作業成績也不是我的預期。 請幫忙。

  1. 用戶可以猜100,但我的程序使用中點規則,所以最多只能達到99.如何讓100包容?
  2. 如果我一直按下“l”,程序最終會突破循環打印如果你想再試一次?
  3. 有沒有更好的方法來編寫這個程序? 請舉例。

這是實際的程序:

編寫一個程序,可以找出人類用戶選擇的數字。 人類用戶會想到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;
}

你的問題只是像評論中Alf所建議的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; 

哪個是對的。

至於編寫這個程序的更好方法。 這取決於您的課程教授您的內容,課程內容等等。 您可能想要查看代碼審查

當你的x和y太接近時,它們的總和會產生一個不正確的中點。 100 + 99 / 2 = 99 (which is 99.5 rounded down) 你需要檢查這個特例。 在閉合支架插入之前的循環結束時:

if ( yx < 2) midpoint = y;

用戶可以猜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

如果我一直按下“l”,程序最終會突破循環打印如果你想再試一次?

如果用戶一直按下l那么最終唯一可能的解決方案是1.似乎您選擇不在此時提出您的猜測並假設用戶遵守規則。 在推斷出答案時添加額外的打印件。

if (x == y) {
    // Answer was deduced
    cout << "You guessed " << x << ".\n";
}

有沒有更好的方法來編寫這個程序? 請舉例。

請參閱此答案的前兩部分。 除此之外,很難客觀地說“更好的編碼方式”意味着什么。 您可能需要考慮一個系統來檢測用戶何時撒謊。 例如,如果midpoint == x則用戶無法在不說謊的情況下選擇l

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM