Sunteți pe pagina 1din 10

Tabloul bidimensional 

este o structură omogenă de date de același tip,


organizată pe linii și coloane.
  Diferă de cel unidimensional prin faptul că elementele sunt dispuse pe linii și
coloane (2 dimensiuni), astfel că fiecărui element îi corespunde un indice de
linie și unul de coloană.

Tabloul A are n*m elemente


Numerotarea liniilor și coloanelor se face de la 0 la n-1 ( pentru linii), respectiv
m-1 ( pentru coloane)
Declararea matricelor
Sintaxă
 Declararea unei matrice are următoare sintaxă:

<tip_dată> <nume_tablou>[<nr_linii>][<nr_coloane>];

 <tip_dată> reprezintă tipul de dată al variabilelor memorate în matrice;


 <nume_tablou> este numele cu care vom apela tabloul / elemente din el;
 <nr_linii> este numărul de linii pe care le conține;
 <nr_coloane> este numărul de coloane pe care le memorează.
Exemple de declarări:
int a[101][201],n,m;
float x[10][10];
short f[2][100];
O matrice declarată global va conține inițial 0-uri în toate pozițiile.
Declararea locală conține valori aleatorii, care pot influența prelucrarea datelor.

Apelarea elementelor
 <nume_tablou>[<linie>][<coloană>]
Pentru a ne referi la un element din matrice, vom avea în vedere ordinea
indicilor precedați de paranteze pătrate. Primul indice marchează linia pe care se
află, iar al doilea coloana.
Elementul apelat prin x[a][b] se află pe linia a și coloana b.

Declararea cu elemente predefinite


  Putem declara matrice cu valori predefinite în două metode:

1. int a[2][3] = { {1,2,3} , {4,5,6} }; - vom avea 2 perechi de câte 3


elemente (am declarat un tablou cu 2 linii și 3 coloane).
2. int a[2][3] = { 1,2,3,4,5,6 }; - se vor pune elementele în ordine, în urma
unei parcurgeri pe coloane. Dacă sunt mai puține elemente decât încap
(linii*coloane), programul va pune 0-uri pentru a acoperi elementele lipsă.
 Cele două declarări produc rezultate identice.
Citirea / Afișarea elementelor
Citirea elementelor unei matrice

Pentru a citi elementele unui tablou bidmiensional va trebui să știm numărul


liniilor și coloanelor numerelor citite.

De cele mai multe ori se va citi pe linii, câte un element în fiecare coloană de pe
linia respectivă.

int a[101][101],n,m;
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
Primul for parcurge fiecare linie, iar pentru fiecare linie se trece prin fiecare
coloană (al doilea for) pentru a avea acces la fiecare poziție în parte.
Se citește, pe rând, fiecare element, însumând un total de n*m elemente.

Afișarea elementelor unei matrice

Foarte asemănător citirii, când afișăm elementele unei matrice vom parcurge
linie cu linie, coloană cu coloană, și vom afișa fiecare element în parte.

int a[101][101],n,m;
...
for(int i=0; i<n; i++){
for(int j=0; j<m; j++)
cout<<a[i][j];<<' ';
cout<<'\n';;
}
Se folosește aceeași metodă de „nested for loops” pentru a parcurge fiecare
element și pentru a le afișa. În acest exemplu, de afișare, am considerat n ca
fiind numărul de linii, iar m numărul de coloane.
Pentru formatarea afișării, între elementele de pe aceeași linie se va găsi un
spațiu, iar la sfârșitul fiecărei linii vom afișa un rând nou, pentru a reprezenta
sugestiv liniile taboului.
Parcurgerea unei matrice în C++

Parcurgerea unei matrice poate părea un pic mai greu de înțeles. Când
vorbim de parcurgerea unei matrice, vrem să parcurgem elementele sale linie cu
linie, de sus în jos și de la stânga la dreapta — exact cum se afișează pixelii pe
un televizor:

Pentru a face acest lucru, vom folosi două structuri


repetitive for imbricate (una în alta): prima după i, iar a doua după j. Cea
din afară (după i) va parcurge, pe rând, liniile matricei, de la 0 la n - 1.
Pentru fiecare linie în parte, vom parcurge elementele de la stânga la
dreapta (de la 0 la m - 1) folosind al doilea for (care este după j).
Astfel, reușim să parcurgem toate elementele matricei cu ușurință.
Indexare de la 0
#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane

//Parcurgem matricea exact cum am explicat anterior


for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
a[i][j] = 1;
}
}
return 0;
}
Indexare de la 1
Indexarea de la 1 înseamnă să numerotăm elementele matricei de
la 1 la n și de la 1 la m, în loc să numerotăm de la 0 la n - 1 și de la 0 la m - 1.
De multe ori se preferă indexarea de la 1 (vom vedea mai târziu de ce), dar din
această cauză vom folosi indexarea de la 1 de acum înainte. Să vedem cum se
parcurge o matrice indexată de la 1:
#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane

//Parcurgem matricea exact cum am explicat anterior


for(int i = 1; i <= n; i++) { //1 - n
for(int j = 1; j <= m; j++) { //1 - m
a[i][j] = 1;
}
}
return 0;
}

Citirea și afișarea unei matrici


Citirea unui tablou bidimensional
Citirea matricei folosește parcurgerea de mai devreme pentru a lua elementele
pe rând și a le citi de la tastatură. Iată un exemplu:

cin >> n >> m; //Citim dimensiunile matricei

//Citim matricea, parcurgem cum am învățat anterior


for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> a[i][j];

Afișarea unui tablou bidimensional


Afișarea unui tablou este similară, însă după ce afișăm fiecare linie în parte,
trebuie să afișăm un endl pentru a trece la următoarea linie.
//Afișăm matricea, parcurgem cum am învățat anterior
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++)
cout << a[i][j] << " ";
cout << endl;
}
Exemplu

Iată un cod în C++ care citește de la tastatură o matrice și o afișează pe ecran:

#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane

//Citim matricea
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}

//Afișăm matricea
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cout << a[i][j] << " ";
}
cout << "\n";
}
return 0;
}
Matrici pătratice
Ce este o matrice pătratică?
O matrice pătratică este o matrice particulară, cu același număr de linii și de
coloane — adică cu n == m. Pentru simplitate, vom menționa doar n-ul,
deoarece m-ul are aceeași valoare. Matricea de acest tip are o serie de
particularități care se folosesc în anumite probleme.
Diagonala principală și diagonala secundară
Diagonala principală a unei matrice este diagonala care începe din colțul
stânga-sus și se termină în colțul dreapta-jos. Mai exact, un element a[i]
[j] aparține diagonalei principale dacă i == j.
Similar, diagonala secundară este cealaltă diagonală, care începe din
colțul dreapta-sus și se termină în cel stânga-jos. Un element a[i][j] aparține
diagonalei secundare dacă i + j == n + 1, sau cu alte cuvinte, j == n - i + 1 (unde
matricea este indexată de la 1).
În imaginea de mai jos, diagonala principală este cea roșie, diagonala secundară
este cea albastră, elementul 4 (din mijloc) aparținând ambelor diagonale.
Matricea pătratică este tabloul bidimensional cu număr egal de linii și coloane.
  O matrice cu n linii și n coloane se numește matrice de ordin n.
Diagonala principală a[i][i]

Afișarea, pentru n linii și n coloane, a:


 elementelor de pe diagonala principală: for(i=0; i<=n-1; i++) cout<<a[i]
[i]<<' ';
 elementelor de deasupra diagonalei (zona 1):
 for(i=0; i<=n-2; i++){
 for(j=i+1; j<=n-1; j++) cout<<a[i][j]<<' ';
 cout<<'\n';
 }
 // sunt afișate sub formă de piramidă
 elementelor de sub diagonală (zona 2):
 for(i=1; i<=n-1; i++){
 for(j=0; j<=i-1; j++) cout<<a[i][j]<<' ';
 cout<<'\n';
 }
 // sunt afișate sub formă de piramidă
Diagonala secundară a[i][n-1-i]

Afișarea, pentru n linii și n coloane, a:


 elementelor de pe diagonala secundară: for(i=0; i<=n-1; i++) cout<<a[i]
[n-1-i]<<' ';
 elementelor de deasupra diagonalei (zona 1):
 for(i=0; i<=n-2; i++){
 for(j=0; j<=n-2-i; j++) cout<<a[i][j]<<' ';
 cout<<'\n';
 }
 elementelor de sub diagonală (zona 2):
 for(i=1; i<=n-1; i++){
 for(j=n-i; j<=n-1; j++) cout<<a[i][j]<<' ';
 cout<<'\n';
 }

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