1 / 18

Corso di Algoritmi e Strutture Dati

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.

sharne
Download Presentation

Corso di Algoritmi e Strutture Dati

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Matrici

  2. 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

  3. Matrici in C

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

  5. 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; }

  6. 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

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

  8. 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

  9. 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; }

  10. 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

  11. 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; }

  12. 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

  13. 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; }

  14. 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)

  15. 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)

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

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

  18. Corso di Calcolatori Elettronici APPUNTI SUL LINGUAGGIO C Array e puntatori FINE

More Related