Как закончить цикл в начале C? - PullRequest
9 голосов
/ 02 октября 2009

У меня есть базовая программа на C, которая производит число, и пользователь должен угадать его (да, вы уже назвали это: домашняя работа). Я могу получить почти все это, поэтому я горжусь этим, но я открыт для любых допущенных ошибок, конечно, я все еще учусь. Мои главные два вопроса

  1. Как я могу завершить эту программу раньше, когда пользователь выбрал правильный номер, прежде чем он достиг # 10 попыток? И
  2. Есть ли какие-то очевидные ошибки, которые гуру может увидеть, что я не с моим кодом?

Я стараюсь программировать как можно лучше:)

int main(void)
{
    int x = 10;
    int i = 0;
    int target, guess;
    int numGuess = 0;

    /*create a random number*/
    //create random function
    srand(time(NULL));//this creates new number based on time which changes every second :)
    target = rand() % 99; //create a random number using the rand() function, from 0 -99



    do{
        //increase the loop until it meets the x variable
        i++;
        numGuess++;
        //allow user to input a number for guess
        scanf("%d", &guess);
        if (guess == target)
        {
            printf("You win! \n\n");

        }
        else if (guess > target)
        {
            printf("You are too high. Guess a number:\n\n");
        }
        else if (guess < target)
        {
            printf("You are too low. Guess a number:\n\n");
        }

    }while(i < x);
        printf("You lose, the number was %d. \n", target);

    printf("Number of tries %d\n", numGuess);
    printf("Enter any key to exit...");
    getchar();
    getchar();

    return 0;
}

Ответы [ 6 ]

16 голосов
/ 02 октября 2009

Используйте оператор break, чтобы выйти из цикла: в этом случае, однако, это может быть не то, что вам нужно, так как после выхода из цикла вы сразу увидите сообщение «вы проиграли». Возможно, вам придется реструктурировать вашу программу, чтобы учесть это.

Попробуйте что-то вроде этого:

int main(void)
{
    int x = 10;
    int i = 0;
    int target, guess;
    int numGuess = 0;

    /*create a random number*/
    //create random function
    srand(time(NULL));//this creates new number based on time which changes every second :)
    target = rand() % 99; //create a random number using the rand() function, from 0 -99

    do {
        //increase the loop until it meets the x variable
        i++;
        numGuess++;
        //allow user to input a number for guess
        scanf("%d", &guess);
        if (guess == target)
        {
            printf("You win! \n\n");
            break;
        }
        else if (guess > target)
        {
            printf("You are too high. Guess a number:\n\n");
        }
        else if (guess < target)
        {
            printf("You are too low. Guess a number:\n\n");
        }

    }while(i < x);

    if (guess != target) {
        printf("You lose, the number was %d. \n", target);
    }

    printf("Number of tries %d\n", numGuess);
    printf("Enter any key to exit...");
    getchar();
    getchar();

    return 0;
}
9 голосов
/ 02 октября 2009

Вот три варианта. Читайте о них !!! (считается вредным)

 if (guess == target)
 {
     printf("You win! \n\n");
     break;
 }

 if (guess == target)
 {
     printf("You win! \n\n");
     goto end;
 }


 if (guess == target)
 {
     printf("You win! \n\n");
     i=n;
 }
9 голосов
/ 02 октября 2009

Почему бы не установить условие while для предположения пользователя? Что-то вроде:

 ...}while(i < x || guess !== target);
9 голосов
/ 02 октября 2009

Вы ищете команду break.

for (int i = 0; i < 10; i++) {
    if(i == 5)
       break;
}

Этот ресурс выглядит очень полезным для вас.

В качестве дополнительного примечания: ваш текст «Вы проиграете» всегда будет отображаться, несмотря ни на что. Вы можете оценить это внутри цикла do {}.


Всегда на шаг впереди меня с сообщениями / правками на этот ответ Эндрю Хэйр!

1 голос
/ 02 октября 2009

Я не вижу никаких «очевидных ошибок», о которых предыдущие авторы не упоминали, кроме того факта, что с перерывом вам больше не нужны и «i», и «numGuess», поскольку они всегда будут иметь одинаковое значение. Просто используйте numGuess вместо «i» в состоянии while.

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

  • Всегда используйте идентификаторы с самоописанием (имена переменных / функций). Например. ваш "x" действительно должен называться "maxGuesses".

  • Не экономьте на пустом месте. Например. "} while (i

  • Кажется, вы уже привыкли не экономить на комментариях - хорошо !!!

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

Причина, по которой это важно, двояка:

  • 80-90% времени / усилий на разработку обычно тратится на поддержание существующего кода, вашего или чужого. Эта задача НАМНОГО проще с хорошо документированным и легко читаемым кодом. (Вы не представляете, насколько сильно кто-то может повредить мозг, читая незнакомый код в 2 часа ночи во время производственной проблемы, просто потому, что тот, кто его написал, не делал отступ в коде последовательно).

  • Имея хорошо документированный и читаемый код, вам будет легче писать его, так как он проясняет ваши собственные мысли и препятствует появлению глупых ошибок, связанных с опечатками («о, я хотел использовать x вместо y»).

0 голосов
/ 02 октября 2009

В случае вашей программы лучший способ добиться этого, вероятно, вызвать

void exit (int status);

(включая stdlib.h)

после печати «Ты выиграл»

Как правило, вы можете использовать ключевое слово "break" для выхода из цикла в любое время. Это не даст желаемого эффекта в вашем случае, так как будет напечатано «вы проиграли…». Если вы хотите использовать «break», вы должны поместить выражение «if» вокруг бита «вы проиграли» и проверить, действительно ли пользователь не выиграл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...