Școala Româno-Britanică
Modulul 3 Clasa a X-a | C++

Ora 1: Modelul conceptual mixt - matricea

Ce vei învăța astăzi: Ce este matricea, cum se declară, se citește și se afișează în C++

Rezultat practic: Declari o matrice bidimensională, o citești de la tastatură și o afișezi pe ecran în limbajul C++ (Competența 1.4).

Competența 1.4 Săptămâna 12

Înainte de a începe

De ce contează? Orice tabel din jurul tău - catalogul cu note, orarul, clasamentele - se modelează ca o matrice. Este structura de bază pe care se construiesc toate prelucrările din acest modul și de la BAC.

Ce știi deja?

Poți declara și parcurge un tablou unidimensional cu o singură buclă for? Matricea este exact acest tablou, dar cu două dimensiuni - dacă știi cum se citește v[i], atunci știi deja jumătate din lecția de azi.

Ideea-cheie: O matrice este o listă de liste: fiecare element se identifică printr-o pereche (linie, coloană), iar pentru a o parcurge ai nevoie întotdeauna de două bucle for imbricate (adică o buclă for plasată în interiorul celeilalte).
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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.

Modelul conceptual mixt: lista de liste
Declararea unei matrice în C++
Citirea matricei cu bucle for
Afișarea matricei pe linii

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.

Rândul = linia

Numărătoarea elevilor pe orizontală, dată de indicele i (indicele este numărul care arată poziția elementului în tablou)

Banca = coloana

Poziția pe rând, dată de indicele j

Locul exact

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.

Declararea matricei
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].

Atribuirea unui element
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).

Algoritmul CitireAfișareMatrice(m, n): // pasul 1: citirea dimensiunilor citește m, n // pasul 2: citirea elementelor, linie cu linie pentru i = 1, m execută pentru j = 1, n execută citește a[i][j] sfârșit pentru sfârșit pentru // pasul 3: afișarea elementelor, linie cu linie pentru i = 1, m execută pentru j = 1, n execută scrie a[i][j], spațiu sfârșit pentru sari la linia nouă sfârșit pentru
Program complet: citirea și afișarea unei matrice
#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:
matrice linii a[i][j] coloanei

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:
for coloanele cin cout

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:

Ai grijă la: confuzia dintre linie și coloană: 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, cu i == j) și secundară (șirul de elemente de la dreapta-sus spre stânga-jos, cu i + 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.

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Citim dimensiunile m și n
  2. Cu două bucle for citim elementele în matricea a
  3. Afișăm elementele pe linii, cu câte un spațiu între ele și endl la finalul fiecărei linii
Scrie soluția în C++:
Soluție corectă:
Soluția completă
#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:
  1. Citim matricea ca de obicei, pe linii
  2. La afișare schimbăm ordinea buclelor: bucla exterioară parcurge coloanele (j), iar cea interioară liniile (i)
  3. Afișăm a[i][j] pentru fiecare coloană, pe o linie nouă
Scrie soluția în C++:
Soluție corectă:
Soluția completă
#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ȚII PRACTICE

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 m linii și n coloane; practic, o listă de liste.
  • Un element se accesează cu a[i][j], unde i este numărul liniei, iar j numărul coloanei.
  • Declararea: int a[101][101]; pentru dimensiuni maximale de 100 pe latură; dimensiunile reale m și n se citesc la rulare.

Algoritmul cheie - pseudocod

Algoritmul CitireAfișareMatrice(m, n): citește m, n pentru i = 1, m execută pentru j = 1, n execută citește a[i][j] sfârșit pentru sfârșit pentru pentru i = 1, m execută pentru j = 1, n execută scrie a[i][j], spațiu sfârșit pentru sari la linia nouă sfârșit pentru

Algoritmul cheie - cod C++

Citirea și afișarea unei matrice
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ști a[100][100] cu indexare de la 1 - vei ieși din tablou. Declară mereu a[101][101] sau mai mare.
  • Confundarea indicilor: a[i][j] cu i = linia și j = 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.

Catalogul de note afișat ca matrice
#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 endl după fiecare linie - exact formatul cerut de PbInfo.
  • Pentru probleme cu numere mari, folosește long long pentru sume, chiar dacă elementele sunt int.