Teorie: Tablouri Bidimensionale (Matrice)
Matrice: declarare, parcurgere prin linii și coloane. Diagonala principală și secundară.
Tablouri Bidimensionale (Matrice)
Un tablou bidimensional (sau matrice) este o structură de date care poate fi privită ca un tabel cu linii și coloane. Practic, este un "vector de vectori". Orice element dintr-o matrice este identificat unic prin doi indici: primul pentru linia pe care se află, și al doilea pentru coloană.
1. Declararea și coordonatele
Declararea unei matrice
Specificăm tipul de date, numele și două perechi de paranteze drepte: [Linii][Coloane].
int a[50][50]; // 50 linii, 50 coloane
float m[10][20]; // 10 linii, 20 coloaneAccesarea unui element
Pentru a folosi elementul de pe linia i și coloana j, scriem a[i][j].
a[0][0] = 5; // Elementul din colțul stânga-sus
cout << a[2][3]; // Linia 2, Coloana 3Reprezentarea vizuală (Indexare de la 0)
Asemănător vectorilor, în C++, atât liniile cât și coloanele sunt numerotate începând de la indexul 0. O matrice a[3][4] va avea liniile 0, 1, 2 și coloanele 0, 1, 2, 3.
| a[L][C] | Col 0 | Col 1 | Col 2 | Col 3 |
|---|---|---|---|---|
| Linia 0 | a[0][0] | a[0][1] | a[0][2] | a[0][3] |
| Linia 1 | a[1][0] | a[1][1] | a[1][2] | a[1][3] |
| Linia 2 | a[2][0] | a[2][1] | a[2][2] | a[2][3] |
2. Parcurgerea unei matrice
Pentru a parcurge toate elementele unei matrice, avem nevoie de două structuri repetitive imbricate (un for în interiorul altui for). Primul `for` fixează linia, iar al doilea `for` "mătură" toate coloanele de pe acea linie.
Citirea matricei (n linii, m coloane)
int n, m, a[50][50];
cin >> n >> m;
// Parcurgem liniile
for (int i = 0; i < n; i++) {
// Parcurgem coloanele pe linia i
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}Afișarea matricei
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
// Trecem la rând nou la finalul fiecărei linii!
cout << endl;
}3. Matrice Pătratice și Diagonale
O matrice este pătratică atunci când numărul de linii este egal cu numărul de coloane (n == m). Într-o astfel de matrice apar două concepte esențiale la examen: Diagonala Principală și Diagonala Secundară.
Diagonala Principală
Formată din elementele din colțul stânga-sus spre dreapta-jos. Condiția matematică pentru un element de pe diagonala principală este:
Exemplu elemente: a[0][0], a[1][1], a[2][2]...
Diagonala Secundară
Formată din elementele din colțul dreapta-sus spre stânga-jos. Condiția matematică (dacă indexăm de la 0 la n-1) este:
Exemplu pt n=3: a[0][2], a[1][1], a[2][0]
Atenție! Dacă obișnuiți să indexați matricele de la 1 la n, formula pentru diagonala secundară devine: i + j == n + 1. Ambele variante sunt acceptate la Bacalaureat, dar fiți consistenți.
4. Exemple de probleme clasice
Exemplul 1: Suma totală a elementelor
Pentru a afla suma tuturor elementelor, folosim o variabilă suma (inițializată cu 0) și adunăm fiecare element în timpul parcurgerii complete.
int sumaTotala = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
sumaTotala = sumaTotala + a[i][j];
}
}
cout << "Suma tuturor elementelor: " << sumaTotala;Exemplul 2: Suma elementelor pe fiecare rând (linie)
Pentru a calcula suma pe fiecare rând, resetăm variabila sumaLinie la 0 la începutul fiecărei linii (imediat după primul for).
for (int i = 0; i < n; i++) {
// Resetăm suma la 0 pentru noua linie
int sumaLinie = 0;
for (int j = 0; j < m; j++) {
sumaLinie = sumaLinie + a[i][j];
}
// Afișăm suma după ce am terminat de adunat toate elementele de pe linia i
cout << "Suma pe linia " << i << " este: " << sumaLinie << endl;
}Capcane frecvente la Bacalaureat
- Declarare Inversată: Nu confundați liniile cu coloanele. Mereu primul grup
[]se referă la linie, și al doilea[]la coloană.a[linie][coloana]. - For-uri cu același contor: Asigurați-vă că folosiți variabile de contor diferite (ex:
ișij) pentru cele două bucle for imbricate. Folosirea lui `i` în ambele va distruge complet programul. - Limitări de memorie: Spre deosebire de vectori, o matrice crește exponențial. O matrice `int a[1000][1000]` are un milion de elemente (aprox 4 MB de RAM). O matrice `int a[10000][10000]` probabil va duce la eroare de memorie "Size of array is too large".