0

私はBjarneStroustrupの「C++を使用したプログラミングの原則と実践」を経験しています。私は第4章、演習4にいます。

演習は次のとおりです。

数字を推測するゲームをプレイするプログラムを作成します。ユーザーは1から100までの数字を考え、プログラムはその数字が何であるかを理解するために質問をします(たとえば、「あなたが考えている数字は50未満ですか?」)。プログラムは、7つ以下の質問をした後、番号を識別できる必要があります。ヒント:<および<=演算子とif-else構文を使用してください。

今ではそれは素晴らしいことです、そして私はそれをうまく実装することができました。

私は自分自身をプッシュして、ループを使用してこれを実装し、毎回下限または上限を調整しようと思っていました。

これが私のコードです:

#include "std_lib_facilities.h"

int main( ){
  int count = 0;
  int lowerBound = 0;
  int upperBound = 100;
  string userInput = "";

  while ( lowerBound != upperBound ){
    // Increment count
    ++count;

    int halfRange = 0;

    // Make halfRange a while number, round up if any decimal portion.
    double range = ( upperBound - lowerBound ) / 2;

    int rangeDelta = range - (int)range;

    if ( rangeDelta != 0 )
      halfRange = (int)range + 1;
    else
      halfRange = range;

    cout << count <<": Is your number between " << lowerBound << " and " << lowerBound + halfRange << "? ";
    cin >> userInput;

    // Reset the bounds
    if ( userInput == "y" || userInput == "Y" )
      upperBound -= halfRange;
    else if ( userInput == "n" || userInput == "n" )
      lowerBound += halfRange;
    else {
      --count;
      cout << "Error! Answer could not be understood.";
    }
  }

  cout << "lowerBound: " << lowerBound << ", upperBound: " << upperBound << "\n\n";
  cout << "Your number is: " << lowerBound << "\n";

  return 0;
}

問題?さて、それは小数部分があり、小数部分を捨てる整数除算を使用している数値に到達したときに発生します。数値48を使用すると、プログラムは47と47を推測します。

私を動かすための手がかりはありますか?私はかなり近いと思いますが、助けていただければ幸いです。

ありがとう、

マット

4

3 に答える 3

1
 double range = ( upperBound - lowerBound ) / 2;

この行では、すべてのオペランドが。intではなくintとして評価されるため、問題が発生しますdouble。これが意図的でない場合は、2->を変更し2.0てこの問題を修正してください。

int rangeDelta = range - (int)range;

また、あなたは本当にしたくないですかdouble rangeDelta

于 2013-01-06T11:09:50.293 に答える
0

コードにはまだ問題があると思います(以前に通知されたバグが修正されたとしても):上限と下限の両方が残りの可能性のある数に含まれていることは明らかであり、これはコードからは明らかではありません:最初の質問で、「y」と答えると、新しい間隔は[0,50]になり、「n」と答えると、新しい間隔は[50,100]になりますが、これは間違いです。50は2番目の間隔に含まれるべきではありません。

これを修正するには、境界の更新を次のように変更する必要があります。

if ( userInput == "y" || userInput == "Y" )
   upperBound = lowerBound + halfRange;
else if ( userInput == "n" || userInput == "n" )
   lowerBound = lowerBound + halfRange + 1;

さて、最後の質問にはまだ問題があり、それは永遠に同じままです。問題は、range = 1の場合、halfrange = 1もあり、質問は同じままであるということです。

この問題を解決するには、範囲を切り捨てる必要があります。次のように定義します。

int halfRange = ( upperBound - lowerBound ) / 2;

これで、コードが機能するはずです。whileループに使用するコードは次のとおりです。

while ( lowerBound != upperBound ){
// Increment count
++count;

int halfRange = ( upperBound - lowerBound ) / 2;
int midpoint = lowerBound + halfRange;

cout << count <<": Is your number between " << lowerBound << " and " << midpoint << "? (both included) ";
cin >> userInput;

// Reset the bounds
if ( userInput == "y" || userInput == "Y" )
  upperBound = midpoint;
else if ( userInput == "n" || userInput == "n" )
  lowerBound = midpoint + 1;
else {
  --count;
  cout << "Error! Answer could not be understood.";
}

}

現在、整数のみを使用しており、doubleは使用していないことに注意してください。整数を使用する場合は、doubleの受け渡しを避け、整数の除算とモジュロを使用して整数を処理するようにしてください(また、整数を表すためにdoubleを使用しないでください)。

それが役に立てば幸い!

于 2013-01-09T13:11:04.130 に答える
0

これは、第4章で説明されている配列を使用して実現することもできます。

int min = 1;    // range for our guessing game
int max = 10;
int guess = 0;  // value to keeep track of guessing
char choice = ' ';
vector<int>v;

// put all our values into a vector
for(int i = min; i <= max; i++) {
    v.push_back(i);
}


while (v.size() != 1) {   // if there is only one value left, no guessing needed. jump out of loop

    guess = v[v.size()/2];   // find median

    cout << "\nIs your number less than " << guess << "? (y/n)\n";  // ask user for hint
    cin >> choice;

    if(choice == 'y') { //y: value is below median, pop values of median and above out of our range of values
        for(int i = 0; i < v.size(); i++)
        v.pop_back();
    }
    else {  // n: value is median or above. erase the lower values out of our range of values
        for(int i = 0; i < v.size(); i++){
            v.erase(v.begin());
        }
    }
} // end while
cout << "The number is " << v[0] << "\n";
于 2014-09-27T20:02:40.823 に答える