260 likes | 363 Views
Programmazione di Calcolatori. Lezione XVIII Le matrici. Matrici. 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)}. 8. (0,1). (0,0). 4. Esempio:. 7.
E N D
Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici
Matrici • 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)} 8 (0,1) (0,0) 4 • Esempio: 7 -1 (1,1) (1,0) 15 (2,1) (2,0) 12 4 (3,1) (3,0) -9 7 (4,1) (4,0) 4 Matricedi 5 x 2 interi Programmazione di Calcolatori: le matrici
Definizione di una matrice Espressioni costante intere • Definizione: tipoMat nomeMat [nrorighe] [nrocol] • Modifiche allo stato della memoria: tipoMat**nomeMat nrocol*sizeof(tipoMat) nrorighe nrorighe*sizeof(tipoMat *) nrocol*sizeof(tipoMat) Programmazione di Calcolatori: le matrici
Definizione di una matrice • Assumiamo: • sizeof(int) = 4 • sizeof (int *) = 2 • Definizione della matrice: • int MatInt[2][3]; • Effetto: 4 int 4 int 3*4 4 int 2 int * int ** 2 int * int **MatInt 4 int 4 int 3*4 4 int Programmazione di Calcolatori: le matrici
Definizione di una matrice • Assumiamo: • sizeof(int) = 4 • sizeof (int *) = 2 • Definizione della matrice: • int MatInt[2][3]; • Effetto: 4 int 8010 4 int 8014 4 int 8018 2 8010 2840 2842 2 3476 4 int 3476 2840 1468 4 int 3480 int **MatInt 4 int 3484 Programmazione di Calcolatori: le matrici
Accesso agli elementi di una matrice • Indirizzo: tipoMat**nomeMat *nomeMat *nomeMat+1 *nomeMat+nrocol-1 nomeMat nomeMat+1 *(nomeMat+1) *(nomeMat+1)+1 *(nomeMat+1)+nrocol-1 nomeMat+ nrorighe – 1 *(nomeMat+ nrorighe-1) *(nomeMat + nrorighe-1)+1 *(nomeMat+ nrorighe – 1)+nrocol-1 Programmazione di Calcolatori: le matrici
Accesso agli elementi di una matrice • Contenuto: tipoMat**nomeMat *(*nomeMat) *(*nomeMat+1) *(*nomeMat+nrocol-1) nomeMat nomeMat+1 *(*(nomeMat+1) ) *(*(nomeMat+1)+1) *(*(nomeMat+1)+nrocol-1) nomeMat+ nrorighe – 1 *(*(nomeMat+ nrorighe-1) ) *(*(nomeMat + nrorighe-1)+1) *(*(nomeMat+ nrorighe – 1)+nrocol-1) Programmazione di Calcolatori: le matrici
Accesso agli elementi di una matrice 0 espressione a valore intero nrorighe-1 0 espressione a valore intero nrocol-1 0 espressione a valore intero nrorighe-1 0 espressione a valore intero nrocol-1 • Nome: nomeMat [indiceriga][indicecol] • Indirizzo: *(*(nomeMat + indiceriga)+indicecol) Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente // sorgente: Lezione_XVIII\StatMatIOInd.c // illustra le modalità di acquisizione e restituzione di una matrice // definita staticamente tramite l’indirizzo dei suoi elementi // 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> // chiamante int main () { // definisce una matrice di interi di dimensione 2x3 int Mat[2][3]; // definisce due variabili per l'indice di riga e l'indice di colonna size_t riga, col; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente Continua … // acquisisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) { // acquisisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: ", riga, col); scanf("%d", *(Mat + riga)+col); }; // restituisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) // restituisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: %d", riga, col, *(*(Mat + riga)+col)); return(0); } Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente // sorgente: Lezione_XVIII\StatMatIONome.c // illustra le modalità di acquisizione e restituzione di una matrice // definita staticamente tramite il nome dei suoi elementi // 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 // chiamante int main () { // definisce una matrice di interi di dimensione 2x3 int Mat[2][3]; // definisce due variabili per l'indice di riga e l'indice di colonna size_t riga, col; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente Continua … // acquisisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) { // acquisisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: ", riga, col); scanf("%d", &Mat[riga][col]); }; // restituisce il contenuto della matrice // scandisce le righe della matrice for (riga = 0; riga < 2; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < 3; col = col+1) // restituisce l'elemento di posizione (riga, col) printf("\nMat[%d][%d]: %d", riga, col, Mat[riga][col]); return(0); } Programmazione di Calcolatori: le matrici
I/O di matrici definite staticamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici
Allocazione statica di matrici • Problemi: • - non riesco a gestire situazioni nelle quali la dimensione della matrice è nota a run-time • non riesco a gestire situazioni nelle quali la dimensione della matrice varia a run-time • Soluzione: • riprodurre le modifiche allo stato della memoria “innescate” dalla definizione statica di una matrice attraverso le funzioni di allocazione dinamica rese disponibili dal C Programmazione di Calcolatori: le matrici
Allocazione dinamica di una matrice • Modifiche allo stato della memoria: // inizializza ogni elemento del vettore con // l'indirizzo di accesso ad un vettore di variabili // intere di dimensione pari al numero delle // colonne for(riga=0; riga < nrorighe; riga++) nomeMat[riga] = (tipoMat *) malloc(nrocol*sizeof(tipoMat)); // definisce la // variabile di // accesso alla // matrice tipoMat**nomeMat; tipoMat**nomeMat nrocol*sizeof(tipoMat) nrorighe nrocol*sizeof(tipoMat) nrorighe*sizeof(tipoMat*) // inizializza tale variabile con l'indirizzo // di un vettore di indirizzi di variabili intere // di dimensione pari al numero delle righe nomeMat = (tipoMat **) malloc(nrorighe*sizeof(tipoMat*)) Programmazione di Calcolatori: le matrici
Rilascio della memoria • Modifiche allo stato della memoria: // rilascia la memoria allocata per le righe della // matrice for(riga=0; riga < nrorighe; riga++) free(nomeMat[riga]); tipoMat**nomeMat nrocol*sizeof(tipoMat) nrorighe*sizeof(*tipoMat) nrorighe nrocol*sizeof(tipoMat) // rilascia la memoria allocata per // le variabili di accesso alle righe della matrice free(nomeMat); Programmazione di Calcolatori: le matrici
Le Matrici e le funzioni • Le matrici come parametri formali: • tipofunnomefun (…, tipoMat ** nomeMat, …) • { … }; • Le matrici come parametri attuali: • nomefun (…, nomeMat, …) Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente // sorgente: Lezione_XVIII\DinMatIONome.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 … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // funzione per il recupero della memoria allocata per una matrice di // righe x colonne interi void 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 matrice for(riga=0; riga< righe; riga++) free(Mat[riga]); // rilascia la memoria allocata per le variabili di accesso alle righe // della matrice free(Mat); }; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // funzione per l'allocazione di una matrice di righe x colonne interi int **AllMatInt(size_t righe, size_t colonne) { // definisce una variabile per l'indirizzo di accesso alla matrice e una // per l’indice di riga int** 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 righe Mat = (int **)malloc(righe*sizeof(int *)); // verifica l'esito della inizializzazione, e se negativo termina if (Mat == NULL) return(NULL); Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // inizializza ogni elemento del vettore con l'indirizzo di un vettore // di variabili intere di dimensione pari al numero delle colonne for(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 termina if (Mat[riga] == NULL) { FreeMatInt(Mat, riga-1); return(NULL); }; }; // restituisce l'indirizzo di accesso alla matrice return(Mat); }; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // funzione per l'acquisizione del contenuto di una matrice void AcqMatInt(int **Mat, size_t dim_righe, size_t dim_col) { // definizione delle variabili per l'indice di riga e quello di colonna size_t riga, col; // scandisce le righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scandisce le colonne della matrice for (col = 0; col < dim_col; col = col+1) { // acquisisce l'elemento della matrice printf("\nMat[%d][%d]: ", riga, col); scanf("%d", &(Mat[riga][col])); }; }; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // funzione per la restituzione del contenuto di una matrice void ResMatInt(int **Mat, size_t dim_righe, size_t dim_col) { // definizione delle variabili per l'indice di riga e quello di colonna size_t riga, col; // scandisce le righe della matrice for (riga = 0; riga < dim_righe; riga = riga+1) // scandisce le righe della matrice for (col = 0; col < dim_col; col = col+1) // visualizza l'elemento printf("\nMat[%d][%d]: %d", riga, col, Mat[riga][col]); }; Continua … Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente Continua … // chiamante int main () { // definisce le variabile per l'indirizzo di accesso alla matrice // e per il numero di righe e di colonne int** 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 // preposta Matrice = AllMatInt(nro_righe, nro_col); // verifica l'esito dell'allocazione, se negativo termina if (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 matrice FreeMatInt(Matrice, nro_righe); return(1); }; Programmazione di Calcolatori: le matrici
I/O di matrici definite dinamicamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici