C. Gaibisso Programmazione di Programmazione di Calcolatori Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1
C. Gaibisso Programmazione di Programmazione di CalcolatoriCalcolatori
Lezione XVIILe matrici
Programmazione di Calcolatori: le matrici 1
C. Gaibisso
MatriciMatrici
Programmazione di Calcolatori: le matrici 2
• Matrice (bidimensionale) di n x m elementi:definisce una corrispondenza biunivoca tra un insieme omogeneo di n x m elementi e l’insieme di coppie di interi {(0,0), (0,1), …., (n-1, m-1)}
• Esempio:
Matricedi 5 x 2 interi(0,0)(1,0)(2,0)(3,0)(4,0)
(0,1)(1,1)(2,1)(3,1)(4,1)
4-112-94
8
1547
7
C. Gaibisso Allocazione dinamica di una Allocazione dinamica di una matricematrice
Programmazione di Calcolatori: le matrici 3
tipoMat **nomeMat
• Modifiche allo stato della memoria:
nrorighe*sizeof(tipoMa
t *)
nrocol*sizeof(tipoM
at)
nrocol*sizeof(tipoMa
t)
nrorighe
C. Gaibisso
Definizione di una matriceDefinizione di una matrice
Programmazione di Calcolatori: le matrici 4
• Assumiamo:sizeof(int) = 4sizeof (int *) = 2
• Allocazione dinamica di una matrice con 2 righe e 3 colonne:
int **MatInt
int **
4
4 3*4
4
4
4 3*4
4int
int
int
int
int
int
int *
int *
2
2
C. Gaibisso
Definizione di una matriceDefinizione di una matrice
Programmazione di Calcolatori: le matrici 5
• Allocazione dinamica di una matrice con 2 righe e 3 colonne:
int **MatInt
1468
2
2
2840
2840
2842
4
4
4int
int
int8010
8010
8014
8018
4
4
4int
int
int
34763476
3480
3484
C. Gaibisso Accesso agli elementi di una Accesso agli elementi di una matricematrice
Programmazione di Calcolatori: le matrici 6
• Indirizzo:
nomeMat
nomeMat+1 *(nomeMat+1)*(nomeMat+1)+1
*(nomeMat+1)+nroco
l-1
*nomeMat*nomeMat+1
*nomeMat+nrocol-1
*(nomeMat+ nrorighe-1)*(nomeMat + nrorighe-1)+1
*(nomeMat+ nrorighe –
1)+nrocol-1
tipoMat **nomeMat
nomeMat+ nrorighe – 1
C. Gaibisso Accesso agli elementi di una Accesso agli elementi di una matricematrice
Programmazione di Calcolatori: le matrici 7
• Contenuto:
*(*(nomeMat+1) )*(*(nomeMat+1)+1)
*(*(nomeMat+1)+nroco
l-1)
*(*nomeMat
)*(*nomeMat+1)
*(*nomeMat+nrocol-1)
*(*(nomeMat+ nrorighe-1) )*(*(nomeMat + nrorighe-1)+1)
*(*(nomeMat+ nrorighe –
1)+nrocol-1)
nomeMat
nomeMat+1
tipoMat **nomeMat
nomeMat+ nrorighe – 1
C. Gaibisso Accesso agli elementi di una Accesso agli elementi di una matricematrice
Programmazione di Calcolatori: le matrici 8
• Nome:
nomeMat [indiceriga][indicecol]
0 espressione a valore intero nrorighe-1
0 espressione a valore intero nrocol-1
*(*(nomeMat + indiceriga)+indicecol)
0 espressione a valore intero nrorighe-1
0 espressione a valore intero nrocol-1
• Indirizzo:
C. Gaibisso Allocazione dinamica di una Allocazione dinamica di una matricematrice
Programmazione di Calcolatori: le matrici 9
tipoMat **nomeMat
• Modifiche allo stato della memoria:
nrorighe*sizeof(tipoMat*)
nrocol*sizeof(tipo
Mat)
nrocol*sizeof(tipoM
at)
nrorighe
// definisce la// variabile di// accesso alla// matricetipoMat **nomeMat;
// inizializza tale variabile con l'indirizzo// di un vettore di indirizzi di variabili intere// di dimensione pari al numero delle righenomeMat = (tipoMat **) malloc(nrorighe*sizeof(tipoMat *))
// inizializza ogni elemento del vettore con// l'indirizzo di accesso ad un vettore di variabili// intere di dimensione pari al numero delle// colonnefor(riga=0; riga < nrorighe; riga++)
nomeMat[riga] = (tipoMat *)
malloc(nrocol*sizeof(tipoMat));
C. Gaibisso
Rilascio della memoriaRilascio della memoria
Programmazione di Calcolatori: le matrici 10
• Modifiche allo stato della memoria:
tipoMat **nomeMat
nrorighe*sizeof(*tipoMat)
nrocol*sizeof(tipo
Mat)
nrocol*sizeof(tipoM
at)
nrorighe
// rilascia la memoria allocata per// le variabili di accesso alle righe della matricefree(nomeMat);
// rilascia la memoria allocata per le righe della// matricefor(riga=0; riga < nrorighe; riga++)
free(nomeMat[riga]);
C. Gaibisso
Le Matrici e le funzioniLe Matrici e le funzioni
Programmazione di Calcolatori: le matrici 11
• Le matrici come parametri formali:
tipofun nomefun (…, tipoMat ** nomeMat, …)
{ … };
• Le matrici come parametri attuali:
nomefun (…, nomeMat, …)
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 12
// sorgente: Lezione_XVII\DinMatIO.c// illustra le modalità di allocazione dinamica, di acquisizione e di// restituzione, e di rilascio della memoria per una matrice di interi// inclusione del file di intestazione della libreria standard// che contiene definizioni di macro, costanti e dichiarazioni// di funzioni e tipi funzionali alle varie operazioni di I/O#include <stdio.h>// inclusione del file di intestazione della libreria standard// che contiene definizioni di macro, costanti e dichiarazioni// di funzioni di interesse generale#include <stdlib.h>
Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 13
Continua …// funzione per il recupero della memoria allocata per una matrice di // righe x colonne interivoid FreeMatInt(int **Mat, size_t righe)
{ // definisce una variabile per l'indice di riga size_t riga;// rilascia la memoria allocata per ognuna delle righe
della matricefor(riga=0; riga< righe; riga++)
free(Mat[riga]);// rilascia la memoria allocata per le variabili di
accesso alle righe// della matricefree(Mat);};
Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 14
Continua …
// funzione per l'allocazione di una matrice di righe x colonne interiint **AllMatInt(size_t righe, size_t colonne)
{// definisce una variabile per l'indirizzo di accesso alla
matrice e una// per l’indice di rigaint** Mat;size_t riga;// inizializza la variabile di accesso alla matrice con
l'indirizzo di // un vettore di riferimenti a variabili intere di dimensione
pari al // numero delle righeMat = (int **)malloc(righe*sizeof(int *)); // verifica l'esito della inizializzazione, e se negativo
terminaif (Mat == NULL)
return(NULL);Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 15
Continua …// inizializza ogni elemento del vettore con l'indirizzo di
un vettore // di variabili intere di dimensione pari al numero delle
colonnefor(riga=0; riga< righe; riga++)
{Mat[riga] = (int *)malloc(colonne*sizeof(int));// verifica l'esito della inizializzazione, e se negativo
rilascia tutta la// memoria allocata fino a quel momento e terminaif (Mat[riga] == NULL)
{FreeMatInt(Mat, riga-1);return(NULL);};
};// restituisce l'indirizzo di accesso alla matricereturn(Mat);};
Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 16
Continua …// funzione per l'acquisizione del contenuto di una matricevoid AcqMatInt(int **Mat, size_t dim_righe, size_t dim_col)
{// definizione delle variabili per l'indice di riga e
quello di colonnasize_t riga, col;// scandisce le righe della matricefor (riga = 0; riga < dim_righe; riga = riga+1)
// scandisce le colonne della matricefor (col = 0; col < dim_col; col = col+1)
{// acquisisce l'elemento della matriceprintf("\nMat[%d][%d]: ", riga, col);scanf("%d", &(Mat[riga][col]));};
};Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 17
Continua …// funzione per la restituzione del contenuto di una matricevoid ResMatInt(int **Mat, size_t dim_righe, size_t dim_col)
{// definizione delle variabili per l'indice di riga e
quello di colonnasize_t riga, col;// scandisce le righe della matricefor (riga = 0; riga < dim_righe; riga = riga+1)
// scandisce le righe della matricefor (col = 0; col < dim_col; col = col+1)
// visualizza l'elemento printf("\nMat[%d][%d]: %d", riga, col, Mat[riga]
[col]);};
Continua …
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 18
Continua …// chiamanteint main ()
{// definisce le variabile per l'indirizzo di accesso alla
matrice// e per il numero di righe e di colonneint** Matrice;size_t nro_righe, nro_col;
// acquisisce il numero delle righe e delle colonne della matrice
printf("Nro righe? "); scanf("%d", &nro_righe);printf("Nro colonne? "); scanf("%d", &nro_col);// alloca memoria per la matrice e ne assegna l'indirizzo
alla variabile // prepostaMatrice = AllMatInt(nro_righe, nro_col);// verifica l'esito dell'allocazione, se negativo terminaif (Matrice == NULL)
{printf("\nAllocazione di memoria fallita"); return(0); };
// acquisisce, e successivamente restituisce, il contenuto della matrice
AcqMatInt(Matrice, nro_righe, nro_col);ResMatInt(Matrice, nro_righe, nro_col);// rilascia la memoria allocata per la matriceFreeMatInt(Matrice, nro_righe);return(1);};
C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente
Programmazione di Calcolatori: le matrici 19
• Compilazione:
• Esecuzione: