1. Ce este o matrice?
i = linia si j = coloana. Indexarea incepe de la 0 in Python si C++.
col 0 col 1 col 2 linia 0: 1 2 3 linia 1: 4 5 6 linia 2: 7 8 9 a[0][0]=1 a[0][1]=2 a[0][2]=3 a[1][0]=4 a[1][1]=5 a[1][2]=6 a[2][0]=7 a[2][1]=8 a[2][2]=9
- Dimensiuni: o matrice cu n linii si m coloane se noteaza n×m si are n*m elemente.
- Matrice patratica: n = m (numar egal de linii si coloane).
- Diagonala principala: elementele a[i][i] cu i=0..n-1, de sus-stanga la jos-dreapta.
- Diagonala secundara: elementele a[i][n-1-i], de sus-dreapta la jos-stanga.
2. Declarare si initializare in Python
# Declarare si initializare matrice 3x3 matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print("Matrice 3x3:") for i in range(3): for j in range(3): print(matrice[i][j], end=" ") print()
Matrice 3x3: 1 2 3 4 5 6 7 8 9
# Matrice nxm cu toate elementele 0 n, m = 3, 4 # CORECT: list comprehension - fiecare linie e un obiect distinct matrice = [[0] * m for _ in range(n)] # ATENTIE: [[0]*m]*n este GRESIT - toate liniile sunt acelasi obiect
Operatorul * pe o lista copiaza referinte, nu obiecte noi. Daca modifici a[0][1], se modifica si a[1][1], a[2][1] etc. — pentru ca toate liniile indica acelasi obiect. List comprehension [[0]*m for _ in range(n)] creeaza linii complet independente.
3. Parcurgere pe linii
i), iar bucla interioara itereaza coloanele (j). Elementele sunt vizitate in ordine: linia 0 de la stanga la dreapta, apoi linia 1, etc.
# Parcurgere pe linii si calculul sumei fiecarei linii matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print("Suma pe fiecare linie:") for i in range(3): suma_linie = 0 for j in range(3): suma_linie += matrice[i][j] print(f" Linia {i}: suma = {suma_linie}")
Suma pe fiecare linie: Linia 0: suma = 6 Linia 1: suma = 15 Linia 2: suma = 24
Bucla exterioara face n iteratii, bucla interioara face m iteratii. Total: n*m operatii elementare. Complexitate: O(n*m). Pentru o matrice patratica n×n: O(n²).
4. Parcurgere pe coloane
j), iar bucla interioara itereaza liniile (i). Elementele sunt vizitate de sus in jos pe coloana 0, apoi pe coloana 1, etc.
# Parcurgere pe coloane si calculul maximului fiecarei coloane matrice = [ [3, 7, 2], [8, 1, 9], [4, 6, 5] ] print("Maximul pe fiecare coloana:") for j in range(3): maxim_col = matrice[0][j] for i in range(1, 3): if matrice[i][j] > maxim_col: maxim_col = matrice[i][j] print(f" Coloana {j}: maxim = {maxim_col}")
Maximul pe fiecare coloana: Coloana 0: maxim = 8 Coloana 1: maxim = 7 Coloana 2: maxim = 9
- Initializam
maxim_col = matrice[0][0] = 3 - i=1:
matrice[1][0] = 8 > 3→maxim_col = 8 - i=2:
matrice[2][0] = 4 < 8→ nu se modifica - Rezultat coloana 0:
maxim = 8
5. Matrice nepatratica si afisare formatata
# Matrice 3x4 generata prin formula, afisata aliniat n, m = 3, 4 matrice = [[i * m + j + 1 for j in range(m)] for i in range(n)] print(f"Matrice {n}x{m}:") for i in range(n): for j in range(m): print(f"{matrice[i][j]:4}", end="") print() print(f"Total elemente: {n * m}")
Matrice 3x4: 1 2 3 4 5 6 7 8 9 10 11 12 Total elemente: 12
f"{x:4}":Specificatorul :4 rezerva 4 caractere pentru valoare, cu aliniere la dreapta. Numerele de 1 sau 2 cifre sunt precedate de spatii, astfel coloanele se aliniaza vizual.
6. Tablouri 2D in C++ EXCLUSIV INTENSIV
In C++, tabloul bidimensional se declara cu tipul explicit si dimensiunile cunoscute la compilare. Sintaxa: tip_element nume[NR_LINII][NR_COLOANE];. Se recomanda constante const int in loc de literale numerice directe.
#include <iostream> using namespace std; int main() { // Declarare matrice 3x3 cu initializare explicita int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; cout << "Matrice 3x3:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << a[i][j] << " "; } cout << endl; } return 0; }
Matrice 3x3: 1 2 3 4 5 6 7 8 9
Parcurgere pe coloane cu maxim per coloana — aceeasi logica ca in Python, cu sintaxa C++:
#include <iostream> using namespace std; int main() { const int N = 3, M = 3; int a[N][M] = {{3,7,2},{8,1,9},{4,6,5}}; cout << "Maximul pe fiecare coloana:" << endl; for (int j = 0; j < M; j++) { int maxim = a[0][j]; for (int i = 1; i < N; i++) if (a[i][j] > maxim) maxim = a[i][j]; cout << " Coloana " << j << ": maxim = " << maxim << endl; } return 0; }
Maximul pe fiecare coloana: Coloana 0: maxim = 8 Coloana 1: maxim = 7 Coloana 2: maxim = 9
- Tipul elementelor (
int) se declara explicit la fiecare variabila. - Dimensiunile trebuie cunoscute la compilare (constante, nu variabile calculate la runtime).
- Nu exista capcana "referinte la acelasi obiect" — tabloul C++ aloca memorie continua in mod direct.
- Fiecare instructiune se termina obligatoriu cu
;.