programmazione di calcolatori
Post on 30-Dec-2015
52 Views
Preview:
DESCRIPTION
TRANSCRIPT
G. Amodeo,C. Gaibisso Programmazione di Programmazione di
CalcolatoriCalcolatori
Lezione XVIIILe 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
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
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
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
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
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
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:
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 …
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);}
G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite
staticamentestaticamente
Programmazione di Calcolatori: le matrici 11
• Compilazione:
• Esecuzione:
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 …
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);}
G. Amodeo,C. Gaibisso I/O di matrici definite I/O di matrici definite
staticamentestaticamente
Programmazione di Calcolatori: le matrici 14
• Compilazione:
• Esecuzione:
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
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));
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]);
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, …)
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 …
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 …
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 …
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 …
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 …
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 …
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);};
top related