Teoriechevron_rightTablouri Bidimensionale (Matrice)

Teorie: Tablouri Bidimensionale (Matrice)

Matrice: declarare, parcurgere prin linii și coloane. Diagonala principală și secundară.

Nivel: Mediuschedule 35 min

grid_onTablouri 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ă.

apps1. 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 coloane

Accesarea 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 3

Reprezentarea 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 0Col 1Col 2Col 3
Linia 0a[0][0]a[0][1]a[0][2]a[0][3]
Linia 1a[1][0]a[1][1]a[1][2]a[1][3]
Linia 2a[2][0]a[2][1]a[2][2]a[2][3]

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

square3. 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:

i == j

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:

i + j == n - 1

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.

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

warningCapcane 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 și j) 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".
syncSe încarcă statusul...