Sunteți pe pagina 1din 7

Algoritmi si structuri de date (22.11.

2012) Informatic, Matematic, anul 1

ASD_C07

Algoritmi elementari folosind matrice


R1. Enunul problemei: Pentru o matrice ptratic dat s se determine suma elementelor de pe diagonala principal i suma elementelor de pe diagonala secundar. Metoda de rezolvare: O matrice ptratic are forma ... ... ... a1n a11 a 22 ... a 2, n 1 ... ... A = ... ... ... ... ... ... a n 1,2 ... a n 1, n 1 ... ... ... ... a nn a n1 Suma elementelor de pe diagonala principal este S1 =
i =1

aii , iar suma elementelor de pe


i =1

diagonala principal (suma indicilor este constanta n+1) este S2 = de calculat sume.

ai, n +1 i . Aadar, avem

Descrierea algoritmului n pseudocod: citete n,a11,,ann S1 0 *suma elem. de pe diag. principala, initial 0 S2 0 *suma elem. de pe diag. secundara, initial 0 pentru i=1,n repeta S1 S1 + aii S2 S2 + ai,n+1-i scrie S1, S2 Descrierea algoritmului n pseudocod C++:
#include <iostream.h> int n,i,j; float a[10][10], S1, S2; //sumele sunt initializate automat cu 0 void main() { cout<<endl<<"Dati dimeniunea matricei: "; cin>>n; /* for (i=1;i<=n;i++) for (j=1;j<=n;j++){ cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; } */ cout<<"Dati elementele matricei:"<<endl; for (i=1;i<=n;i++) for (j=1;j<=n;j++) cin>>a[i][j]; for (i=1;i<=n;i++) //parcurgem ambele diag. simultan { S1 += a[i][i]; S2 += a[i][n+1-i]; } cout<<"Suma elem de pe diag principala: "<<S1; cout<<endl<<"Suma elem de pe diag secundara: "<<S2; }

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

sau n cazul lucrului cu poziiile 0:


#include <iostream.h> int n,i,j; float a[10][10],S1,S2; //sumele sunt initializate automat cu 0 void main() { cout<<endl<<"Dati dimeniunea matricei: "; cin>>n; /*for (i=0;i<n;i++) for (j=0;j<n;j++){ cout<<"a["<<i+1<<"]["<<j+1<<"]="; cin>>a[i][j]; } */ cout<<"Dati elementele matricei:"<<endl; for (i=0;i<n;i++) for (j=0;j<n;j++) cin>>a[i][j]; for (i=0;i<n;i++) { S1 += a[i][i]; //diag princ: a[0][0],,a[n-1][n-1] S2 += a[i][n-1-i]; //suma indicilor de pe diag sec: a[0][n-1],,a[n-1][0] //este n-1 de data aceasta } cout<<"Suma elem de pe diag principala: "<<S1; cout<<endl<<"Suma elem de pe diag secundara: "<<S2; getch(); }

Rulare: Dati dimeniunea Dati elementele 1 1 1 1 2 2 1 1 0 1 2 1 0 1 1 2 Suma elem de pe Suma elem de pe matricei: 4 <Enter> matricei:

diag principala: 7 diag secundara: 3

R2. Enunul problemei: Verificai dac o matrice ptratic este superior triunghiular. Metoda de rezolvare: O matrice este superior triunghiular dac aij = 0, pentru j < i (adic toate elementele de sub diagonala principal sunt nule i elementele eseniale sunt pe i deasupra diagonalei principale). Un exemplu de matrice superior triunghiular este 1 2 3 4 A = 0 5 6 7 . 0 0 8 9 0 0 0 10

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

n general, o matrice superior triunghiular are forma a11 a12 a13 ... a1i ... a1n 0 a 22 a23 ... a 2i ... a 2 n 0 0 a33 ... a3i ... a3n A = ... ... ... ... ... ... ... . ... 0 0 aii ... ain 0 ... ... ... ... ... ... ... ... ... ... 0 ... a nn 0 adic aij = 0, pentru orice i = 2...n i j=1,..., i-1. Descrierea algoritmului n pseudocod: citete n,a11,,ann OK adevarat *pp ca matricea este superior tiunghiulara pentru i = 2,n repeta *parcurgem sub diagonala principala pentru j = 1,i-1 repeta *ca sa vedem daca sunt doar zerouri daca aij 0 atunci OK fals *nu este matrice superior triunghiulara break daca OK = adevarat atunci *valoarea finala a var. OK scrie Este matrice superior triunghiulara altfel scrie Nu este matrice superior triunghiulara Descrierea algoritmului n pseudocod C++: #include <iostream.h> int n,i,j,OK; float a[10][10]; void main() { cout<<endl<<"Dati dimeniunea matricei: "; cin>>n; /* for (i=1;i<=n;i++) for (j=1;j<=n;j++){ cout<<"a["<<i<<"]["<<j<<"]="; cin>>a[i][j]; } */ // sau cout<<"Dati elementele matricei:"<<endl; for (i=1;i<=n;i++) for (j=1;j<=n;j++) cin>>a[i][j]; OK = 1; //pp. ca matricea este superior triunghiulara for (i=2;i<=n;i++) //parcurg elem de sub diag principala for (j=1;j<i;j++) if (a[i][j]) { OK = 0; //if (a[i][j]!=0) break; // iese din for-ul dupa j //si i = n+1; pt a se iesi si din for-ul dupa i } if (OK) //sau if (OK==1) cout<<"Matricea data este superior triunghiulara"; else cout<<"Matricea data nu este superior triunghiulara"; } sau folosind si poziiile 0 pe linii i coloane i funcii: 3

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

#include <iostream.h> void Citire(float a[10][10], int &n) { cout<<endl<<"Dati dimeniunea matricei: "; cin>>n; cout<<"Dati elementele matricei:"<<endl; for (int i=0;i<n;i++) for (int j=0;j<n;j++) cin>>a[i][j]; } int EsteSuperiorTriunghiulara(float a[10][10], int n){ for (int i=1;i<n;i++) //parcurg elem de sub diag principala for (int j=0;j<i-1;j++) //indicii fiind decalati cu -1 if (a[i][j]) //fata de pseudocod return 0; return 1; } void main() { int n,i,j,OK; float a[10][10]; Citire(a,n); if (EsteSuperiorTriunghiulara(a,n)) cout<<"Matricea data este superior triunghiulara"; else cout<<"Matricea data nu este superior triunghiulara"; }

Rulare:
Dati dimeniunea matricei: 4 <Enter> Dati elementele matricei: 1 1 1 0 0 2 1 1 0 0 3 1 0 0 0 5 Matricea data este superior triunghiulara

sau
Dati dimeniunea matricei: 4 <Enter> Dati elementele matricei: 1 1 1 1 0 2 1 0 2 0 3 1 0 1 0 5 Matricea data nu este superior triunghiulara

R3. Enunul problemei: S se determine transpusa unei matrice dat. Metoda de rezolvare: Pentru matricea A = (aij)i=1,2,, m, j=1,2,, n, matricea transpus este B = At =(bij)i=1, 2,, n, j = 1, 2,, m, cu bji = aij, pentru i=1, 2,, m, j = 1, 2,, n. Aadar, se pot parcurge elementele matricei A (i =1, , m, j = 1, , n) i elementul aij se copiaz n B pe poziia ji. Altfel, pentru calculul fiecrui element din B, bij , i=1, 2,, n, j = 1, 2,, m, se calculeaz ca fiind aji. n continuare se merge pe prima variant. Descrierea algoritmului n pseudocod:
citete m,n,a11,,amn *citim intai dim. matricei, apoi elem pentru i = 1,m,1 repeta pentru j = 1,n,1 repeta *parcurgem elem matriei a bji aij *elem de pe lin i, col j din a vine pe linia j col i in b scrie (bij) pentru i=1,2,,n, j=1,2,,m

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

Descrierea algoritmului n C++:


#include <iostream.h> int m,n,i,j; float a[10][10],b[10][10]; void main(){ cout<<endl<<"Dati numarul de linii: "; cin>>m; cout<<"Dati numarul de coloane: "; cin>>n; cout<<"Dati elementele matricei:"<<endl; for (i=1;i<=m;i++) for (j=1;j<=n;j++) cin>>a[i][j]; // determinarea transpusei for (i=1;i<=m;i++) //parcurg elementele matricei a for (j=1;j<=n;j++) b[j][i]=a[i][j]; // afisarea transpusei cout<<"Matricea transpusa este:"<<endl; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) cout<<b[i][j]<<" "; //elem liniei i cout<<endl; //se trece pe radul urmator } }

sau, folosind funcii:


#include <iostream.h> int m,n,i,j; float a[10][10],b[10][10]; void Citire(float a[10][10], int &m, int &n) { //citirea dimensiunilor unei matrice si a elementelor sale cout<<"Dati numarul de linii: "; cin>>m; cout<<"Dati numarul de coloane: "; cin>>n; cout<<"Dati elementele matricei:"<<endl; for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) cin>>a[i][j]; } void Afisare(float a[10][10], int m, int n) { //afisarea elementelor unei matr cu m linii si n col for (int i=1;i<=m;i++) { for (int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } } void Transpusa(float a[10][10],int m,int n,float b[10][10]) { // determinarea transpusei unei matrice de dim. m*n for (i=1;i<=m;i++) for (j=1;j<=n;j++) b[j][i]=a[i][j]; } void main() { Citire(a,m,n); Transpusa(a,m,n,b); // afisarea transpusei cout<<endl<<"Matricea transpusa este:"<<endl; Afisare(b,n,m); //matr b are n linii si m col }

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

R4 (suplimentar). Enunul problemei: S se determine puterea p a matricei ptratice A. Metoda de rezolvare: Considerm matricea ptratic A =(aij)i=1,2,, n, j=1,2,, n. A2 = A A A3 = A2 A . Ap = Ap-1A (i este tot matrice ptratic nn). Atunci vom proveda astfel: BA k = 2,,p C BA BC Aadar la baz st nmulirea dintre dou matrice. n general, pentru o matrice A =(aij)i=1,2,, m,
j=1,2,, n

i B = (bij)i=1,2,, n,

j=1,2,, p,

produsul acestora este matricea C = AB, cu cij =

aik bkj ,
k =1

pentru i=1,2,, m, j=1,2,, p) Descrierea algoritmului n C++:


#include <stdio.h> int n,p; float a[10][10],b[10][10]; void Citire(float a[10][10], int &m, int &n) //citirea dimensiunilor unei matrice si a elementelor sale { cout<<"Dati numarul de linii: "; cin>>m; cout<<"Dati numarul de coloane: "; cin>>n; cout<<"Dati elementele matricei:"<<endl; for (i=1;i<=m;i++) for (j=1;j<=n;j++) cin>>a[i][j]; } void Afisare(float a[10][10], int m, int n) { for (i=1;i<=n;i++) { for (j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<endl; } } void Inmultire(float a[10][10],float b[10][10],int n, float c[10][10]) // C = A*B, matrice patratice n*n { int i,j,k; for (i=1;i<=n;i++) for (j=1;j<=n;j++) { c[i][j]=0; for (k=1;k<=n;k++) c[i][j]+=a[i][k]*b[k][j]; } }

Algoritmi si structuri de date (22.11.2012) Informatic, Matematic, anul 1

ASD_C07

void RidicarePutere(float a[10][10],int n,int p, float b[10][10]) { //A^p float c[10][10]; int i,j,k; for (i=1;i<=n;i++) for (j=1;j<=n;j++) b[i][j] = a[i][j]; for (k=2;k<=p;k++) { Inmultire(b,a,n,c); for (i=1;i<=n;i++) for (j=1;j<=n;j++) b[i][j] = c[i][j]; } } void main() { Citire(a,n); cout<<"Dati puterea p: "; cin>>p; RidicarePutere(a,n,p,b); cout<<endl<<"Matricea initiala este: "<<endl; Afisare(a,n); cout<<endl<<"Puterea "<<p<<" a matricei initiale este:"<<endl; Afisare(b,n); }

Discutat la tabl: 1. Valoarea minim i maxim dintre valorile unei matrice. 2. Se consider m magazine i n produse i o matrice cu preul fiecrui produs la fiecare magazin. S se determine preul minim al fiecrui produs. De exemplu, se consider dou produse i 3 magazine i preurile date de matricea: 2 1 3 A= 3 4 5 Pentru a determina preul fiecrui produs, parcurgem matricea pe linii (i = 1, 2,, m) i pentru fiecare linie (produs) se determin valoarea minim de pe linia respectiv (ai1, ai2, , ain)). Tema 07 termen maxim 2 sptmni (se va transmite prin e-mail ntr-un fiier electronic sau personal pe foaie scris de mn sau listat cel trziu 7.12.2012): 1) Determinai numrul elementelor nule dintr-o matrice. 2) Determinai media aritmetic a elementelor pozitive dintr-o matrice. 3) Stabilii dac o matrice este simetric sau nu (aij = aji, pentru orice i j). Sugestie: se presupune c matricea este simetric, apoi parcurg elementele de sub diagonala principal i dac elementul curent este diferit de simetricul su atunci nu este simetric. Suplimentar: 4) persoan are de cumprat din m magazine n produse care au preuri diferite. S se descrie un algoritm (n pseudocod sau C/C++) pentru a indica pentru fiecare produs magazinul n care acesta are preul minim. Cunoscnd cantitile ce trebuie cumprate din fiecare produs, s se determine suma minim ce urmeaz a fi cheltuit.