Declararea tablourilor bidimensionale (matrice) face în C/C++ similar cu a tablourilor unidimensionale, dar trebuie precizate două dimensiuni fizice, maximale: numărul maxim de linii și numărul maxim de coloane ale matricei:
tipDeBază denumire[NumarLinii][NumarColoane];
de exemplu:
int A[5][10];
Mai sus s-a declarat un tablou bidimensional (o matrice) cu 5
linii și 10
coloane. Ni-l putem imagina astfel (valorile sunt aleatorii):
Matricea are:
5 • 10 = 50
de elemente;5
linii, indexate (numerotate) de la0
la4
– mai jos sunt evidențiate liniile cu indici1
și3
;10
coloane, indexate de la0
la9
– mai jos sunt evidențiate coloanele cu indici0
,4
și9
;
Referirea elementelor se face prin intermediul operatorului C++ de indexare []
, la fel ca în cazul vectorilor, dar trebuie precizați doi indici – cel de linie și cel de coloană. Astfel, A[2][4]
reprezintă elementul matricei aflat pe linia 2
și pe coloana 4
– la intersecția dintre linia 2
și coloana 4
. Astfel primul indice al unui element este cel de linie, iar al doilea indice este cel de coloană.
Exemple:
Observație: Cade în sarcina programatorului (adică tu!) să se asigure că valorile indicilor folosiți în expresiile de indexare fac parte din intervalul corect, conform declarării tabloului. Dacă valorile indicilor nu sunt corecte, comportamentul programului este impredictibil: rezultatele obținute vor fi eronate sau se vor produce erori la execuția programului. Aceste erori la execuție sunt de regulă semnalate pe pbinfo cu mesajul Caught fatal signal 11.
De exemplu, pentru matricea de mai sus, expresiile A[-1][7]
, A[2][20]
, A[7][7]
, A[7][30]
sunt greșite. Rezultatele (efectele) sunt impredictibile.
Legătura dintre matrice și tablourile unidimensionale în C/C++
Ne putem gândi la un tablou bidimensional în două moduri:
A
este o matrice;A
are linii și coloane.A[1][9]
este elementul aflat pe linia1
și coloana9
;
sau:
A
este un vector; elementele luiA
sunt vectori;A[1]
este un vector – reprezintă o linie din matriceaA
;A[1][9]
este un element al vectoruluiA[1]
, de tipint
Câtă memorie ocupă un tablou bidimensional?
După cum ați observat deja, toate problemele de pe pbinfo și toate problemele date în concursuri au precizate o serie de restricții, printre care limita maximă de memorie care poate fi folosită. Apare firesc întrebarea: cât de mare poate fi o matrice sau, mai degrabă, câtă memorie ocupă o matrice?
Răspunsul diferă în funcție de doi factori:
- tipul elementelor matricei;
- dimensiunile precizate la declarare;
De exemplu, pentru următoarea declarare:
int A[1000][1000];
matricea A
are 1000 * 1000 = 1000000
de elemente de tip int
. O dată de tip int
se reprezintă pe (ocupă) 4B
, deci matricea A
va ocupa 4 * 1000 * 1000 B = 4.000.000B
, adică ceva mai puțin de 4MB
.