Sunteți pe pagina 1din 4

Tablouri bidimensionale (matrice)

3.2.1. Noţiuni teoretice

Declararea tablourilor bidimensionale


Elementele unui tablou bidimensional, din punct de vedere conceptual, sunt plasate în
spaţiu pe două direcţii. Matricea reprezintă o aplicaţie naturală a tablourilor bidimensionale.
În matematică o matrice arată astfel:
a 11 a 12 a 13 . . . a 1n
a 21 a 22 a 23 ... a 2n
A= .......................... A m n
a m1 a m2 a m3 . . . a mn

În limbajele C/C++ (indicii de linie şi de coloană pornesc de la 0):


a 00 a 01 a 02 ... a 0 ,n 1
a 10 a 11 a 12 ... a 1,n 1 A m n
Q= . . . . . . . . . . . . . . . . . . . . . . . . . . . .
a m1,0 a m1,1 a m1, 2 . . . a m 1,n 1

Declarare
tip_de_date nume_matrice[numar_linii][numar_coloane];

Exemplu:
 int a[101][10]; // declararea matricei a, cu maxim 101 linii şi 10 coloane, tip int
 double a[7][5]; // declararea matricei a, cu maxim 7 linii şi 5 coloane, tip double
Dacă se doreşte iniţializarea elementelor unei matrice în momentul declarării
acesteia, se poate proceda astfel:
 int mat[4][3] = {{11, -50, 4}, {32, 25, 1}, {-1, 10, -2}, {7, -28, 15} };
Prin această construcţie, elementele matricei mat se iniţializează în modul următor:
mat[0][0]=11, mat[0][1]=-50, mat[0][2]=4
mat[1][0]=32, mat[1][1]=25, mat[1][2]=1
mat[2][0]=-1, mat[2][1]=10, mat[2][2]=-2
mat[3][0]=7, mat[3][1]=-28, mat[3][2]=15

11 -50 4
32 25 1
-1 10 -2
7 -28 15

La declararea unei matrice şi iniţializarea elementelor sale, se poate omite numărul


maxim de linii, în schimb, datorită modului de memorare, trebuie specificat numărul maxim
de coloane:
 int mat[][3] = {{1, 1}, { -1}, {3, 2, 1}};
mat reprezintă o matrice 3  3, ale cărei elemente se iniţializează astfel:
mat[0][0]=1, mat[0][1]=1,
mat[1][0]=-1,
mat[2][0]=3, mat[2][1]=2, mat[2][2]=1
1 1
-1
3 2 1

Elementele mat[0][2], mat[1][1], mat[1][2] nu sunt inițializate. Ele au valoarea zero dacă
tabloul este global şi valori iniţiale nedefinite dacă tabloul nu e declarat global.

Citirea şi afişarea tablourilor bidimensionale (matrice)


#include <iostream.h>
void main( )
{
int a[10][10]; //declararea unei matrice a cu maxim 10 linii şi 10 coloane
int nr_lin, nr_col,i,j;
cout<<"Nr. linii:"; cin>>nr_lin; //se citeşte numărul de linii
cout<<"Nr. coloane:"; cin>>nr_col; //se citeşte numărul de coloane
//citirea elementelor unei matrice
for (i=0; i<nr_lin; i++)
for (j=0; j<nr_col; j++)
{
cout<<"a["<<i<<","<<j<<"]="; //afişarea unui mesaj prealabil citirii
cin>>a[i][j];
}
//afişarea elementelor matricei sub formă de tablou
for (i=0; i<nr_lin; i++)
{
for (j=0; j<nr_col; j++) cout<<a[i][j]<<'\t';
cout<<'\n'; // după afişarea elementelor unei linii, se trece pe linia următoare
}}

Operaţii cu matrice

 Adunarea matricelor
Se consideră o matrice cu m linii şi n coloane A cu i indicele de linie şi j indicele de coloană,
 a11 a12 ... a1n 
 
 a21 a22 ... a2 n 
unde i  1, m şi j  1, n de forma A   şi o matrice B de forma
... ... ... ... 
 
a 
 m1 am 2 ... am 3 
 b11 b12 ... b1n 
 
b b22 ... b2 n 
B   21 .
... ... ... ... 
 
b bm 2 ... bm 3 
 m1
Matricea sumă C=A+B se obţine astfel:
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
c[i][j]=a[i][j]+b[i][j];

 Înmulţirea a două matrice


Fie A o matrice cu n linii şi m coloane şi B o matrice cu m linii şi p coloane. Matricea produs
C se obţine astfel:
C[i ][ j ]   A[i][k ]  B[k ][ j ], i  {1,2,..., n}, j  {1,2,..., p}
k 1, m

Secvenţa care calculează matricea produs în C++ este:


for(i=0;i<n;i++)
for(j=0;j<p;j++)
for(k=C[i][j]=0;k<m;k++)
C[i][j]+=A[i][k]*B[k][j];

 Matricea pătratică
Un tablou de dimensiune n*n se numeşte pătratic.
Exemplu:

diagonala secundară: i+j=n+1 j=n+1-i

i=j
 a11 a12 a13 a14 a15 
 
 a21 a22 a23 a24 a25 
Fie matricea A   a31 a32 a33 a34 a35  .

 a41 a42 a43 a44 a45 
a
 51 a52 a53 a54 a55 
diagonala principală: ai , i

 afişarea elementelor de pe diagonala principală:


for(i=1;i<=n;i++) cout<<a[i][i]<<” ”;

 afişarea elementelor de pe diagonala secundară:


for(i=1;i<=n;i++) cout<<a[i][n+1-i]<<” ”;

Dacă trasăm cele două diagonale matricea poate fi împărțită în 4 zone: Nord, Est, Sud
și Vest.
Condițiile verificate de indicii elementelor din aceste zone sunt prezentate mai jos:
Nord: i<j && i+j<n-1
Est: i<j && i+j>n-1
Sud: i>j && i+j>n-1
Vest: i>j && i+j<n-1

V E

S
-afişarea elementelor din nord:
for(i=1;i<=n/2;i++)
for(j=i+1;j<=n-i;j++)
cout<<a[i][j]<<” ” ;
-afişarea elementelor din sud:
for(i=n/2+1;i<=n;i++)
for(j=n+2-i;j<=i-1;j++)
cout<<a[i][j]<<” ” ;
-afişarea elementelor din vest(acelaşi algoritm de la nord dar pe matricea transpusă):
for(i=1;i<=n/2;i++)
for(j=i+1;j<=n-i;j++)
cout<<a[j][i]<<” ” ;
-afişarea elementelor din est(acelaşi algoritm de la sud dar pe matricea transpusă):
for(i=n/2+1;i<=n;i++)
for(j=n+2-i;j<=i-1;j++)
cout<<a[j][i]<<” ” ;

S-ar putea să vă placă și