=== Imparando.net ===

Vettori e matrici

I vettori sono dei tipi particolari di variabile che nei linguaggi di programmazione hanno lo scopo di gestire un certo numero di variabili dello stesso tipo senza doverle dichiarare una a una e utilizzarle in maniera singola. Se ad esempio si volessero stampare dal più piccolo al più grande 10 numeri inseriti in ordine casuale dall’utente, si avrebbe la necessità di memorizzarli, applicare un qualche metodo per ordinarli e successivamente visualizzarli. Risulta evidente che se dovessimo chiamare ogni variabile singolarmente ci si troverebbe con 10 variabili e la stesura del codice per l’ordinamento prevederebbe un numero notevolissimo di righe per realizzare un programma piuttosto semplice. Se poi i numeri inseriti fossero migliaia o milioni è facile immaginare che sarebbe praticamente impossibile scrivere il programma.
L’idea che risolve tutti i problemi di questo tipo parte dall’osservazione che l’unico elemento che differenzia una variabile dall’altra è la sua posizione, cioè ci si potrebbe riferire a ogni variabile con degli ordinali, indicandole come la prima, la seconda, la terza e così via: in questo modo tutte le variabili avrebbero lo stesso nome, v ad esempio, ma ognuna verrebbe distinta dalle altre attraverso un indice, cioè un intero positivo che ne indica la posizione. Potremmo così avere v1, v2, v3 e così via. La sintassi del C prevede che per rappresentare questa idea si scriva una variabile di tipo vettore seguita da una coppia di parentesi quadre, all’interno delle quali inserire l’indice che individua la variabile specifica (detta elemento del vettore).

int v[10], n[20];
                    v[3] = 7;
                    n[5] = v[3];
                    
In questo esempio vengono prima dichiarati due vettori, il vettore v che può contenere 10 elementi e il vettore n che ne può contenere 20, entrambi di tipo intero: la dichiarazione della dimensione dei vettori è necessaria per motivi tecnici, dovendo decidere in fase di scrittura del codice che numero inserire in genere si stima la dimensione massima in base al tipo di problema e si sceglie quella, accettando che probabilmente si "sprecherà" memoria. Successivamente il quarto elemento del vettore v (il quarto perché in C gli indici dei vettori partono da 0 e non da 1) viene ad assumere il valore 7 e il sesto elemento del vettore n assume il valore del quarto elemento del vettore v, cioè ancora 7. Tutti gli altri elementi di entrambi i vettori risultano avere valori indefiniti. Il seguente esempio è invece un pezzo di codice più realistico che mostra un possibile utilizzo dei vettori.
int M[10],i;
                    for (i = 0;i < 10; i++)
                      scanf("%d", &M[i]);
                    for (i = 9;i >= 0; i--)
                      if (i % 2 == 0) printf ("%d", M[i]);
                    
Dopo aver dichiarato un vettore M di lunghezza 10 elementi, il primo ciclo for fa inserire all’utente 10 valori nelle 10 posizioni del vettore. Il secondo ciclo stampa solo i valori nelle posizioni di indice pari (la condizione è vera solo se la divisione di i per 2 ha resto 0, che è equivalente a dire che i è pari) in ordine inverso a quello di inserimento. Un tipo particolare di vettore è quello formato da caratteri, solitamente indicato come stringa. La sua importanza deriva dal fatto che praticamente ogni programma ha la necessità di lavorare con le stringhe, per visualizzarle, elaborarle, modificarle, ma per molti aspetti possono essere immaginate alla stregua dei vettori di altri tipi.

Matrici

Una naturale estensione dei vettori sono le matrici, a volte dette vettori bidimensionali (o più in generale multidimensionali) perché al posto di avere un solo indice ne hanno due o più. Il modo più semplice di immaginare una matrice bidimensionale è di pensare a una griglia rettangolare in cui ogni elemento è individuato da una posizione sulle righe e da una sulle colonne, come nel noto gioco battaglia navale, nel quale la forma quadrata della griglia è solo un caso particolare della forma rettangolare.
Supponendo di avere una matrice M con 30 righe e 24 colonne, in cui ogni valore in posizione M[i][j] rappresenta la temperatura misurata il giorno i del mese di giugno all’ora j di quel giorno, è facile stampare le medie giornaliere delle temperature con il seguente codice.
float M[30][24], somma;
                    int i, j;
                    …
                      for (i = 0; i < 30; i++){
                        somma = 0;
                        for (j = 0; j < 24; j++)
                          somma += M[i][j];
                        printf ("La media del giorno %d è stata di %f gradi\n", i + 1, somma/24);
                      }
                    
Come si può vedere la dichiarazione di una matrice è una naturale estensione di quella di un vettore: dopo aver acquisito i dati (nel codice compaiono dei puntini per brevità) il for più esterno ha lo scopo di scorrere i 30 giorni in cui i dati sono acquisiti e il for interno addiziona i valori giornalieri nella variabile somma. Da notare che la variabile somma viene riportata a 0 ad ogni nuovo ciclo del for esterno, altrimenti i valori di temperatura si accumulerebbero e solo il primo giorno avrebbe la media giusta.