1 / 26

Programmazione di Calcolatori

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.

Download Presentation

Programmazione di Calcolatori

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. I/O di matrici definite staticamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici

  12. 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

  13. 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

  14. I/O di matrici definite staticamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. I/O di matrici definite dinamicamente • Compilazione: • Esecuzione: Programmazione di Calcolatori: le matrici

More Related