2009-10-02 16 views
7

Ho un programma C di base che produce un numero e l'utente deve indovinarlo (sì, lo hai già chiamato: compiti a casa). Sono in grado di ottenere più o meno tutto, quindi sono un po 'orgoglioso, ma apro gli errori che ho fatto, ovviamente sto ancora imparando. Le mie due domande principali sonoCome terminare un ciclo all'inizio di C?

  1. Come posso terminare questo programma in anticipo quando l'utente ha selezionato il numero corretto, prima che abbia raggiunto il numero 10 di tentativi? E
  2. Eventuali errori evidenti a un guru possono vedere che io non sono con il mio codice?

che sto cercando di programmare come meglio posso :)

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; 
} 
+2

Ti è stata insegnata la struttura del programma di base, cicli do/while, IO, sscanf, rand, seeding del rng, ma non 'break'? – Jason

+4

È bello vedere che hai commentato il tuo codice - ben fatto: D –

+0

Perché hai due chiamate getchar() alla fine, quando dici che vuoi solo 1 tasto per terminare il programma? –

risposta

15

utilizzare l'istruzione break di saltare fuori di un ciclo: In questo caso però che non può essere ciò che si desidera in quanto una volta che si uscendo dal ciclo vedrai immediatamente il messaggio "tu perdi". Potrebbe essere necessario ristrutturare il programma per tener conto di ciò.

provare qualcosa di simile:

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; 
} 
+8

Non dovresti pubblicare programmi completi modificati in risposta alle domande sui compiti. Anche se il poster impara il materiale senza applicare la risposta data, il poster potrebbe ancora finire nei guai perché qualcuno ha mostrato loro una risposta completa. – Novelocrat

+1

@Novelocrat - Punto preso :) –

9

Stai cercando il comando break.

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

This resource sembra che sarebbe molto utile a voi.

Come nota a margine: il testo "You lose" verrà sempre visualizzato indipendentemente da cosa. Si consiglia di valutarlo all'interno del ciclo do {}.


Sempre un passo avanti a me con i post/modifiche su questa risposta Andrew Hare!

+0

Il ciclo non deve essere utilizzato nella situazione è la risposta corretta. Mentre qualcosa è il modo giusto per gestire questo. –

0

Nel caso del vostro programma il modo migliore per raggiungere questo obiettivo è probabilmente chiamare

uscita void (int status);

(includere stdlib.h)

dopo la stampa "You Win"

In generale è possibile utilizzare la parola chiave "pausa" per uscire da un ciclo in qualsiasi momento. Questo non ha l'effetto desiderato nel tuo caso in quanto andrebbe a stampare "tu perdi ....". Se vuoi usare "break" dovresti mettere un'istruzione "if" attorno al bit "you lose ..." e verificare se l'utente non ha effettivamente vinto.

+4

Non mi piace molto usare 'exit()' per uscire dal programma; Personalmente riserverei il suo uso per errori fatali. In questo esempio è banale usare invece 'break' o cambiare la condizione while come suggerito. – Twisol

9

Perché non impostare la condizione while per l'utente? Qualcosa di simile:

...}while(i < x || guess !== target); 
+2

Sarebbe meglio usare l'interruzione poiché l'intento del codice sarebbe più evidente. –

+3

La pensi così? Penso che terminarlo nel frattempo sia più evidente. È come dire "Continuerò a chiedere finché non lo farai bene o finirai il rischio". Avere una pausa fa sembrare che si sia verificato un errore o qualcosa di più importante ha bisogno di attenzione ... – Anthony

+2

Non sarei d'accordo. In questo caso può essere visto entrare nel ciclo quando finirà. Usando la pausa, si deve leggere per passare attraverso il codice per sapere che. –

8

Ecco tre possibilità. Leggi di loro !!! (Goto considerato nocivo)

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; 
} 
+1

E in alcuni contesti 'return some_value;' too. – dmckee

1

non vedo alcuna "errori evidenti" che i manifesti precedenti non ha menzionato, a parte il fatto che, con la rottura, non è più necessario sia "i" e "numGuess" come avrebbero sempre avuto lo stesso valore. Basta usare numGuess invece di "i" in condizioni di tempo.

Ma mi raccomando vivamente di rendere il vostro codice più leggibile - il momento migliore per prendere l'abitudine al buon stile di codifica è ora, prima di acquisire e consolidare le cattive abitudini.

  • Utilizzare sempre identificatori auto-descrittivi (nomi di variabili/funzioni). Per esempio. la tua "x" dovrebbe essere chiamata "maxGuesses".

  • Non lesinare sullo spazio bianco. Per esempio. "} while (i < x);" dovrebbe essere "} while (i < x);"

  • Sembra che tu abbia già preso l'abitudine di non lesinare sui commenti - buono !!!

    Ricorda che i commenti dovrebbero sempre descrivere lo scopo alla base del codice anziché la meccanica di come lo fa, a meno che la meccanica sia così complicata e intelligente da richiedere anche una spiegazione.

La ragione per cui questo è importante è duplice:

  • 80-90% del tempo di sviluppo/sforzi di solito sono spesi per il mantenimento di codice esistente, il proprio o di qualcun altro. Questo compito è VASTAMENTE più facile con un codice ben documentato e facilmente leggibile. (non hai idea di quanto danno cerebrale qualcuno possa sostenere leggendo codice non familiare alle 2 del mattino durante il problema di produzione solo perché il bozo che lo ha scritto non ha indentato il codice in modo coerente).

  • Avere un codice ben documentato e leggibile facilita la scrittura, poiché chiarisce i propri pensieri e scoraggia stupidi errori di battitura ("oups, intendevo usare x invece di y").