C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le...

19
C. Gaibisso Programmazione di Programmazione di Calcolatori Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1

Transcript of C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le...

Page 1: C. Gaibisso Programmazione di 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

Page 2: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le 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

Page 3: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 4: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 5: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 6: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 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

Page 8: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 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:

Page 9: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 10: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 11: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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, …)

Page 12: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 13: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 14: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 15: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 16: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 17: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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 …

Page 18: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

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

Page 19: C. Gaibisso Programmazione di Calcolatori Lezione XVII Le matrici Programmazione di Calcolatori: le matrici 1.

C. Gaibisso I/O di matrici definite I/O di matrici definite dinamicamentedinamicamente

Programmazione di Calcolatori: le matrici 19

• Compilazione:

• Esecuzione: