01. Es. svolto: estrazioni dall'urna

Traccia:

Scrivere un programma che simula l'estrazione di numeri da un'urna (senza reimbussolamento).

Fare riferimento ad un'urna contenente 90 numeri.

Strategia:

Per simulare l'estrazione senza reimbussolamento, occorre evitare che uno stesso numero possa presentarsi più volte.

A tale scopo si utilizza un array di appoggio, denominato urna, che contiene tutti i numeri inizialmente presenti nell'urna (nel nostro caso da 1 a 90).

Con la funzione rand() si procede alla selezione di un indice i dell'array: il numero estratto coinciderà con il valore contenuto nella cella urna[i].

Quando un numero è estratto si ricalcola un nuovo limite per l'array in modo da escludere l'ultima cella. Contemporaneamente il valore della cella esclusa è ricopiato nella cella urna[i].

Svolgimento:


#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define NUM_BUSSOLOTTI 90

int main()

{

int urna[NUM_BUSSOLOTTI], i, j;

// Caricamento dei numeri nell'urna

for (i=0; i<NUM_BUSSOLOTTI; i++)

urna[i]=i+1;

// Selezione casuale di una sequenza pseudo-casuale

srand(time(NULL));

// Estrazione di tutti i bussolotti (uno alla volta)

for (i=0; i<NUM_BUSSOLOTTI; i++){

j=rand()%(NUM_BUSSOLOTTI-i);

printf("%d ", urna[j]);

urna[j]=urna[NUM_BUSSOLOTTI-i-1]; //ultima cella valida

}

return 0;

}

#define NUM_BUSSOLOTTI 90

Questa istruzione è utilizzata per definire delle costanti.

Per l'esattezza, in fase di precompilazione, il testo NUM_BUSSOLOTTI viene sostituito in tutte le occorrenze presenti nel programma con il valore definito nell'istruzione (nella fattispecie 90). Solo allora la compilazione vera e propria ha inizio.