[RISOLTO][C] Indovina un numero casuale

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

jolly

Utente Attivo
Messaggi
110
Reazioni
4
Punteggio
38
Salve,ho appena finito di studiare i numeri casuali e subito mi è venuto in mente di fare un semplice programma che ha come scopo quello di indovinare un numero casuale.
Il numero casuale è compreso tra 1 e 10,si hanno solo 3 possibilità,ogni volta il programma da un suggerimento all'utente se il numero da indovinare sia maggiore o minore di quello inserito.
Ad esempio se il numero casuale è 8,e l'utente digita 5,viene restituito un messaggio:inserire un numero più grande o viceversa.

In un primo momento ho svolto cosi il programma:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
{    
    int i,n,x;

    srand( time (NULL) ); /* cambia il seme in base al tempo */
    
    n=1+(rand() %10);  /* genera un numero casuale compreso tra 1 e 10 */

    for (i=1;i<=3;i++) { 

        printf( "Inserisci un numero: " );
        scanf( "%d" , &x );

        if (x>n) {
            printf( "inserisci un numero più piccolo\n" );
        }
            
        if (x<n) {
            printf( "inserisci un numero più grande\n" );
        }

        if (x==n) {
            printf( "Hai vinto\n" );
            return 0; /* cercavo un modo che se la condizione fosse vera,mi avrebbe fatto uscire dal programma senza stampare la riga successiva,così funziona,ma dubito che sia il modo corretto */
        }
    }
    
    printf( "Hai perso,il numero da indovinare era %d\n" , n );

    return 0;
}

Lo so il programma è stupido ma io già ho incontrato una difficoltà,cioè nel momento in cui si inserisce per la terza volta un numero sbagliato esce di nuovo la riga
Codice:
printf( "inserisci un numero più piccolo\n" );
oppure
Codice:
printf( "inserisci un numero più grande\n" );
e in seguito esce la scritta hai perso.
Ecco io vorrei che si evitasse questa situazione cioè alla 3 possibilità se uno sbaglia dovrebbe uscire solo una scritta hai perso.

Ho cercato di risolvere questo problema in un altro metodo,che funziona bene,ma il codice non mi convince molto,ecco:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
{    
    int i,n,x;

    srand( time (NULL) );
    
    n=1+(rand() %10);

    for (i=1;i<=2;i++) {

        printf( "Inserisci un numero: " );
        scanf( "%d" , &x );

        if (x>n) {
            printf( "inserisci un numero più piccolo\n" );
        }
            
        if (x<n) {
      %ari/535.7Content-Type: applicanbsp;  printpt: text/html,application/xhtml 9 grande\n" );
        }

        if (x==n) {
            printf( "Hai vinto\n" );
            return 0;
        }
    }

    for (i=3;i<=3;i++) { /* in modo che all'ultima possibilità stampi solo hai vinto o perso */
        
        printf( "Inserisci un numero: " );
        scanf( "%d" , &x );

        if (x!=n) {
            printf( "Hai perso,il numero da indovinare era %d\n" , n );
        }

        else {
            printf( "Hai vinto\n" );
        }
    }


    return 0;
}

Che ne pensate?
 
Ultima modifica da un moderatore:
Re: [C] Indovina un numero casuale

Ti correggo, ho provato il codice ma non si presenta l'errore che dici tu, ora continuo a tenerlo in esecuzione per vedere come si comporta

Ecco prova quest codice, ho aggiunto un if, un return 0 e tolto il for finale

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
{    
    int i,n,x;

    srand( time (NULL) );
    
    n=1+(rand() %10);

    for (i=1;i<=3;i++) {

        printf( "Inserisci un numero: " );
        scanf( "%d" , &x );

        if (i==3 && x!=n)
        {    
            printf("Hai perso, il numero da indovinare era %d\n ",n);
            return 0;
        }

        if (x>n) {
            printf( "inserisci un numero più piccolo\n" );
        }
            
        if (x<n) {
             printf( "inserisci un numero più grande\n" );
        }

        if (x==n) {
            printf( "Hai vinto\n" );
            return 0;
        }

    }

    return 0;
}
 
Ultima modifica:
Re: [C] Indovina un numero casuale

Un piccolo consiglio: abituati ad usare i for partendo da 0 ed evitando se possibile il >= o <=... quando studierai gli array capirai perchè.
Poi nel codice ti complichi la vita per niente:

main() {
int i,x, n = rand();
for(i = 0; i < 3; i++) {
printf("Numero: ");
scanf("%d", &x);
if(x < n) printf("Piu grande...\n");
else if(x > n) printf("Più piccolo");
esle {
printf("Hai vinto!!!");
return;
}
}
printf("Hai perso!!!");
}

Si nonostante main sia void, puoi usare il return (senza valore) in modo da far terminare immediatamente la funzione
 
Re: [C] Indovina un numero casuale

grazie ad entrambi;

Alfo1:
Il tuo codice funziona bene.

Devil 8Ball:
Il manuale consiglia sempre di usare for partendo da 1,ma mi fido di te :).
Nel tuo codice si presenta sempre quel problema,che si verifica nel mio codice iniziale,ovvero se si sbaglia per tre volte invece di stampare direttamente hai perso esce prima inscerisci un numero più grande/piccolo e poi hai perso.
 
Re: [C] Indovina un numero casuale

Strano... ma effettivamente non provato ad eseguire il programma quindi sicuramente mi sfugge qualcosa.
Per il for, è il primo manuale che sento che consiglia di iniziare da 1...
 
Re: [C] Indovina un numero casuale

Ho trovato il pezzettino che parla di questa cosa :)
" Usare il valore finale insieme all'operatore relazionale <=,all'interno della condizione di un comando while o for,aiuterà a evitare gli errori di imprecisione di uno.In un ciclo utilizzato per visualizzare i valori da 1 a 10,per esempio,la condizione di continuazione del ciclo dovrà essere counter <=10 piuttosto che counter <11 o counter < 10."
Io fino a ora ho fatto così proprio perchè avevo letto questa cosa,ma apprezzo molto i vostri consigli,perchè sicuramente avete più esperienza di me e so che non direte mai qualcosa di negativo all'aspirante programmatore :)
 
Re: [C] Indovina un numero casuale

Il libro non ha tutti i torti, ma imparare come ti ho suggerito ti aiuterà in futuro: quando studierai gli array, avrai una cosa del tipo "int array[10]" (per ora ti basta sapere che non è altro che una "lista" di variabili interi) ma scoprirai che il contatore degli elementi parte da 0, quindi se sei abituato ad utilizzare 1 nei for sarà molto più facile compiere errori.
Inoltre, quando studierai le strighe, scoprirai che sono array di caratteri char, con l' ultimo valore uguale a "/0"...
In sostanza, una stringa di 10 conterrà effettivamente 9 caratteri... capisci perchè ti consiglio di non usare il >=? se non ti ricordassi questa cosa ma facessi < 10 (come da abitudine) non faresti errori
 
Re: [C] Indovina un numero casuale

Consiglio anche io di far partire l indice da 0; visto che non volevo sconvolgere troppo il codice per non disorientare l utente ho lasciato cosi. Altrimenti fosse stato per me partiva da 0.
Cmq sono contento che tu abbia capito come si doveva fare
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top