G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di...

26
G. Amodeo, C. Gaibisso Programmazione di Programmazione di Calcolatori Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1

Transcript of G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di...

Page 1: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso Programmazione di Programmazione di

CalcolatoriCalcolatori

Lezione XVIIILe matrici

Programmazione di Calcolatori: le matrici 1

Page 2: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,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

Page 3: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso

Definizione di una matriceDefinizione di una matrice

Programmazione di Calcolatori: le matrici 3

tipoMat **nomeMat

• Definizione:tipoMat nomeMat [nrorighe]

[nrocol]• Modifiche allo stato della memoria:

nrorighe*sizeof(tipoMa

t *)

Espressioni costante intere

nrocol*sizeof(tipoM

at)

nrocol*sizeof(tipoMa

t)

nrorighe

Page 4: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso

Definizione di una matriceDefinizione di una matrice

Programmazione di Calcolatori: le matrici 4

• Assumiamo:sizeof(int) = 4sizeof (int *) = 2

• Definizione della matrice:int MatInt[2][3];

• Effetto:

int **MatInt

int **

4

4 3*4

4

4

4 3*4

4int

int

int

int

int

int

int *

int *

2

2

Page 5: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso

Definizione di una matriceDefinizione di una matrice

Programmazione di Calcolatori: le matrici 5

• Assumiamo:sizeof(int) = 4sizeof (int *) = 2

• Definizione della matrice:int MatInt[2][3];

• Effetto:

int **MatInt

1468

2

2

2840

2840

2842

4

4

4int

int

int8010

8010

8014

8018

4

4

4int

int

int

34763476

3480

3484

Page 6: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,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

Page 7: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,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

Page 8: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,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:

Page 9: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 9

// 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>// chiamanteint main ()

{// definisce una matrice di interi di dimensione 2x3int Mat[2][3];// definisce due variabili per l'indice di riga e l'indice

di colonnasize_t riga, col;

Continua …

Page 10: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 10

Continua …// acquisisce il contenuto della matrice// scandisce le righe della matricefor (riga = 0; riga < 2; riga = riga+1)

// scandisce le colonne della matricefor (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 matricefor (riga = 0; riga < 2; riga = riga+1)

// scandisce le colonne della matricefor (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);}

Page 11: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 11

• Compilazione:

• Esecuzione:

Page 12: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 12

// 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 // chiamanteint main ()

{// definisce una matrice di interi di dimensione 2x3int Mat[2][3];// definisce due variabili per l'indice di riga e l'indice

di colonnasize_t riga, col;

Continua …

Page 13: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 13

Continua …// acquisisce il contenuto della matrice// scandisce le righe della matricefor (riga = 0; riga < 2; riga = riga+1)

// scandisce le colonne della matricefor (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 matricefor (riga = 0; riga < 2; riga = riga+1)

// scandisce le colonne della matricefor (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);}

Page 14: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

staticamentestaticamente

Programmazione di Calcolatori: le matrici 14

• Compilazione:

• Esecuzione:

Page 15: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso Allocazione statica di Allocazione statica di

matricimatrici

Programmazione di Calcolatori: le matrici 15

• 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

Page 16: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso Allocazione dinamica di una Allocazione dinamica di una

matricematrice

Programmazione di Calcolatori: le matrici 16

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

Page 17: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso

Rilascio della memoriaRilascio della memoria

Programmazione di Calcolatori: le matrici 17

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

Page 18: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso

Le Matrici e le funzioniLe Matrici e le funzioni

Programmazione di Calcolatori: le matrici 18

• Le matrici come parametri formali:

tipofun nomefun (…, tipoMat ** nomeMat, …)

{ … };

• Le matrici come parametri attuali:

nomefun (…, nomeMat, …)

Page 19: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 19

// 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 …

Page 20: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 20

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 …

Page 21: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 21

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 …

Page 22: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 22

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 …

Page 23: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 23

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 …

Page 24: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 24

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 …

Page 25: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 25

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

Page 26: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XVIII Le matrici Programmazione di Calcolatori: le matrici 1.

G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite

dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 26

• Compilazione:

• Esecuzione: