|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2007
Messaggi: 1352
|
[C]Problema funzione ricorsiva.
Salve, ho un problema con questo codice , è una funzione ricorsiva che dovrebbe generare numeri sparsi casualmente, da 1 a 10, con ripetizione 4 volte.
Simula in pratica il mescolamento di un mazzo di carte napoletane da 40 carte (senza contare il seme). E' fatto per mezzo di una funzione ricorsiva e dei puntatori, ma il risultato è che a volte mi escono numeri tutti uguali, altre volte mi dice il programma ha smesso di funzionare. Ecco il codice : Codice:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define dim 40 void genera_num(int *); int i,k=0; int *s; int main(){ int A[dim]; int *s; s=A; for(i=0;i<40;i++){ genera_num(s); s++; } for(i=0;i<40;i++) printf("%d ",A[i]); system("PAUSE"); return(0); } void genera_num(int *b){ int asso,due,tre,quattro,cinque,sei,sette,donna,cavallo,re,a; srand(time(NULL)); a=rand()%10+1; switch(a){ case 1: asso++; if(asso<5) *b=a; else genera_num(b); break; case 2: due++; if(due<5) *b=a; else genera_num(b); break; case 3: tre++; if(tre<5) *b=a; else genera_num(b); break; case 4: quattro++; if(quattro<5) *b=a; else genera_num(b); break; case 5: cinque++; if(cinque<5) *b=a; else genera_num(b); break; case 6: sei++; if(sei<5) *b=a; else genera_num(b); break; case 7: sette++; if(sette<5) *b=a; else genera_num(b); break; case 8: donna++; if(donna<5) *b=a; else genera_num(b); break; case 9: cavallo++; if(cavallo<5) *b=a; else genera_num(b); break; case 10: re++; if(re<5) *b=a; else genera_num(b); break; } }
__________________
Ho venduto a : truedocman2004,ragen-fio Ho acquistato da :shinakuma, britt-one |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Feb 2005
Città: Prato
Messaggi: 149
|
Ciao,
La prima cosa da fare è togliere la srand() da dentro la funzione di generazione. La srand inizializza il generatore di numeri casuali ed è sufficiente richiamarla una volta all'inizio del programma. Se il codice impiega meno di 10msec per una passata di genera_num (e credo proprio sia così), la time() restituirà lo stesso valore per cui il generatore produrrà la stessa sequenza precedente (ergo ottieni valori tutti uguali). La variabili che usi nella genera_num poi sono locali. Tra un esecuzione e l'altra (rocorsione compresa) non manterranno il loro valore (e a seconda dei compilatori potrebebro essere inizializzate sempre a 0 o, peggio, avere valori sporchi). Se ad ogni modo fosse così potresti avere un loop infinito di chiamate ricorsive (se per assurdo avessi tutte le condizioni false) che satura velocemente lo stack. Ciaociao ![]()
__________________
Venite a visitarci qui:http://www.bottomap.com Bottomap is a proud Masterdrive.it moderator Ultima modifica di bottomap : 02-12-2009 alle 11:46. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non ha senso avere tutti quelle variabili locali. Basta rappresentarle con un vettore di 10 elementi, vettore che poi devi anche passare nella ricorsione.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:34.