Ce vei învăța astăzi?
După această lecție vei înțelege ce este o matrice (tablou bidimensional), cum o declarăm în C++, cum o citim și cum o afișăm pe ecran.
Ce este o matrice?
Definiție: O matrice este un model conceptual mixt de organizare a datelor, format dintr-un tabel cu m linii și n coloane. Este, practic, o listă de liste: fiecare linie a matricei este o listă de valori.
Un element din matrice se notează a[i][j], unde i este numărul liniei, iar j este numărul coloanei.
Analogia: o clasă cu bănci pe rânduri
Imaginează-ți sala de clasă: elevii stau așezați pe rânduri, iar pe fiecare rând sunt mai multe bănci. Ca să găsești un elev, îi spui „rândul 3, banca 5". Exact așa funcționează matricea: dai linia și coloana.
Numărătoarea elevilor pe orizontală, dată de indicele i (indicele este numărul care arată poziția elementului în tablou)
Poziția pe rând, dată de indicele j
Elementul a[i][j] din matrice
Declararea unei matrice în C++
O matrice se declară ca un tablou bidimensional: tip nume[nr_linii][nr_coloane]. Declarăm dimensiunile maximale, apoi, în timpul rulării, citim dimensiunile reale m și n.
int a[101][101]; // matrice cu maxim 100 de linii si 100 de coloane int m, n; // dimensiunile reale ale matricei
Observă indexarea
În soluțiile de la BAC folosim adesea pozițiile de la 1 la m și de la 1 la n. Elementul de pe linia 2 și coloana 3 se accesează cu a[2][3].
a[2][3] = 7; // punem valoarea 7 pe linia 2, coloana 3
Citirea și afișarea matricei
Pentru a citi sau a afișa o matrice folosim două bucle for imbricate: bucla exterioară parcurge liniile (indicele i), iar bucla interioară parcurge coloanele (indicele j).
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Observă: la afișare, fiecare element este urmat de un spațiu, iar după terminarea fiecărei linii afișăm endl (linie nouă). Astfel matricea apare pe ecran exact ca în tabel.
Exercițiu de completare
Completează enunțul cu cuvintele potrivite:
O ______ este un model conceptual mixt de organizare a datelor, formată dintr-un tabel cu ______ și coloane. Un element se notează ______, unde i este numărul liniei, iar j este numărul ______.
Bancă de cuvinte:
Exercițiu de completare 2
Completează afirmațiile despre citirea matricei:
Pentru a citi o matrice folosim două bucle ______ imbricate. Bucla exterioară parcurge liniile, iar cea interioară parcurge ______. Fiecare element se citește cu ______, iar la afișare folosim ______.
Bancă de cuvinte:
Test de înțelegere
Test rapid - matricea:
1. O matrice cu 3 linii și 4 coloane are în total:
2. Elementul de pe linia 2, coloana 3 se accesează cu:
3. Pentru a parcurge toate elementele unei matrice folosim:
a[i][j] înseamnă întotdeauna linia i, coloana j. Dacă inversezi indicii, matricea este citită „întoarsă", iar rezultatele prelucrărilor devin greșite.Aprofundare
De ce folosim indexarea de la 1 în stil BAC? În rezolvările de la Bacalaureat și de pe PbInfo se lucrează aproape întotdeauna cu poziții de la 1 la m și de la 1 la n. Astfel, elementul din stânga sus este a[1][1], iar formulele de la diagonale (i == j, i + j == n + 1) rămân simple și ușor de reținut. Declarăm tabloul cu o dimensiune în plus (a[101][101] pentru maxim 100 de linii și coloane) tocmai ca să avem loc pentru pozițiile de la 1.
Memoria ocupată de o matrice: o matrice int a[101][101] ocupă 101 * 101 * 4 octeți, adică aproximativ 40 de kiloocteți (o unitate de măsură a memoriei, egală cu aproximativ o mie de octeți). Este o cantitate mică de memorie, de aceea în C++ putem declara liniștit matrice cu dimensiuni de până la câteva sute pe fiecare latură fără a avea probleme. La problemele de la BAC, limita obișnuită este a[1001][1001].
Cazuri particulare pe care le întâlnim des:
- Matricea cu o singură linie (
m = 1): bucla exterioară se execută o singură dată; parcurgerea rămâne corectă. - Matricea cu o singură coloană (
n = 1): bucla interioară se execută o singură dată; elementele se citesc pe verticală. - Matricea pătrată (
m == n): singura formă pentru care au sens noțiunile de diagonală principală (șirul de elemente de la stânga-sus spre dreapta-jos, cui == j) și secundară (șirul de elemente de la dreapta-sus spre stânga-jos, cui + j == n + 1).
Citirea pe coloane, nu pe linii: dacă dorim să citim mai întâi coloana 1, apoi coloana 2 ș.a.m.d., schimbăm ordinea buclelor: bucla exterioară devine j, iar cea interioară i. În orice problemă, întrebați-vă întotdeauna „după ce criteriu se citesc datele: pe linii sau pe coloane?", pentru că ordinea buclelor trebuie să respecte enunțul.
PbInfo - Afișare matrice
Enunț:
Cerință: Se citește o matrice cu m linii și n coloane. Să se afișeze elementele matricei, pe linii, separate prin spații.
Date de intrare:
Programul citește de la tastatură numerele m și n, apoi cele m * n elemente ale matricei, linie cu linie.
Date de ieșire:
Programul va afișa matricea, fiecare linie pe un rând, elementele separate printr-un spațiu.
Restricții și precizări:
1 <= m, n <= 100, elementele matricei sunt numere întregi.
Exemplu:
Intrare:
2 3 1 2 3 4 5 6
Ieșire:
1 2 3 4 5 6
Cum gândim soluția:
- Citim dimensiunile
mșin - Cu două bucle
forcitim elementele în matriceaa - Afișăm elementele pe linii, cu câte un spațiu între ele și
endlla finalul fiecărei linii
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Ce învățăm: matricea se parcurge cu două bucle for: indicele i pentru linii, j pentru coloane.
PbInfo - Matricea pe coloane
Enunț:
Cerință: Se citește o matrice cu m linii și n coloane. Să se afișeze elementele matricei parcurgând pe coloane: pentru fiecare coloană, toate elementele liniilor, fiecare coloană pe o linie nouă.
Date de intrare:
Programul citește de la tastatură numerele m și n, apoi elementele matricei, linie cu linie.
Date de ieșire:
Programul va afișa elementele matricei pe coloane, fiecare coloană pe un rând, elementele separate printr-un spațiu.
Restricții și precizări:
1 <= m, n <= 100, elementele matricei sunt numere întregi.
Exemplu:
Intrare:
2 3 1 2 3 4 5 6
Ieșire:
1 4 2 5 3 6
Cum gândim soluția:
- Citim matricea ca de obicei, pe linii
- La afișare schimbăm ordinea buclelor: bucla exterioară parcurge coloanele (
j), iar cea interioară liniile (i) - Afișăm
a[i][j]pentru fiecare coloană, pe o linie nouă
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (j = 1; j <= n; j++) {
for (i = 1; i <= m; i++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Ce învățăm: ordinea buclelor schimbă ordinea de parcurgere. Când j este bucla exterioară, parcurgem matricea pe coloane.
Exercițiul Practic: Primele programe cu matrice
Sarcini de lucru
Completează următoarele sarcini pentru a-ți consolida cunoștințele despre matrice în C++
Sarcina 1: Citește și afișează o matrice
Cerință: Scrie un program C++ care citește o matrice cu m linii și n coloane și o afișează pe ecran, elementele fiecărei linii separate prin câte un spațiu.
Soluție pentru Sarcina 1:
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Verifică: matricea se citește cu două bucle for și se afișează cu aceeași structură, adăugând endl după fiecare linie.
Sarcina 2: Afișează elementele liniei a doua
Cerință: Scrie un program C++ care citește o matrice cu m linii și n coloane și afișează doar elementele liniei cu numărul 2 (dacă există), fiecare pe o linie nouă.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
if (m >= 2) {
for (j = 1; j <= n; j++)
cout << a[2][j] << endl;
}
return 0;
}
Verifică: fixăm indicele liniei (2) și parcurgem doar coloanele. Verificăm mai întâi ca matricea să aibă cel puțin două linii.
Scrie pe caiet - De reținut
Titlul lecției
Ora 1: Modelul conceptual mixt - matricea
Definiția lecției
Matricea este un model conceptual mixt de organizare a datelor, format dintr-un tabel cu m linii și n coloane, adică o listă de liste: fiecare linie a matricei este o listă de valori. Fiecare element se identifică printr-o pereche de indici: a[i][j], unde i este numărul liniei, iar j este numărul coloanei. În C++, matricea se declară ca un tablou bidimensional cu dimensiuni maximale, iar dimensiunile reale m și n se citesc de la tastatură la rulare. Citirea și afișarea se fac cu două bucle for imbricate: bucla exterioară parcurge liniile, iar bucla interioară parcurge coloanele. La afișare, fiecare element este urmat de un spațiu, iar după fiecare linie se afișează endl, pentru ca matricea să apară pe ecran exact ca un tabel. Această structură stă la baza tuturor prelucrărilor din modulul 3: parcurgere, diagonale, căutare și interclasare.
Definiții esențiale
- Matricea este un model conceptual mixt de organizare a datelor, format dintr-un tabel cu
mlinii șincoloane; practic, o listă de liste. - Un element se accesează cu
a[i][j], undeieste numărul liniei, iarjnumărul coloanei. - Declararea:
int a[101][101];pentru dimensiuni maximale de 100 pe latură; dimensiunile realemșinse citesc la rulare.
Algoritmul cheie - pseudocod
Algoritmul cheie - cod C++
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
Greșeli comune de evitare
- Depășirea tabloului: declari
a[100][100]dar citeștia[100][100]cu indexare de la 1 - vei ieși din tablou. Declară mereua[101][101]sau mai mare. - Confundarea indicilor:
a[i][j]cui= linia șij= coloana. Scris invers, matricea apare transpusă. - Lipsa spațiului la afișare: fără
<< " "valorile se lipesc una de alta și nu mai poți citi rezultatul.
Exemplu practic
Notele elevilor dintr-o clasă sunt organizate ca o matrice: fiecare linie este un elev, iar fiecare coloană este o disciplină. Programul de mai jos citește notele pentru m elevi și n discipline, apoi le afișează pe ecran sub formă de tabel, exact cum apar în catalog.
#include <iostream>
using namespace std;
int main() {
int m, n, a[101][101], i, j;
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> a[i][j];
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}
Pentru intrarea 3 4 urmată de douăsprezece note, programul afișează trei rânduri a câte patru note - exact tabelul cu notele celor trei elevi la cele patru discipline.
Sfaturi practice și trucuri
- Verifică întotdeauna matricea citită cu o afișare de test înainte de a scrie prelucrarea propriu-zisă.
- La afișare, fiecare element urmat de un spațiu și
endldupă fiecare linie - exact formatul cerut de PbInfo. - Pentru probleme cu numere mari, folosește
long longpentru sume, chiar dacă elementele suntint.