01: // uso reale di free() per evitare memory leak, simulazione del lancio di dadi, esempio complesso
02: #include<stdio.h>
03: #include<stdlib.h>
04: #include<time.h>
05: 
06: int main(int argc, char **argv){
07:   // si vuole simulare il lancio di n dati a 6 facce e vedere i risultati possibili
08: 
09:   srand(time(0));
10: 
11:   while(1) // la simulazione continua fino a che non la fermo io
12:   {
13:     int ndadi;
14:     printf("Inserire il numero di dati da simulare (0 per terminare): ");
15:     scanf("%d", &ndadi);
16: 
17:     if(!ndadi) // esco dal ciclo infinito se utente inserisce 0
18:       break;
19: 
20:     // alloco array che mi terra' conto dei possibili risultati 
21:     // considerando che il risultato piu' piccolo che posso ottenere e' ndadi (escono tutti 1)
22:     // e il piu' grande e' 6*ndadi (escono tutti 6)
23:     // il numero di risultati possibili e' 6*(ndadi-1)+1 (il +1 in quanto gli estremi sono inclusi)
24:     int nresults = 6*ndadi - ndadi + 1;
25: 
26:     // adesso so quanti elementi deve avere, posso allocarlo
27:     // dato che lo voglio inizializzare a 0, uso calloc()
28:     unsigned int *results = calloc(nresults, sizeof(unsigned int));
29: 
30:     // nell'elemento di indice 0 mettero' quante volte e' uscito il risultato minimo (tutti i dadi a 1 ovvero, ndadi)
31:     // nell'elemento di indice 1 mettero' quante volte e' uscito il risultato piu' vicino al minimo (tutti i dadi a 1 e uno solo a 2, ndadi+1)
32:     // ...
33:     // nell'elemento di indice piu' alto mettero' quante volte e' uscito il risultato massimo (tutti i dadi a 6, 6*ndadi)
34:     // quindi dato l'indice mi basta sommare ndadi per capire quale sia il risultato a cui e' associato quell'elemento
35: 
36:     // simulo "tanti" lanci di tutti i dadi da simulare
37:     for(int i = 0; i < 100000; ++i)
38:     {
39:       int score = 0;
40:       for(int dado = 0; dado < ndadi; ++dado) // ad ogni sessione di lancio, devo lanciare tutti gli ndadi dadi
41:   score += rand()%6 + 1;
42: 
43:       // incremento l'elemento corrispondente a quel risultato
44:       ++results[score - ndadi];
45:       
46:     }
47: 
48:     // cerchiamo quale sia il valore uscito piu' frequentemente ricercandolo sequenzialmente nell'array
49:     int max = 0;
50:     for(int j = 0; j < nresults; ++j)
51:       if(results[j] > max)
52:   max = results[j];
53: 
54:     // stampiamo tutti i possibili risultati in forma "grafica"
55:     for(int j = 0; j < nresults; ++j)
56:     {
57:       printf("%4d: ", j + ndadi); // prima di tutto stampo il risultato
58:       
59:       // stampo un numero di asterischi proporzionale al risultato ottenuto (max mi serve per normalizzare)
60:       for(int i = 0; i < results[j]*60/max; ++i)
61:   printf("*");
62: 
63:       printf("\n");
64:     }
65: 
66:     free(results); // fondamentale! se non lo uso ad ogni ciclo "perdo" un'area di memoria
67:   }
68: 
69:   return 0;
70: }
71: 
72: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it