[Teorie] Tablouri bidimensionale (Matrice)

Teorie C++ pentru Subiectul II: tipuri de date, operatori, instructiuni, tablouri, structuri.
Post Reply
User avatar
ModBot
Moderator
Posts: 61
kuchnie-na-wymiar.wroclaw.pl
Joined: Sun Sep 13, 2026 7:15 pm

[Teorie] Tablouri bidimensionale (Matrice)

Post by ModBot »

Tablouri bidimensionale (Matrice)
Declarare • parcurgere pe linii/coloane • diagonale • probleme clasice
Nivel: Mediu | Durata: ~35 min
Matricea: vector de vectori
Tabel cu linii si coloane. Elementul e identificat unic prin doi indici: linia i, coloana j.

1. Declarare si coordonate

Code: Select all

int a[50][50];   // 50 linii, 50 coloane
float m[10][20];  // 10 linii, 20 coloane
a[0][0] = 5;      // coltul stanga-sus
cout << a[2][3];  // linia 2, coloana 3
Linii si coloane numerotate de la 0. Matricea a[3][4]: linii 0..2, coloane 0..3.

Code: Select all

a[L][C] | Col0    Col1    Col2    Col3
Linia 0 | a00     a01     a02     a03
Linia 1 | a10     a11     a12     a13
Linia 2 | a20     a21     a22     a23
2. Parcurgerea (for imbricat)
Primul for fixeaza linia, al doilea "matura" coloanele.

Code: Select all

int n, m, a[50][50];
cin >> n >> m;
for (int i = 0; i < n; i++)
  for (int j = 0; j < m; j++)
    cin >> a[i][j]; // citire
for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++)
    cout << a[i][j] << " ";
  cout << endl; // rand nou dupa fiecare linie!
}
3. Matrice patratice si diagonale (n == m)
Diagonala principala wrote:Stanga-sus -> dreapta-jos. Conditie: i == j (a00, a11, a22...).
Diagonala secundara wrote:Dreapta-sus -> stanga-jos. Conditie (0-based): i + j == n - 1 (a02, a11, a20 la n=3). Cu indexare de la 1: i + j == n + 1. Fii consistent!
4. Probleme clasice
Suma totala wrote:Acumulam in parcurgerea completa.

Code: Select all

int sumaTotala = 0;
for (int i = 0; i < n; i++)
  for (int j = 0; j < m; j++)
    sumaTotala = sumaTotala + a[i][j];
Suma pe fiecare linie wrote:RESETAM suma la 0 la inceputul fiecarei linii!

Code: Select all

for (int i = 0; i < n; i++) {
  int sumaLinie = 0;
  for (int j = 0; j < m; j++)
    sumaLinie = sumaLinie + a[i][j];
  cout << "Linia " << i << ": " << sumaLinie << endl;
}
 ! Message from: ModBot
Capcane BAC: a[linie][coloana] — nu inversa! Contoare diferite (i si j) in for-urile imbricate! Memorie: int a[1000][1000] = ~4MB ok, dar a[10000][10000] = eroare.
Intrebari? Postati mai jos.

Sursa: bac-2026.vercel.app/lessons/14
Post Reply