Cos’è e come si memorizza e lavora con una matrice in C++?
Le matrici per farla breve non sono altro che array bidimensionali; cosa si intende per bidimensionali?
Capiamolo con un esempio: se per immaginare un classico array possiamo aiutarci pensando a una cassettiera i cui cassetti rappresentano le celle dell’array, per una matrice possiamo pensare a un insieme di cassettiere una a fianco all’altra, in cui analogamente ogni cassetto rappresenterà una cella della matrice.
Nelll’array ogni cassetto, e fuori di metafora ogni cella, sarà individuato da una coordinata ovvero da un numero che rappresenta l’ordine in altezza del cassetto nella cassettiera o la posizione della cella nell’array; in una matrice ogni cassetto o fupr di metafora ogni cella sarà individuata da una coppia di coordinate che rappresenteranno in quale cassettiera si trova un cassetto e di quale cassetto stiamo parlando ovvero in che riga e colonna della matrice si trova la cella prescelta.
Un altro esempio per provare a comprendere il significato di matrice è la griglia di battaglia navale, ogni casella della griglia è individuata dal numero della riga e dal numero della colonna.
Cos’è una matrice
Le matrici sono array bidimensionali ovvero insiemi ordinati* di r x c variabili dello stesso tipo, dove r è il numero di righe e c il numero di colonne.
* per ordinati non si intende i cui contenuti siano ordinati!
Vedremo poi che la bellezza delel matrici , come per gli array, è che ci si potrà muovere agevolmente tra le variabili interne di un array grazie a degli indici.
Dichiarare una matrice in C++
Per dichiarare una matrice bisogna utilizzare un’istruzione formata così:
tipoVariabile nomeMatrice [numeroRighe][numeroColonne];
Dove tipoVariabile è il tipo di dato di cui si vuole costruire la matrice (può essere int, char, float, double, bool…), mentre numeroRighe e numeroColonne devono essere dei valori costanti e rappresentano come dice il nome il numero di righe e di colonne della matrice.
Ad esempio:
//dichiaro una matrice m di int con 4 righe e 5 colonne int m[4][5]
Come per gli array le celle delle righe e delle colonne si contano a partire da 0.
Per cui la matrice dell’esempio precedente avrà:
– 4 righe con i numeri di riga che andranno da 0 a 3,
– 5 colonne con i numeri di colonna che andranno da 0 a 4.
Lavorare con una cella della matrice in C++
Ogni cella della matrice funziona esattamente come una variabile, tuttavia per richiamarla bisogna usare il nome della matrice e indicare il numero di riga e di colonna della cella della matrice.
La seguente istrizione:
nomeMatrice [numeroRiga][numeroColonna] = valoreDaMemorizzare;
memorizza valoreDaMemorizzare nella cella della matrice nomeMatrice data dalle coordinate numeroRiga e numeroColonna
Ad esempio l’istruzione:
m[2][4]=10;
memorizza nella cella della matrice m con nomero di riga 2 e numero di colonna 4 il valore 10.
Bisogna porre molta attenzione ai valori degli indici di riga e di colonna in C++ perché, a differenza rispetto a quanto avviene in altri linguaggi di programmazione, non vengono visualizzati errori o eccezioni se si superano i limiti del numero di righe o di colonne di una matrice, in questi casi si va a lavorare in delle aree di memoria dove chissà cosa è memorizzato.
Lavorare con tutte le celle di una matrice in C++
Per lavorare con tutte le celle di una matrice di norma la cosa più comoda è lavorare con due cicli for annidati uno dentro l’altro: uno servirà per scorrere gli indici di riga e l’altro per gli indici di colonna (o viceversa a seconda di quanto neessario).
Il seguente estratto di codice di esempio stampa il contenuto di una matrice m, una cella alla volta procedendo per riga e all’interno di ogni riga in ordine di ccrescente di colonna.
// il codice stampa il contenuto di una matrice m // con numeroDiRighe righe e numeroDiColonne colonne // l'indice i scorre le righe for(int i=0;i<numeroDiRighe;i++) { //l'indice j scorre le colonne for(int j=0;j<numeroDiColonne;j++) { //si stampa la cella con riga i e colonna j cout<<m[i][j]<<" "; } //dopo ogni riga si va a capo cout<<endl; }
Inizializzare una matrice in C++
inizializzazione da console
Per inizializzare una matrice a dei dati inseriti dall’utente da console di norma si procede con due for annidati:
//l'indice i scorre le righe for(int i=0;i<numeroDiRighe;i++) { //l'indice j scorre le colonne for(int j=0;j<numeroDiColonne;j++) { //si memorizza il valore della cella //con riga i e colonna j di m cin>>m[i][j]; } }
Inizializzazione a zeri
Per inzializzare tutta a zero una matrice durante la dichiarazione si può usare la seguente istruzione:
int m[numeroDiRighe][numeroDiColonne]={};
che crerà una matrice m con numeroDiRighe righe e numeroDiColonne colonne con tutti zeri.
Inizializzazione a valori predefiniti
Allo stesso modo si può inizializzare una matrice a dei valori iniziali durante la dichiarazione inserendoli all’interno delle grafe divisi da virgole, questi verranno memorizzati in ordine nelle celle a partire dalla cella m[0][0] per poi passare alla cella m[0][1] fino a riempire la prima riga per poi passare alla seconda e così via, le cellenon inizializzate esplicitamente in questo caso saranno poste a zero.
Ad esempio l’estratto di codice
//si dichiara e inizializza la matrice int m[4][3]={1,2,3,4,5}; //si stampa la matrice //l'indice i scorre le righe for(int i=0;i<4;i++) { //l'indice j scorre le colonne for(int j=0;j<3;j++) { //si stampa la cella con riga i e colonna j di m cout<<m[i][j]<<" "; } //dopo ogni riga si va a capo cout<<endl; }
stamperà:
1 2 3 4 5 0 0 0 0 0 0 0
Esercizi con le matrici in C++
Se ora che hai capito come funzionano le matrici vuoi metterti alla prova vai alla pagina 20 esercizi matrici in C++ dove troverai un po’ di esercizi!