wake-up-neo.com

Wie kann man eine Schleife in C frühzeitig beenden?

Ich habe ein grundlegendes C-Programm, das eine Zahl erzeugt und der Benutzer muss sie erraten (yup, Sie haben es bereits genannt: Hausaufgaben). Ich kann so ziemlich alles bekommen, also bin ich ein bisschen stolz, aber ich bin offen für Fehler, die ich gemacht habe, natürlich lerne ich noch. Meine beiden Hauptfragen sind:

  1. Wie kann ich dieses Programm vorzeitig beenden, wenn der Benutzer die richtige Anzahl ausgewählt hat, bevor die Anzahl der Versuche 10 erreicht wurde? Und
  2. Irgendwelche offensichtlichen Fehler, die ein Guru sehen kann, dass ich nicht mit meinem Code bin?

Ich versuche so gut wie möglich zu programmieren :)

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

Verwenden Sie die Anweisung break, um eine Schleife zu verlassen: In diesem Fall ist dies möglicherweise nicht das, was Sie möchten, da Sie nach dem Verlassen der Schleife sofort die Meldung "Sie verlieren" sehen. Möglicherweise müssen Sie Ihr Programm neu strukturieren, um dies zu berücksichtigen.

Versuchen Sie so etwas:

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

Warum setzen Sie die while-Bedingung nicht auf die Vermutung des Benutzers? So etwas wie:

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

Hier sind drei Möglichkeiten. Lesen Sie über sie !!! (Wird als schädlich eingestuft.)

 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

Sie suchen nach dem Befehl break.

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

Diese Ressource sieht aus wie es sehr hilfreich für Sie wäre.

Als Randnotiz: Ihr Text "Sie verlieren" wird immer angezeigt, egal was passiert. Vielleicht möchten Sie das in der do {} -Schleife auswerten.


Mit den Posts/Edits zu dieser Antwort ist mir Andrew Hare immer einen Schritt voraus!

9
Nathan Taylor

Ich sehe keine "offensichtlichen Fehler", die in früheren Postern nicht erwähnt wurden, abgesehen von der Tatsache, dass Sie mit der Pause nicht mehr sowohl "i" als auch "numGuess" benötigen, da sie immer den gleichen Wert haben würden. Verwenden Sie im while-Zustand einfach numGuess anstelle von "i".

Ich möchte Ihnen jedoch wärmstens empfehlen, Ihren Code besser lesbar zu machen. Der beste Zeitpunkt, um sich an einen guten Codierungsstil zu gewöhnen, ist jetzt, bevor Sie sich schlechte Gewohnheiten aneignen und diese festigen.

  • Verwenden Sie immer selbstbeschreibende Bezeichner (Variablen-/Funktionsnamen). Z.B. Ihr "x" sollte eigentlich "maxGuesses" heißen.

  • Sparen Sie nicht auf Leerzeichen. Z.B. "} while (i <x);" sollte "} while (i <x)" sein

  • Du scheinst dich schon angewöhnt zu haben, auf Kommentare nicht zu verzichten - gut !!!

    Denken Sie daran, dass die Kommentare immer den Zweck beschreiben sollten, der hinter dem Code steckt, anstatt die Mechanik wie er funktioniert, es sei denn, die Mechanik ist so trickreich und clever, dass auch eine Erklärung erforderlich ist.

Dies ist aus zwei Gründen wichtig:

  • 80-90% der Entwicklungszeit/-bemühungen werden normalerweise für die Pflege des vorhandenen Codes aufgewendet, des eigenen Codes oder des Codes eines anderen. Diese Aufgabe ist mit gut dokumentiertem und leicht lesbarem Code SEHR einfacher. (Sie haben keine Ahnung, wie viel Gehirnschaden jemand durch das Lesen von unbekanntem Code um 2 Uhr morgens während des Produktionsproblems erleiden kann, nur weil der Bozo, der ihn geschrieben hat, den Code nicht konsistent eingerückt hat).

  • Gut dokumentierter und lesbarer Code erleichtert Ihnen das Schreiben, da er Ihre eigenen Gedanken klärt und dumme Tippfehler ("oups, ich wollte x anstelle von y verwenden") abschreckt.

1
DVK

Im Falle Ihres Programms ist es wahrscheinlich der beste Weg, dies zu erreichen, aufzurufen

void exit (int status);

(einschließlich stdlib.h)

nach dem Drucken von "You Win"

Im Allgemeinen können Sie jederzeit das Schlüsselwort "break" verwenden, um eine Schleife zu verlassen. Dies hat in Ihrem Fall nicht den gewünschten Effekt, da dann "Sie verlieren ..." gedruckt wird. Wenn Sie "break" verwenden möchten, müssen Sie das Bit "you lose ..." mit einer "if" -Anweisung versehen und prüfen, ob der Benutzer tatsächlich gewonnen hat.

0
Carsten