2017-02-21 61 views
4

我正在寫這個程序,它會猜測用戶正在考慮的數字。經過幾天的工作,我無法弄清楚它出了什麼問題。 另外我提出的分配等級並不是我的預期。 請幫忙。爲什麼100不包括在這個程序中?

  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; 
} 
+2

'X = Y || y!= x' ?! – Biffen

+1

你能澄清嗎?什麼線路不能像你期望的那樣工作?在第1點中,你提到它不是100包含,但是實際問題是什麼? – TankorSmash

+2

假設您從1到100的可能範圍開始,並且用戶說這個數字大於50.那麼您的新範圍不應該是50到100,而是51到100. –

回答

3

您的問題只是在計算xy時誤認爲像Alf在評論中所建議的那樣。

它應該閱讀

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

0

用戶可以猜到100,但我的程序使用中點規則,所以只能上升到99。我怎樣才能讓100(含)?

C++中的整數除法丟棄任何小數。它總是下降。考慮當midpoint爲99時會發生什麼。您得到midpoint = (99 + 100)/2199/299.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而不說謊。

+0

你好,謝謝你的回答。即使我讓這些變化出現了新的問題。現在我有0的下界(我想排除)和上限100不包括(我想包括)。你想嘗試使用你所建議的修改來運行代碼嗎? –

1

當您的x和y太靠近時,其總和的分配會產生不正確的中點。 100 + 99/2 = 99 (which is 99.5 rounded down)。你需要檢查這個特殊情況。在循環的結束時的閉括號插入之前:

if (y-x < 2) midpoint = y;