Matrici e Array (superiori)

lezione
lezione
Matrici e Array (superiori)
Tipo di risorsa Tipo: lezione
Materia di appartenenza Materia: Informatica (istituti tecnici) per le superiori
Avanzamento Avanzamento: lezione completa al 100%

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;
}

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.