web-dev-qa-db-fra.com

Comment terminer une boucle tôt en C?

J'ai un programme C de base qui produit un nombre et que l'utilisateur doit deviner (oui, vous l'avez déjà appelé: devoirs). Je suis capable d’obtenir à peu près tout cela, alors je suis un peu fier, mais je suis ouvert à toutes les erreurs que j’ai commises bien sûr, j’apprends toujours. Mes deux questions principales sont

  1. Comment puis-je terminer ce programme plus tôt une fois que l'utilisateur a sélectionné le bon numéro, avant qu'il ait atteint le n ° 10 essais? Et
  2. Des erreurs évidentes qu'un gourou peut voir que je ne suis pas avec mon code?

J'essaie de programmer du mieux que je peux :)

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;
}
9
HollerTrain

Utilisez l'instruction break pour sortir d'une boucle: dans ce cas, il se peut que ce ne soit pas ce que vous souhaitiez, car dès que vous sortirez de la boucle, vous verrez instantanément le message "vous perdez". Vous devrez peut-être restructurer votre programme pour en tenir compte.

Essayez quelque chose comme ça:

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;
}
16
Andrew Hare

Pourquoi ne pas définir la condition while à la conjecture de l'utilisateur? Quelque chose comme:

 ...}while(i < x || guess !== target);
9
Anthony

Voici trois possibilités. Lisez à leur sujet !!! (goto considéré comme nuisible)

 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
Tom

Vous recherchez la commande break.

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

Cette ressource semble que cela vous serait très utile.

En remarque: votre texte "Vous perdez" sera toujours affiché quoi qu'il arrive. Vous voudrez peut-être évaluer cela à l'intérieur de la boucle do {}.


Toujours une longueur d’avance sur moi avec les posts/modifications de cette réponse, Andrew Hare!

9
Nathan Taylor

Je ne vois aucune "erreur évidente" que les affiches précédentes n'ont pas mentionnée, mis à part le fait que, avec la pause, vous n'avez plus besoin de "i" et de "numGuess", car ils auraient toujours la même valeur. Il suffit d'utiliser numGuess au lieu de "i" dans la condition while.

Mais je vous recommande fortement de rendre votre code plus lisible - le meilleur moment pour adopter le bon style de codage est maintenant, avant d’acquérir et de consolider de mauvaises habitudes.

  • Utilisez toujours des identifiants auto-descriptifs (noms de variable/fonction). Par exemple. votre "x" devrait vraiment s'appeler "maxGuesses".

  • Ne lésinez pas sur les espaces blancs. Par exemple. "} while (i <x);" devrait être "} while (i <x);"

  • Vous semblez avoir déjà pris l'habitude de ne pas lésiner sur les commentaires - bien !!!

    Rappelez-vous simplement que les commentaires doivent toujours décrire l’objet du code plutôt que les mécanismes utilisés, à moins que les mécanismes ne soient si complexes et intelligents qu’ils nécessitent également des explications.

La raison pour laquelle cela est important est double:

  • 80 à 90% du temps/des efforts de développement sont généralement consacrés à la maintenance du code existant, de votre propre code ou de celui de quelqu'un d'autre. Cette tâche est extrêmement facile avec un code bien documenté et facilement lisible. (vous ne savez pas combien de lésions cérébrales peuvent être causées par la lecture d'un code inconnu à 2 heures du matin au cours d'un problème de production simplement parce que le bozo qui l'a écrit n'a pas indenté le code de manière cohérente).

  • Avoir un code bien documenté et lisible facilite son écriture, car il clarifie vos propres pensées et décourage les bugs stupides d'origine typo ("oups, je voulais utiliser x au lieu de y").

1
DVK

Dans le cas de votre programme, le meilleur moyen d’y parvenir est probablement d’appeler le

void exit (int status);

(inclure stdlib.h)

après avoir imprimé "You Win"

En général, vous pouvez utiliser le mot-clé "break" pour quitter une boucle à tout moment. Cela n’aura pas l’effet souhaité dans votre cas car cela produirait le texte "vous perdez ...". Si vous souhaitez utiliser "break", vous devez insérer une instruction "if" autour du bit "you lost ..." et vérifier si l'utilisateur n'a pas réellement gagné.

0
Carsten