0

私はc++で私のナンバーゲームを簡単に推測しようとしていますが、コンピューターは私の番号を推測する必要があります。しかし、問題は、私がこの無限ループで立ち往生していることです。私は初心者なので、本当に基本的なプログラムです。

これは私のコードです:

int secretNumber = rand() %100 + 1; // random number between 1-100
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;

}
4

6 に答える 6

5

cin >> inputループ本体に配置

于 2012-02-15T14:34:54.847 に答える
4

乱数生成をループ内に移動する必要があると思います。

于 2012-02-15T14:36:55.563 に答える
3

変数の値がinputループ内で変更されることはないため、終了条件input != secretNumberが満たされることはありません。

ループ内で入力を取得する必要があります。したがってcin >> input、ループの最初に書き込みます。

編集:

コンピューターが推測する必要がある場合でもinput、ループ内での値を変更する必要がありますが、これはコードには存在しません。ループはinput毎回同じ値で実行されます。

コンピュータに推測させるには、いくつかのスキームに従う必要があります。secretNumber = rand()%100 + 1コンピューターはランダムに数字を描くことがあります-ループ内を移動することでそれを得ることができます。ただし、このアプローチはうまく機能しない可能性があり、ループは非常に長い間実行される可能性があります。これは@Kaiiの回答に示されています。

より効率的なアプローチは、バイナリ検索です。この場合、コンピュータが行う推測を追跡する必要があります。2つの変数highを保持し、それぞれlowより高い推測と低い推測を格納する必要がありinputます。推測が数値よりも大きい場合は常に、に格納し、high推測がよりも小さい場合はに格納inputlowます。次に、コンピュータはとの間で新しい推測を試みる必要がhighありlowます。ランダムな推測はですsecretNumber = low + rand() % (high - low)。最悪の場合、100回もの反復が必要になります。最良の結果を得るには、それぞれの推測はである必要があります(high + low) / 2。条件に応じて、highおよびの1つがlow各反復で更新されます。このアプローチにより、コンピューターは7回の推測で正しい数を推測します。

コードでは、次のようになります。

int secretNumber = rand() % 100 + 1; // random number between 1-100
int tries=0;
int input;
int low = 1, high = 100;

cout <<"typ your number\n";
cin >> input;

do
{
    secretNumber = (high + low) / 2;
    cout << secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout << "Too high I guess?\n";
        high = secretNumber;
    }

    else if (secretNumber < input)
    {
        cout << "Too low I guess?\n";
        low = secretNumber;
    }

    else 
    {
        cout << "Yes, i got it in " << tries << " tries!";
    }        
} while (input != secretNumber);

return 0;
于 2012-02-15T14:36:13.607 に答える
2

コンピュータは、プログラムの開始時に(ランダムに)1回だけ推測しますが、ループが繰り返されるたびに推測する必要があります。乱数生成をループ内に移動する必要があります。

int secretNumber = 0;
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    /* the fix is here */
    secretNumber = rand() %100 + 1; // random number between 1-100
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;
于 2012-02-15T14:41:44.610 に答える
0

ループ内で入力を行う必要があります。現在、ループを開始する前に値の入力を求め、ユーザーに別の番号を要求することはありません。推測を変更できない場合、ループは終了できません。

に変更

do {
    cin >> input;

無限ループを解決します。

于 2012-02-15T14:36:28.730 に答える
0

コード内の無限ループ。これは、真の数が得られるまで、whileの引数が常に真であるためです。

別の引数を追加する必要があります。たとえば、最大試行回数を5回に設定します。するとこんな感じになります

do{
    //do your stuff here
}while((input != secretNumber)&&(tries<=5))

間違った番号を5回入力すると、アプリケーションは終了します

于 2012-02-15T14:40:34.313 に答える