/*Il programma genera un numero casuale di 5 cifre che deve essere indovinato dall'utente senza un limite di tentativi. Il programma segnala il numero di cifre che l'utente ha indovinato ma non quali. Non è possibile inserire più volte la stessa combinazione; nel caso ciò accadesse il programma restituisce un messaggio di errore*/ #include #include #include #include struct _lista { short vettore[5]; long valore; struct _lista *next; }; typedef struct _lista lista; lista *inizio; short n[5], ni[5]; long valins; int i,j, tentativi=0; void randomizza(void); void confronta(void); void verifica(void); int aggiungi(void); void libera (void); void main() { randomize(); randomizza(); confronta(); getch(); libera(); } /*La funzione randomizza genera un numero casuale*/ void randomizza(void) { for(i=0;i<5;i++) n[i]=rand()%10; } /*La funzione confronta permette di verificare se il numero inserito dall'utente è corretto e comunica all'utente il numero di tentativi che ha impiegato. Nel caso il numero inserito dall'utente non fosse corretto richiama la funzione aggiungi o la funzione verifica in base alla condizione che si verifica. E' inoltre presente un controllo che non permette all'utente di inserire un numero negativo ed un numero maggiore di 9.*/ void confronta(void) { int controllo=0, trovato; do { do { printf("Prova ad indovinare inserendo i 5 numeri separati da uno spazio!\n"); scanf("%d %d %d %d %d",&ni[0],&ni[1],&ni[2],&ni[3], &ni[4]); if(ni[0]<0 || ni[1]<0 || ni[2]<0 || ni[3]<0 || ni[4]<0 || ni[0]>9 || ni[1]>9 || ni[2]>9 || ni[3]>9 || ni[4]>9) printf("Numero non corretto!!\n"); }while(ni[0]<0 || ni[1]<0 || ni[2]<0 || ni[3]<0 || ni[4]<0 || ni[0]>9 || ni[1]>9 || ni[2]>9 || ni[3]>9 || ni[4]>9); if(n[0]==ni[0]&&n[1]==ni[1]&&n[2]==ni[2]&&n[3]==ni[3]&&n[4]==ni[4]) { printf("Bravo,il numero e\' corretto!\n"); printf("Hai impiegato %d tentativi",tentativi); controllo=1; } else { valins=0; for(i=0;i<5;i++) valins=(valins*10)+ni[i]; trovato=aggiungi(); if (!trovato) printf("Numero gia\'inserito\n"); else verifica(); } } while(!controllo); } /*La funzione gestisce una lista nella quale vengono inserite le combinazioni inserite dall'utente una di seguito all'altra*/ int aggiungi(void) { int trovato=0; lista *temp, *p0=NULL, *p1; if(!inizio) { tentativi++; inizio=(lista*)malloc(sizeof(lista)); for(i=0;i<5;i++) inizio->vettore[i]=ni[i]; inizio->valore=valins; inizio->next=NULL; } else { for(p1=inizio;p1!=NULL&&(p1->valore!=valins);p1=p1->next) p0=p1; if(p1!=NULL&&p1->valore==valins) trovato=1; else { tentativi++; temp=(lista*)malloc(sizeof (lista)); for(i=0;i<5;i++) temp->vettore[i]=ni[i]; temp->valore=valins; p0->next=temp; temp->next=p1; } } return !trovato; } /*La funzione verifica restituisce all'utente il numero di cifre che ha indovinato*/ void verifica(void) { j=0; for(i=0;i<5;i++) if(n[i]==ni[i]) j++; printf("Hai indovinato %d numeri\n",j); } /*La funzione libera cancella la memoria allocata dal programma quando questo è stato eseguito*/ void libera(void) { lista *p0, *p1; p1=inizio; while(p1) { p0=p1; p1=p1->next; free (p0); } }