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
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it