Esercizio No. 5 Vettori
Sviluppare un’algoritmo che permetta di riempire un vettore di 5 elementi interi con 5 numeri compresi fra 0 e 9 (inclusi) in modo casuale (random) e senza che vi siano ripetizioni.
(questo algoritmo è molto importante i fini della simulazione di fenomeni come il gioco del lotto o l’estrazione di una carta da un mazzo: ossia estrazioni che non prevedono la possibilità della reimmissione dell’elemento scelto da un dato insieme).
Soluzione:
Il problema può essere assimilato all’esperienza di avere una scatola con all’interno 10 palline numerate dallo 0 al 9 e di effettuare 5 estrazioni casuali.
Se il problema prevedesse la possibilità di reimmissioni nel vettore sarebbero ammesse anche ripetizioni; la costruzione di un algoritmo del genere non pone problemi:Si crea un generatore di numeri random da 0 a 9 e si effettuano 5 estrazioni:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int n=5; main(){
int i,T[n];
//caricamento
srand(time(0));
for(i=0;i < n;i++)T[i]=rand()%10;
//stampa a video
for(i=0;i < n;i++)cout << ” ” << T[i];
}//fine main
per evitare che ci siano ripetizioni di numeri già presenti nel vettore dobbiamo modificare il primo ciclo for (quello del caricamento).
La prima estrazione (i=0) non pone problemi, ma per quelle successive occorre controllare tutte le posizioni del vettore precedenti a quella attuale per verificare se qualcuno dei numeri estratti in precedenza sia uguale a quello attuale; in tal caso bisogna ripetere l’estrazione; secondo lo schema illustrato sotto.
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int n=5;
main(){
int i,j,T[n];
int d;
//caricamento
srand(time(0));
for(i=0;i < n;i++)
if(!i)T[i]=rand()%10;
else do{
d=0;
T[i]=rand()%10;
for(j=0;j < i;j++)
if(T[i]==T[j])d=1;
}while(d);
//stampa a video
for(i=0;i < n;i++)cout << T[i];
}//fine main
Nel nostro caso usiamo la variabile intera d (avremmo anche potuto usare una variabile booleana). Il ramo else dell’if(!i) riguarda tutti i casi in cui il valore corrente dell’indice i è diverso dalla prima posizione.
Viene usato un ciclo do-while all’inizio del quale d viene posta a 0, viene estratto il numero casuale e con un secondo indice j tramite un’altro ciclo for vengono scansionate le posizioni nel vettore precedenti alla i-esima, se viene trovata un’uguaglianza fra il valore estratto e uno dei valori estratti in precedenza (T[i]==T[j]) il ciclo do viene ripetuto altrimenti d viene posta ad 1 e questa è la condizione di rilascio dal ciclo do che implicitamente conferma che il numero estratto attualmente non è ià presente nel vettore.
Data l’articolazione del ciclo for di caricamento, ne riportiamo lo schema a blocchi.
Commento all'articolo