Video: Matrice în C++. Declararea și parcurgerea tablourilor bidimensionale

Matrice în C++. Declararea și parcurgerea tablourilor bidimensionale

Am învățat până acum să lucrăm cu variabile individuale, sau chiar să lucrăm cu vectori — în care stocăm un număr de variabile de același tip, într-o linie.

În C++, matricele extind vectorii în 2D — de unde vine și numele de tablou bidimensional. Mai exact, într-o matrice, elementele sunt organizate pe linii și pe coloane.

Spre exemplu, iată o matrice de dimensiuni 3 × 4:

Dă hover pe un element pentru a-i găsi linia și coloana.

Ne reamintim că la vectori, puteam să luăm câte un element folosind indicele său — practic folosind poziția din vector. La matrici, ne vom folosi de 2 indici: unul care numește linia, și celălalt care numește coloana elementului curent.

Declararea matricelor în C++

Declararea unei matrice constă în specificarea celor două dimensiuni: numărul maxim de linii și numărul maxim de coloane.

tip nume[numarLinii][numarColoane];

Spre exemlu, o matrice de numere cu 3 linii și 4 coloane se declară astfel:

int a[3][4];

Și poate fi reprezentată așa (elementele sunt alese aleatoriu):

https://i.ibb.co/TWKGsH2/image.png

Observații

Observăm următoarele lucruri:

  • Matricea de mai sus are 3 * 4 = 12 elemente; o matrice cu n linii și m coloane are n * m elemente;
  • Practic, o matrice este un vector de vectori;
  • Liniile sunt indexate (numerotate) de la 0 la 2. Coloanele sunt indexate de la 0 la 3; cu toate acestea, ca la vectori, putem să numerotăm indicii de la 1 în loc de 0, nelucrând cu elementele de pe linia/coloana 0.
  • Liniile sunt de sus în jos, iar coloanele sunt de la stânga la dreapta;
  • Memoria unei matrici crește exponențial: o matrice 1000 * 1000 este de 100 de ori mai mare decât una de 100 * 100.

Cum se salvează matricele în memorie

Ca un fun fact pentru cei interesați, cum în memorie nu există noțiunea de 2D (adică toate informațiile din memorie sunt consecutive, una după alta), o matrice cu n linii și m coloane se salvează ca o înșiruire de n * m elemente. Așadar, în anumite medii de programare, apelând elementul de pe linia 0, coloana m, o să obținem elementul de pe linia 1, coloana 0 (deoarece matricea are coloane de la 0 la m - 1, coloana m este practic următorul element, adică de pe linia următoare și coloana 0).

Spre exemplu, matricea de mai sus se reprezintă în memorie astfel: 1, 3, 6, 2, 2, 4, 12, 44, 0, 3, 5, 7.

Accesarea elementelor din matrice

Cum probabil ați intuit, pentru accesarea elementului de pe linia i și coloana j a unei matrici a, apelăm a[i][j]. Spre exemplu, în matricea de mai sus, a[0][2] = 6.

Parcurgerea unei matrice în C++

Parcurgerea unei matrice poate părea un pic mai greu de înțeles. Când vorbim de parcurgerea unei matrice, vrem să parcurgem elementele sale linie cu linie, de sus în jos și de la stânga la dreapta — exact cum se afișează pixelii pe un televizor:

Secvență preluată de la The Slo Mo
Guys

(Secvență preluată de laThe Slow Mo Guys)

Pentru a face acest lucru, vom folosi două structuri repetitive for imbricate (una în alta): prima după i, iar a doua după j. Cea din afară (după i) va parcurge, pe rând, liniile matricei, de la 0 la n - 1. Pentru fiecare linie în parte, vom parcurge elementele de la stânga la dreapta (de la 0 la m - 1) folosind al doilea for (care este după j). Astfel, reușim să parcurgem toate elementele matricei cu ușurință.

Indexare de la 0

#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
    cin >> n >> m; //Citim numărul de linii și de coloane

    //Parcurgem matricea exact cum am explicat anterior
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            a[i][j] = 1;
        }
    }
    return 0;
}

Indexare de la 1

Indexarea de la 1 înseamnă să numerotăm elementele matricei de la 1 la n și de la 1 la m, în loc să numerotăm de la 0 la n - 1 și de la 0 la m - 1. De multe ori se preferă indexarea de la 1 (vom vedea mai târziu de ce), dar din această cauză vom folosi indexarea de la 1 de acum înainte. Să vedem cum se parcurge o matrice indexată de la 1:

#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
    cin >> n >> m; //Citim numărul de linii și de coloane

    //Parcurgem matricea exact cum am explicat anterior
    for(int i = 1; i <= n; i++) { //1 - n
        for(int j = 1; j <= m; j++) { //1 - m
            a[i][j] = 1;
        }
    }
    return 0;
}

Citirea și afișarea unei matrici

Citirea unui tablou bidimensional

Citirea matricei folosește parcurgerea de mai devreme pentru a lua elementele pe rând și a le citi de la tastatură. Iată un exemplu:

cin >> n >> m; //Citim dimensiunile matricei

//Citim matricea, parcurgem cum am învățat anterior
for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        cin >> a[i][j];

Afișarea unui tablou bidimensional

Afișarea unui tablou este similară, însă după ce afișăm fiecare linie în parte, trebuie să afișăm un endl pentru a trece la următoarea linie.

//Afișăm matricea, parcurgem cum am învățat anterior
for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= m; j++)
        cout << a[i][j] << " ";
    cout << endl;
}

Exemplu

Iată un cod în C++ care citește de la tastatură o matrice și o afișează pe ecran:

#include <iostream>

using namespace std;

int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea

int main()
{
    cin >> n >> m; //Citim numărul de linii și de coloane

    //Citim matricea
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }

    //Afișăm matricea
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}

Matrici pătratice

Pentru lecția completă a matricelor pătratice, intră pe această pagină.

Ce este o matrice pătratică?

O matrice pătratică este o matrice particulară, cu același număr de linii și de coloane — adică cu n == m. Pentru simplitate, vom menționa doar n-ul, deoarece m-ul are aceeași valoare. Matricea de acest tip are o serie de particularități care se folosesc în anumite probleme.

Diagonala principală și diagonala secundară

Diagonala principală a unei matrice este diagonala care începe din colțul stânga-sus și se termină în colțul dreapta-jos. Mai exact, un element a[i][j] aparține diagonalei principale dacă i == j.

Similar, diagonala secundară este cealaltă diagonală, care începe din colțul dreapta-sus și se termină în cel stânga-jos. Un element a[i][j] aparține diagonalei secundare dacă i + j == n + 1, sau cu alte cuvinte, j == n - i + 1 (unde matricea este indexată de la 1).

În imaginea de mai jos, diagonala principală este cea roșie, diagonala secundară este cea albastră, elementul 4 (din mijloc) aparținând ambelor diagonale.

https://i.ibb.co/1qvhPpb/image.png

Exerciții propuse

Completează următoarea secvență de cod:

Să se atribuie fiecărui element din matrice produsul indicilor săi:

for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= m; j++) {
        a[i][j] = i * ???;
    }
}

Care este cea mai mică dimensiune pe care o poate lua matricea astfel încât codul să funcționeze cum trebuie?

int a[3][???];
for(int i = 1; i <= 2; i++) {
    for(int j = 1; j <= 3; j++) {
        a[i][j] = 1;
    }
}

Probleme propuse

Setul de probleme 151 nu a fost găsit.

Alte resurse sau bibliografie

DS

Autorul acestei lecții

Dominic Satnoianu

Această lecție a fost redactată de către Dominic Satnoianu.

© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.

Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.

Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.

Comentarii 0

Autentifică-te pentru a putea comenta.

Autentifică-te