[英]Why is 100 not inclusive in this program?
我正在編寫這個程序,它將猜測用戶正在思考的數字。 經過幾天的工作,我無法弄清楚它有什么問題。 我提議的作業成績也不是我的預期。 請幫忙。
這是實際的程序:
編寫一個程序,可以找出人類用戶選擇的數字。 人類用戶會想到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所建議的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;
哪個是對的。
至於編寫這個程序的更好方法。 這取決於您的課程教授您的內容,課程內容等等。 您可能想要查看代碼審查
當你的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.