Gli array nel C++

Avete risposto facilmente alle domande del post precedente? Bene, allora dopo aver parlato delle variabili, possiamo proseguire con un tipo particolare di variabili, chiamato array (o vettore).

Ricordate come si dichiara una variabile? Ma ipotizziamo di aver bisogno di più variabili dello stesso tipo, come procediamo?

Mettiamo ad esempio di dover scrivere un videogioco, dove sono presenti vari tesori da recuperare, che assegnano al nostro personaggio una quantità di monete differente l'uno dall'altro.
Ogni tesoro è rappresentato da una variabile che contiene il valore del tesoro stesso.
Possiamo procedere in questo modo:

int tesoro1, tesoro2, tesoro3, tesoro4;

E' un po' ridondante ma in fin dei conti funziona.
Ma se i tesori presenti nel videogame fossero molti di più, ad esempio cento o addirittura mille?
Questo è uno dei casi in cui ha senso ricorrere ad un array:

int tesoro[100];

Come potete vedere la dichiarazione di un array è molto simile alla dichiarazione di una variabile, se non fosse per quelle parentesi quadre che racchiudono un numero.

Chiariamo subito il significato di ciò che abbiamo scritto.
Con quella riga di codice abbiamo dichiarato un array di interi, formato da 100 elementi.

Questo significa che abbiamo 100 variabili pronte a contenere un numero intero.
E' innegabile la praticità nei confronti della dichiarazione precedente, sarebbe infatti assurdo pensare di poter dichiarare cento variabili. Così invece abbiamo cento variabili in un colpo solo, niente male!

Ma come facciamo ad utilizzare queste 100 variabili appena dichiarate?
O meglio, come si utilizzano gli array, una volta dichiarati?

Per accedere ad uno degli elementi dell'array basta utilizzare il nome dell'array (un po' come avviene per le variabili), seguito dal numero che identifica l'elemento a cui vogliamo accedere.

Continuando il nostro esempio del videogioco, ora che abbiamo dichiarato l'array di tesori, dobbiamo assegnare un valore ad ogni tesoro.
Abbiamo deciso che i primi tre tesori si trovano nascosti nel primo livello, e sono relativamente facili da trovare, perciò gli assegniamo un punteggio basso; mentre l'ultimo dei cento tesori è custodito da un boss difficile da uccidere, perciò gli assegniamo un valore altissimo:

tesoro[0] = 12; //primo tesoro, a cui assegniamo il valore 12
tesoro[1] = 25; //secondo tesoro
tesoro[2] = 31; //terzo tesoro
tesoro[99] = 12500; //all'ultimo tesoro, il centesimo, assegniamo il valore 12500

Da questo piccolo esempio impariamo due cose:
la prima è come assegnare un valore agli elementi di un array;
la seconda è che gli elementi non vanno da 1 a 100, ma da 0 a 99.
Infatti come possiamo osservare il primo elemento è accessibile tramite l'elemento dell'array [0], il secondo tramite l'elemento [1], il terzo tramite l'elemento [2], ed infine il centesimo tramite l'elemento [99].

Il numero all'interno delle parentesi quadre, utilizzato per accedere ad un particolare elemento dell'array, è detto indice.
Si dice che, per n elementi, l'indice assume un range che va da 0 a n-1.
Nel caso quindi di un array con 73 elementi, l'indice dell'array andrà da 0 a 72, e non da 1 a 73. Memorizzate bene questa caratteristica degli array per evitare errori in futuro.

Oltre all'immediata comodità che abbiamo evidenziato, gli array si rivelano molto utili in alcuni casi particolari, per via della loro serialità. Vedremo meglio questo aspetto quando parleremo delle strutture di controllo.

Ora immaginiamo che, nel momento in cui il personaggio trova il tesoro, viene mostrata a schermo una scritta di congratulazioni, seguita dal valore del tesoro recuperato.
Per mostrare il contenuto di un array si procede esattamente come si fa con le comuni variabili:

cout << "hai trovato il terzo tesoro che vale " << tesoro[2] << " punti!";

Ormai conosciamo bene il funzionamento di cout e del simbolo di concatenazione.
Per mostrare il contenuto di un array, basta scrivere il nome dell'array seguito dall'indice che ne identifica l'elemento.
Nel nostro esempio mostreremo una stringa di testo, seguita dal contenuto dell'elemento [2] dell'array, a sua volta seguito da una stinga:

hai trovato il terzo tesoro che vale 31 punti!

Notarte come le due stringhe letterali sono racchiuse tra doppi apici, mentre l'array, così come avviene per le variabili, non è racchiuso tra doppi apici.
Se avessimo scritto il nome dell'array ed il suo indice tra virgolette,

cout << "hai trovato il terzo tesoro che vale " << "tesoro[2]" << " punti!";

il programma avrebbe stampato:

hai trovato il terzo tesoro che vale tesoro[2] punti!

Questo per rinfrescarci un po' la memoria, anche se sono sicuro che ormai lo sapete bene.

Per quanto riguarda la manipolazione del contenuto degli elementi di un array tramite gli operatori aritmetici, anche qui il comportamento è identico a quello delle comuni variabili.
Ad esempio possiamo decidere che, una volta concluso il livello del videogame, viene mostrato a schermo il punteggio totale realizzato:

int punteggio;

//punteggio = 12 + 25 + 31
punteggio = array[0] + array[1] + array[2]; //la variabile punteggio conterrà il numero 68

cout << "hai totalizzato " << punteggio << "punti!";

Che stamperà a schermo:

hai totalizzato 68 punti!

Come vedete l'utilizzo degli array è molto semplice, basta pensare agli elementi di un array come tante variabili con lo stesso nome, a cui si accede tramite l'indice.

Un array, così come le variabili comuni, può essere inizializzato ad un valore specifico al momento della sua dichiarazione.

int tesoro[4] = {12, 21, 30, 32};

La linea di codice qui sopra dichiara un array di 4 elementi, e li inizializza ai valori racchiusi tra parentesi graffe.
L'elemento tesoro[0] conterrà il valore 12, l'elemento tesoro[1] conterrà il valore 21 e così via.

E' importante capire che questa forma vale solo per l'inizializzazione, e non può essere utilizzata per l'assegnamento.
Ricordiamo che l'inizializzazione avviene nel momento in cui si dichiara una variabile (in questo caso un array), mentre l'assegnamento avviene ogni volta che si assegna un valore ad una variabile già esistente, e cioé dichiarata in precedenza.

int tesoro[4] = {12, 21, 30, 32}; //CORRETTO! dichiarazione ed inizializzazione

tesoro[2] = 10; //assegnamento

int funghiMagici[3]; //dichiara una variabile di tre elementi

funghiMagici[3] = {6, 8, 12}; //ERRATO!

L'ultima riga di codice è errata. Come abbiamo già detto infatti, questa forma si può utilizzare solo per l'inizializzazione dell'array, e cioé solo durante la sua dichiarazione. Non si può utilizzare invece per il comune assegnamento.

Dovete però sapere esiste un modo più comodo di inizializzare gli array, senza specificare il numero di elementi:

int arrayNumeri[] = {'13', '31', '93'};

Il compilatore capisce da solo che deve creare un array di 3 elementi.

Infine è possibile utilizzare una variabile intera come indice, a patto che questa variabile non sia indefinita (deve cioè contenere un dato valore):

int indice;

float mioArray[indice]; //ERRATO! il contenuto della variabile indice è ancora indefinito

indice = 10;

float altroArray[indice]; //CORRETTO! definisce un array di 10 elementi

Tuttavia il compilatore non restituisce errore. Si limita a lanciare un avvertimento al programmatore, dicendogli che la variabile utilizzata come indice è indefinita.
Tant'è vero che, se proviamo ad assegnare un valore ad un elemento di mioArray, e poi proviamo a stamparlo tramite cout, durante l'esecuzione del programma ci viene restituito un errore di segmentation fault.

Prima di concludere ribadisco che gli elementi di un array[n] vanno da 0 a n-1.
Il primo elemento di int funghiMagici[3] sarà funghiMagici[0], mentre l'ultimo elemento sarà funghiMagici[2]. Mi raccomando, non dimenticate questa caratteristica degli array!

Quel che abbiamo detto sugli array per ora può bastare.
In questo post abbiamo imparato cos'è un array, come si dichiara, come si inizializza e come si utilizza all'interno di un programma.

Nessun commento:

Posta un commento