Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 18.Array bidimensionali


Matrici (array bidimensionali)

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)

  • Esempi:

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

Matrici (array bidimensionali) (segue)

Le matrici possono essere rappresentate per comodità in formato tabellare


Matrici (array bidimensionali) (segue)

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


Matrici (array bidimensionali) (segue)

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.

Matrici (array bidimensionali) (segue)

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


Matrici (array bidimensionali) (segue)

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


Matrici (array bidimensionali) (segue)

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)


Matrici (array bidimensionali) (segue)

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

Matrici come argomenti di funzioni (segue)

Passaggio di un array monodimensionale ad una funzione


Matrici come argomenti di funzioni (segue)

Passaggio di un array bidimensionale ad una funzione


Matrici come argomenti di funzioni (segue)

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.


Matrici come argomenti di funzioni (segue)

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.

Matrici come argomenti di funzioni (segue)

Passaggio di un array bidimensionale ad una funzione


Matrici come argomenti di funzioni (segue)

Passaggio di un array multidimensionale ad una funzione


Matrici come argomenti di funzioni (segue)

Scriviamo una libreria per matrici che implementi le funzioni:


Libreria per Matrici


Libreria per Matrici (segue)


Libreria per Matrici (segue)

esercizio18.1.cpp


Esempio

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.

Esempio (segue)

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

I materiali di supporto della lezione

silvia-rossi-4306-18-esercizio18.1.cpp.zip

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion