Matrici e Array (superiori)
Le Matrici
[modifica]Dopo aver visto il vettore che è una struttura dati omogenea monodimensionale ( gli elementi che lo compongono sono dello stesso tipo e sono accessibili mediante un solo indice ) passiamo a una seconda struttura dati, la matrice. La matrice è una struttura dati omogenea bidimensionale , cioe' gli elementi che la compongono sono accessibili mediante una coppia di indici generalmente indicati come "riga" e "colonna". Come per i vettori la struttura dati è omogenea , cioe' i dati che la compongono sono tutti dello stesso tipo, equivale alla rappresentazione dei dati di una tabella (con dati tutti dello stesso tipo ad esempio tutti pesi, oppure tutti prezzi etc.) le cui celle sono identificabili mediante il numero di riga e il numero di colonna. Per dichiarare una matrice si utilizza la seguente sintassi:
TipoDiDati NomeMatrice[DimensioneRighe][DimensioneColonne]
se voglio una matrice di nome mat con 3 righe e 4 colonne i cui elementi sono interi devo dare il comando:
int mat[3][4];
per caricare il numero 15 nella cella riga 0 colonna 1 do il comando
mat[0][1]=15;
Gli indici, come nei vettori, partono da zero, il primo indice per convenzione è il numero di riga e il secondo è il numero di colonna se la matrice ha 3 righe e 4 colonne l'indice della riga può assumere i valori 0,1,2 e quello della colonna 0,1,2,3. per passare in rassegna tutte le celle di una matrice devo generare tutte le coppie di indici
0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1,2,2 2,3
per farlo uso 2 cicli for annidati del tipo
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
{cout << i<<","<<j<<" ";
}
il primo ciclo for fissa la riga sulla quale si vuole lavorare e il secondo ciclo for passa in rassegna le colonne di quella riga, le istruzioni fra parentesi graffe hanno a disposizione la coppia i,j che assume via via tutte le combinazioni riga,colonna possibili
Quando viene creata una matrice nella memoria del computer vengono prese un insieme di celle contigue (come nei vettori) e i dati sono memorizzati per riga.Ad esempio se dichiaro e inizializzo una matrice con il comando
int mat1[3][4] = { 23,15, 3,25,3,12,66,78,16,21,12,45 };
visto che per memorizzare un intero servono 4byte , in memoria ram vengono prese 48 celle contigue dove le prime 4 servono per memorizzare il primo valore, le successive 4 per memorizzare il secondo valore , le successive 4 per memorizzare il terzo valore etc, se la prima cella ha indirizzo 1000 il primo valore si trova all'indirizzo 1000 e occupa 4 byte , il valore successivo si trova all'indirizzo 1004 e occupa 4 byte, il terzo a 1008 e occupa 4 byte, in generale l'elemento di riga i e colonna j si trova nella posizione 1000+ (i*dimcolonne+j)*numerobytenecessaripermemorizzarequeltipodidati
Vediamo come inserire i valori in una matrice e poi stamparla per righe , \t è un carattere di escape e serve per inserire una tabulazione dopo ogni cifra per garantire l'allineamento dei numeri nelle rispettive colonne
Inserimento e stampa dati in una matrice
[modifica]int main(int argc, char** argv)
{int nr=5,nc=3;
int i,j;
int mat[nr][nc];
//Inserimento dati in una matrice
for(i=0;i<nr;i++)
for(j=0;j<nc;j++)
{cout<<"Inserisci l'elemento di riga "<<i<<" e di colonna "<<j<<endl;
cin>>mat[i][j];
}
//Stampa dati di una matrice
for(i=0;i<nr;i++)
{for(j=0;j<nc;j++)
cout<<mat[i][j]<<"\t";
cout<<endl;
}
return 0;
}
Array
[modifica]I vettori e le matrici non sono che casi particolari degli array, strutture dati indicizzate con uno o più indici, se voglio memorizzare la temperatura di una stanza posso utilizzare un array tridimensionale dove gli indici assumono il significato delle coordinate spaziali x,y,z , se voglio memorizzare un filmato posso pensarlo come a tante immagini bidimensionali x,y al variare del tempo t , anche in questo caso utilizzo un array con 3 dimensioni x,y,t se voglio memorizzare informazioni spaziali al variare del tempo (campo magnetico la cui intensità è variabile nel tempo e che viene misurato in un certo spazio) possiamo usare un array quadridimensionale con indici x,y,z,t .Per dichiarare un array quadridimensionale per analogia con i vettori e le matrici posso usare un comando del tipo
int magnetismo[3][12][23][45] ;
poi per fissare il campomagnetico al valore 5 nel punto spaziale x=2, y=3, z=4 nell'istante temporale t=20 uso un comando del tipo
magnetismo[2][3][4][20]=5
NB il c non controlla se gli indici che utilizzate per accedere all'elemento dell'array sono validi cioè se rispettano le dimensioni massime di ciascun indice, quindi se sbagliate spesso andate a sovrascrivere delle celle che non appartengono al vostro array con conseguenze spesso nefaste del tipo "il programma è stato terminato perché ha tentato di scrivere su un blocco di memoria di cui non aveva i permessi", la caratteristica di poter scrivere oltre le dimensioni consentite è usato per azione di hackeraggio.