Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Matrici Matrici • Sono array bidimensionali • Una matrice M ha due campi – Numero di righe: rows[M] – Numero di colonne: columns[M] • Ogni elemento nella matrice M[i,j] ha un indice di riga i e colonna j Matrici in C Matrici in C Allochiamo in modo dinamico una matrice: scriviamo un metodo “leggi” che allochi in memoria una matrice di interi M di n righe e m colonne (input) e la riempi facendosi passare gli elementi da tastiera. int** M; int i,j; M = (int**)calloc(n,sizeof(int*)); for (i=0; i<n; i++) M[i] = (int*)calloc(m,sizeof(int)); Matrici in C Allochiamo in modo dinamico una matrice: scriviamo un metodo “leggi” che allochi in memoria una matrice di interi M di n righe e m colonne (input) e la riempi facendosi passare gli elementi da tastiera. int** leggi(int n, int m){ int** M; int i,j; M = (int**)calloc(n,sizeof(int*)); for (i=0; i<n; i++) M[i] = (int*)calloc(m,sizeof(int)); for (i=0; i<n; i++) for (j=0; j<m; j++) scanf("%d",&M[i][j]); return M; } Trasposta di una matrice Data una matrice M[n x m], la sua trasposta T[m x n] è ottenuta scambiando le righe con le colonne di M. Trasposta(M) for i <- 1 to columns[M] do for j <- 1 to rows[M] do T[i,j] <- M[j,i] return T Trasposta di una matrice Data una matrice M[n x m], la sua trasposta T[m x n] è ottenuta scambiando le righe con le colonne di M. int** trasposta(int** M, int n, int m){ int** T; int i,j; T = (int**)calloc(m,sizeof(int*)); for (i=0; i<m; i++) T[i] = (int*)calloc(n,sizeof(int)); for (i=0; i<m; i++) for (j=0; j<n; j++) T[i][j] = M[j][i]; return T; } Somma di due matrici Date due matrici M1[n x m] e M2[n x m], calcolare la matrice somma M3[n x m] Somma(M1,M2) for i <- 1 to rows[M] do for j <- 1 to columns[M] do M3[i,j] <- M1[i,j] + M2[i,j] return M3 Somma di due matrici Date due matrici M1[n x m] e M2[n x m], calcolare la matrice somma M3[n x m] int** somma(int** M1, int n, int m, int** M2){ int** M3; int i,j; M3 = (int**)calloc(n,sizeof(int*)); for (i=0; i<n; i++) M3[i] = (int*)calloc(m,sizeof(int)); for (i=0; i<n; i++) for (j=0; j<m; j++) M3[i][j] = M1[i][j] + M2[i][j]; return M3; } Triangolare Superiore Data una matrice M1[n x n], calcolare la matrice S[n x n], tale per cui la matrice M2=M1-S sia triangolare superiore triangolare(M1) for i <- 1 to rows[M1] do for j <- 1 to i-1 do S[i,j] <- - M1[i,j] for i <- 1 to rows[M1] do for j <- 1 to columns[M1] do S[i,j] <- 0 return S Triangolare Superiore int** TriangSup(int** M, int n){ int** T; int i,j; T = (int**)calloc(n,sizeof(int*)); for (i=0; i<n; i++) T[i] = (int*)calloc(n,sizeof(int)); for (i=1; i<n; i++) for (j=0; j<=i-1; j++) T[i][j] = 0 - M[i][j]; for (i=0; i<n; i++) for (j=i; j<n; j++) T[i][j] = 0; return T; } Prodotto tra matrici Date due matrici M1[n x k] e M2[k x m], calcolare la matrice prodotto M3[n x m] prodotto(M1,M2) for i <- 1 to rows[M1] do for j <- 1 to columns[M2] do p <- 0 for s <- 1 to rows[M2] do p <- p + (M1[i,s] + M2[s,j]) M3[i,j] <- p return M3 Prodotto tra matrici int** Prodotto(int** M1, int n, int k, int** M2, int m){ int** T; int i,j,s,p; T = (int**)calloc(n,sizeof(int*)); for (i=0; i<n; i++) T[i] = (int*)calloc(m,sizeof(int)); for (i=0; i<n; i++) for (j=0; j<m; j++) { p = 0; for (s=0; s<k; s++) p = p + (M1[i][s] * M2[s][j]); T[i][j] = p; } return T; } Matrice rigata crescente Data una matrice M[n x m], verificare se questa è rigata crescente: la somma degli elementi di una riga i è minore o uguale della somma degli elementi della riga i+1, per ogni i crescente(M,i,somma,n,m) if (i>n) then return true else s <- SUM(M[i],m); return (s > somma) and crescente(M,i+1,s) Matrice rigata crescente Data una matrice M[n x m], verificare se questa è rigata crescente: la somma degli elementi di una riga i è minore o uguale della somma degli elementi della riga i+1, per ogni i SUM(M,m) s <- 0 for i <- 1 to m do s <- s + M[i] return s rigata(M,n,m) return crescente(M,1,SUM(M[0],m),n,m) Matrice rigata crescente Data una matrice M[n x m], verificare se questa è rigata crescente: la somma degli elementi di una riga i è minore o uguale della somma degli elementi della riga i+1, per ogni i int crescente(int** M, int i, int somma, int n, int m){ int s; if (i >= n) return 1; else { s = SUM(M[i],m); i++; return ((s > somma) && crescente(M,i,s,n,m)); } } Matrice rigata crescente Data una matrice M[n x m], verificare se questa è rigata crescente: la somma degli elementi di una riga i è minore o uguale della somma degli elementi della riga i+1, per ogni i int SUM(int* M, int m){ int j,somma=0; for (j=0; j<m; j++) somma += M[j]; return somma; } int rigata(int** M, int n, int m){ return crescente(M,1,SUM(M[0],m),n,m); } Corso di Calcolatori Elettronici APPUNTI SUL LINGUAGGIO C Array e puntatori FINE