Un array bidimensionale, anche detto matrice, è una variabile strutturata tale che:
gli elementi sono tutti dello stesso tipo e
il meccanismo di accesso (diretto) ai suoi elementi consiste di due espressioni intere (indici)
int
C[4][3];
float
f[M][N];
char
b[2][3]={{‘a’, ‘b’, ‘c’},{‘d’, ‘e’, ‘f’}} int A[ ][3]= { 1,2,3,4,5,6,7,8,9 };
Le matrici possono essere rappresentate per comodità in formato tabellare
Ogni elemento viene scritto utilizzando due coppie di parentesi quadre: la prima coppia di parentesi contiene l’indice della riga, la seconda coppia l’indice della colonna. Se inseriamo nella matrice C dei valori interi otteniamo la seguente rappresentazione
In questo caso abbiamo, per esempio
Esempio.
Una classe composta da 32 studenti ha sostenuto durante l’anno 5 compiti in classe. Supponiamo di voler scrivere un programma che calcoli la media dei voti ottenuti dagli studenti .
Si potrebbe allora dichiarare una matrice del tipo: int A[32][5] in cui inserire i voti riportati da ciascun studente in ciascun compito. Siccome però in una classe ci potrebbero essere più studenti o i compiti potrebbero essere di più, conviene adoperare per maggior generalità la seguente dichiarazione:
int const R=40; int const C=8; int A[R][C]; int n=32, m=5.
Esempio: una classe di 32 studenti ha sostenuto durante l’anno 5 compiti in classe. Supponiamo di voler scrivere un programma che stampi per ogni studente la somma e la media dei voti ottenuti
Esempio: una classe di 32 studenti ha sostenuto durante l’anno 5 compiti in classe. Supponiamo di voler scrivere un programma che stampi per ogni studente la somma e la media dei voti ottenuti
Tenendo presente l’ultimo esempio, scrivere un algoritmo che stampi il numero d’ordine di ogni studente con accanto il numero di esami superato e la loro media.
Descrizione algoritmo.
Per ogni riga i che rappresenta uno studente
Scandire le colonne relative alla riga i e sommare e contare ogni esame il cui risultato è >0
Stampa(i, conta, media)
Nel passaggio di un array monodimensionale ad una function è necessario indicare soltanto il nome seguito dalle due parentesi quadre, perché passando alla function l’indirizzo del primo elemento essa è in grado di determinare l’indirizzo di ogni elemento successivo.
Naturalmente un altro parametro deve rappresentare il numero di elementi effettivamente presenti nell’array
Sia assegnato una matrice A di interi di dimensioni massime 4×5 (il primo numero, 4, indica le righe, il secondo, 5, le colonne); essa sarà dichiarata come
int A[4][5]
il compilatore allocherà per tale array uno spazio rappresentato dalla seguente tabella:
Supponiamo che, durante l’esecuzione, vengano riempite soltanto le prime tre righe e le prime due colonne.
Se a questo punto si volesse utilizzare una procedura esempio che abbia come parametro la matrice A la chiamata sarebbe esempio(A,3,2) per indicare alla procedura che solo le prime tre righe e le prime due colonne sono significative.
Tuttavia la intestazione della function non potrebbe essere:
void esempio (int A[ ] [ ], int n, int m);
Infatti poiché con A[ ][ ] s’intende l’indirizzo del primo elemento A[0][0], la function comincerà ad eseguire i calcoli sulla prima riga; per determinare l’indirizzo della seconda riga non è sufficiente conoscere il numero logico di colonne, che è 2, ma occorre anche saperne il numero fisico che invece è 5;
per andare sulla seconda riga il compilatore deve saltare 5 locazioni di memoria e non 3!
Solo in questo modo è in grado di determinare l’indirizzo iniziale di ogni riga successiva alla prima.
Per questa ragione la chiamata di una matrice deve includere anche il massimo numero di colonne; la function esempio dovrà avere la seguente intestazione:
void esempio (int A[ ] [5], int n, int m);
Se un array possiede più di due dimensioni, può essere richiamato da una function soltanto nel caso in cui vengono assegnate tutte le dimensioni massime esclusa la prima.
Scriviamo una libreria per matrici che implementi le funzioni:
Assegnata una matrice di A dimensioni MxN stampare le somme totali di ogni riga.
Per gestire una matrice abbiamo sempre la necessità di utilizzare due cicli nidificati, uno che scorre le righe ed un altro le colonne:
for (i=0; i
for (j=0; j
poiché dobbiamo determinare la somma degli elementi di una riga qualsiasi dobbiamo scrivere
somma_ somma +A[i][j]
in cui i deve rimanere costante e j deve variare; l’istruzione precedente deve allora essere inserita nel secondo for, mentre subito dopo il primo for dobbiamo inizializzare la variabile somma.
In definitiva l’algoritmo che risolve il problema è il seguente:
for (i=0; i<M ; i++)
somma=0;
for (j=0; j<N ; j++)
somma ← somma + A[i][j];
stampa(i ,somma);
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string