застрял в бесконечном цикле do while - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь угадать мою игру с числами на с ++, но компьютер должен угадать мой номер. Но проблема в том, что я застрял в этом бесконечном цикле. Я только начинающий, так что это действительно базовая программа.

Это мой код:

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;

}

Ответы [ 6 ]

5 голосов
/ 15 февраля 2012

поместите cin >> input в тело цикла

4 голосов
/ 15 февраля 2012

Я думаю, вам следует переместить генерацию случайных чисел внутри цикла.

3 голосов
/ 15 февраля 2012

Значение переменной input никогда не изменяется в цикле, поэтому условие завершения input != secretNumber никогда не выполняется.

Вы должны взять вход внутри цикла. Поэтому напишите cin >> input в начале цикла.

Edit:

Если компьютер должен догадаться, то все равно значение input необходимо изменить в цикле, которого нет в вашем коде. Цикл работает с тем же значением в input каждый раз.

Чтобы сделать ваш компьютер догадкой, вы должны следовать некоторой схеме. Компьютер может рисовать числа в произвольном порядке, которые вы можете получить, перемещая secretNumber = rand()%100 + 1 внутри цикла. Но этот подход может не сработать, цикл может продолжаться очень долго. Это показано в ответе @ Kaii.

Более эффективным подходом является Binary Search . В этом случае вы должны отслеживать догадки компьютера. Оставьте две переменные high и low, которые должны хранить предположения выше и ниже, чем input соответственно. Когда предположение превышает число, сохраните его в high и сохраните любое предположение ниже input в low. Затем компьютер должен попробовать новое предположение между high и low. Случайное предположение должно быть secretNumber = low + rand() % (high - low). В худшем случае это займет целых 100 итераций. Для достижения наилучших результатов каждое предположение должно быть (high + low) / 2. Согласно условиям, один из high и 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;
2 голосов
/ 15 февраля 2012

компьютер только угадывает (случайным образом) один раз при запуске программы, но должен угадывать каждый раз, когда цикл повторяется.вы должны переместить генерацию случайных чисел внутри цикла:

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;
0 голосов
/ 15 февраля 2012

бесконечный цикл в вашем коде, потому что аргумент для while всегда равен true, пока вы не получите истинное число.

вам нужно добавить еще один аргумент.Например, вы хотите установить максимальное количество попыток в 5 раз.тогда это будет так

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

, если вы введете неправильный номер 5 раз, приложение завершит работу

0 голосов
/ 15 февраля 2012

Вы должны сделать ввод в цикле.Прямо сейчас вы запрашиваете значение ДО того, как начнете цикл, а затем никогда не спрашиваете у пользователя другой номер.Если догадка не может быть изменена, цикл никогда не может выйти.

с изменением на

do {
    cin >> input;

решит бесконечный цикл.

...