14
Matrici come array di puntatori a righe Una rappresentazione che risolve il problema di passare array multidimensionali a funzioni

Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

  • Upload
    lethien

  • View
    246

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Matrici come array dipuntatori a righe

Una rappresentazione che risolve il problema dipassare array multidimensionali a funzioni

Page 2: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Problema :funzione persommare matrici m per n

void somma_mat(int a[][M], int b[][M], unsigned n ){ int i, j; for (i=0; i<n; i++) for (j=0; j<M; j++) a[i][j]+= b[i][j]; }

void new_mat(int a[][M], unsigned n ) { int i,j;for (i=0; i<n; i++) for (j=0; j<M;j++) scanf("%d",&(a[i][j]));}}

#include <stdio.h> #define M 2#define N 3

Page 3: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

void stampa(int a[][M], unsigned n ) {

int i,j;for (i=0; i<n; i++) for (j=0; j<M;j++) printf("%d ",a[i][j]); printf("\n"); }}}

int main (void){int a[N][M];int b[N][M];new_mat(a,N);new_mat(b,N);somma_mat(a,b, N);stampa(a,N);

}

Page 4: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice n per m

A[0][0] A[0][1] A[0][m-1]

A[1][0] A[1][1] A[1][m-1]

A[n-1][0] A[n-1][1] A[n-1][m-1]

Page 5: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Cosa vogliamo poter fare

/* somma di matrici */

void somma_mat(double** a, double ** b, unsigned n,unsigned m ) {

int i, j;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

a[i][j]+= b[i][j];

}

Page 6: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice 4 per 3

A[0][0] A[0][1]

A[1][0] A[1][1]

A

A000

A004

A008

A00C

A[0][2]

A[1][2]

A[2][0] A[2][1] A[2][2]

A[3][0] A[3][1] A[3][2]

AB00 AB04 AB08

BB10 BB14 BB18

1B00 1B04 1B08

AB0C AB10 AB14

Page 7: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice 4 per 3

A[0][0] A[0][1]

A[1][0] A[1][1]

A

A000

A004

A008

A00C

A[0][2]

A[1][2]

A[2][0] A[2][1] A[2][2]

A[3][0] A[3][1] A[3][2]

AB00 AB04 AB08

BB10 BB14 BB18

1B00 1B04 1B08

AB0C AB10 AB14

Il nome della matriceÈ il puntatore Adouble **

L'accesso a un elemento avviene correttamentecon l' usuale operatore[...][...]

Page 8: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice 4 per 3

A[0][0] A[0][1]

A[1][0] A[1][1]

A

A000

A004

A008

A00C

A[0][2]

A[1][2]

A[2][0] A[2][1] A[2][2]

A[3][0] A[3][1] A[3][2]

AB00 AB04 AB08

BB10 BB14 BB18

1B00 1B04 1B08

AB0C AB10 AB14

Esempio di accesso

A[2][2]

(A[2])[2]

Page 9: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice 4 per 3

A[0][0] A[0][1]

A[1][0] A[1][1]

A

A000

A004

A008

A00C

A[0][2]

A[1][2]

A[2][0] A[2][1] A[2][2]

A[3][0] A[3][1] A[3][2]

AB00 AB04 AB08

BB10 BB14 BB18

1B00 1B04 1B08

AB0C AB10 AB14

Esempio di accesso

A[2][2]

(A[2])[2]

(*(A + 2))[2]

Page 10: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: matrice 4 per 3

A[0][0] A[0][1]

A[1][0] A[1][1]

A

A000

A004

A008

A00C

A[0][2]

A[1][2]

A[2][0] A[2][1] A[2][2]

A[3][0] A[3][1] A[3][2]

AB00 AB04 AB08

BB10 BB14 BB18

1B00 1B04 1B08

AB0C AB10 AB14

Esempio di accesso

A[2][2]

(A[2])[2]

(*(A + 2))[2]

*(1B00 + 2)

Page 11: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: allocazione

/* creazione di una matrice (nXm) */

void new_mat(int ***a, unsigned n, unsigned m ) {

int i,j;

*a=malloc(n*sizeof(int * ));

for (i=0; i<n; i++)

{(*a)[i]=malloc(m*sizeof(int));

for (j=0; j<m;j++)

{ printf("immetti intero\n");

scanf("%d",((*a)[i])+j);}

}

Page 12: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: deallocazione

/* deallocazione di una matrice */

void free_mat(int*** a, unsigned n ) {

int i;

for (i=0; i<n; i++)

free((*a)[i]);

free(*a);

*a=NULL;

}

Page 13: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

Esempio: somma di matrici

void somma_mat(int** a, int ** b, unsigned n, unsigned m ){ int i, j; for (i=0; i<n; i++) for (j=0; j<m; j++) a[i][j]+= b[i][j]; }

void new_mat(int *** a, unsigned n, unsigned m ) { int i,j;

*a=malloc(n*sizeof(int * ));for (i=0; i<n; i++) {(*a)[i]=malloc(m*sizeof(int)); for (j=0; j<m;j++) { printf("immetti intero\n"); scanf("%d",((*a)[i])+j);}}}

Page 14: Matrici come array di puntatori a righe - unipi.itdidawiki.di.unipi.it/lib/exe/fetch.php/fisica/informatica/201516/... · Matrici come array di puntatori a righe Una rappresentazione

void stampa(int ** a, unsigned n, unsigned m ) { int i,j; for (i=0; i<n; i++) {for (j=0; j<m;j++) printf("%d ",a[i][j]); printf("\n");}}

void free_mat(int*** a, unsigned n ) { int i; for (i=0; i<n; i++)

free((*a)[i]); free(*a);*a=NULL;

}

int main (void){int ** a;int ** b;new_mat(&a,N,M);new_mat(&b, N,M);somma_mat(a,b,N,M);stampa(a,N,M);free_mat(&a ,N);if (a==NULL) printf(“Lista vuota”);}