C. Gaibisso
Programmazione di Calcolatori
Lezione XVII
Le matrici
Programmazione di Calcolatori: le matrici
1
C. Gaibisso
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)}
• Esempio:
Matricedi 5 x 2 interi
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
8
7
15
4
7
4
-1
12
-9
4
Programmazione di Calcolatori: le matrici
(0,1)
(1,1)
(2,1)
(3,1)
(4,1)
2
C. Gaibisso
Allocazione dinamica di una matrice
• Modifiche allo stato della memoria:
tipoMat **nomeMat
nrorighe*sizeof(tipoMat *)
nrocol*sizeof(tipoMat)
nrorighe
nrocol*sizeof(tipoMat)
Programmazione di Calcolatori: le matrici
3
C. Gaibisso
Definizione di una matrice
• Assumiamo:
sizeof(int) = 4
sizeof (int *) = 2
• Allocazione dinamica di una matrice con 2
righe e 3 colonne:
int
4
int *
int **
int **MatInt
2
2
3*4
int *
3*4
int
4
int
4
int
4
int
4
int
4
Programmazione di Calcolatori: le matrici
4
C. Gaibisso
Definizione di una matrice
• Allocazione dinamica di una matrice
con 2 righe e 3 colonne:
1468
8010
int
4
8014
int
4
8018
int
4
3476
int
4
2840
3480
int
4
int **MatInt
3484
int
4
2840
8010
2
2842
3476
2
Programmazione di Calcolatori: le matrici
5
C. Gaibisso
Accesso agli elementi di una matrice
• Indirizzo:
tipoMat **nomeMat
nomeMat
nomeMat+1
nomeMat+ nrorighe – 1
*nomeMat
*nomeMat+1
*nomeMat+nrocol-1
*(nomeMat+1)
*(nomeMat+1)+1
*(nomeMat+1)+nrocol-1
*(nomeMat+ nrorighe-1)
*(nomeMat + nrorighe-1)+1
*(nomeMat+ nrorighe – 1)+nrocol-1
Programmazione di Calcolatori: le matrici
6
C. Gaibisso
Accesso agli elementi di una matrice
• Contenuto:
tipoMat **nomeMat
nomeMat
nomeMat+1
nomeMat+ nrorighe – 1
*(*nomeMat)
*(*nomeMat+1)
*(*nomeMat+nrocol-1)
*(*(nomeMat+1) )
*(*(nomeMat+1)+1)
*(*(nomeMat+1)+nrocol-1)
*(*(nomeMat+ nrorighe-1) )
*(*(nomeMat + nrorighe-1)+1)
*(*(nomeMat+ nrorighe – 1)+nrocol-1)
Programmazione di Calcolatori: le matrici
7
C. Gaibisso
Accesso agli elementi di una matrice
• Nome:
0  espressione a valore intero  nrocol-1
nomeMat [indiceriga][indicecol]
0  espressione a valore intero  nrorighe-1
• Indirizzo:
0  espressione a valore intero  nrocol-1
*(*(nomeMat + indiceriga)+indicecol)
0  espressione a valore intero  nrorighe-1
Programmazione di Calcolatori: le matrici
8
C. Gaibisso
Allocazione dinamica di una matrice
• Modifiche allo stato della memoria:
// definisce la
// variabile di
// accesso alla
// matrice
tipoMat **nomeMat;
tipoMat **nomeMat
// 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));
nrocol*sizeof(tipoMat)
nrorighe*sizeof(tipoMat*)
nrorighe
nrocol*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
9
C. Gaibisso
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
10
C. Gaibisso
Le Matrici e le funzioni
• Le matrici come parametri formali:
tipofun nomefun (…, tipoMat ** nomeMat, …)
{ … };
• Le matrici come parametri attuali:
nomefun (…, nomeMat, …)
Programmazione di Calcolatori: le matrici
11
C. Gaibisso
I/O di matrici definite dinamicamente
// 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 …
Programmazione di Calcolatori: le matrici
12
C. Gaibisso
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
13
C. Gaibisso
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
14
C. Gaibisso
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
15
C. Gaibisso
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
16
C. Gaibisso
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
17
C. Gaibisso
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
18
C. Gaibisso
I/O di matrici definite dinamicamente
• Compilazione:
• Esecuzione:
Programmazione di Calcolatori: le matrici
19
Scarica

(*(nome Mat +1) )