Skip to content

Matrice

  • se mai numeste si tablou bidimensional
  • este un mod de a stoca mai multe elemente de acelasi tip
  • accesul la un element se face ca intr-un tabel:
    • trebuie sa mentionez atat linia cat si coloana elementului
  • matricea trebuie mai intai declarata pentru a fi folosita

Declararea unei matrici

Sintaxa:

cpp
tip numeMatrice[NRLIN][NRCOL];

Exemplu:

cpp
int a[10][25];

Observatie

Liniile si coloanele sunt numerotate de la 0.

Efect:

  • s-a declarat matricea a de tip int
    • adica toate elementele matricei vor fi de tip int
  • are 10 linii - cu indicii 0, 1, 2, ..., 9
  • si 25 de coloane - cu indicii 0, 1, 2, ..., 24
  • astfel:
    • prima linie are indice 0
    • a 2-a linie are indice 1
    • ...
    • ultima linie (a 10-a) are indice 9

Accesul la un element din matrice

Sintaxa:

cpp
numeMatrice[indiceLinie][indiceColoana]

Ex:

cpp
int a[10][25];
// ...
cout << a[0][0]; // am afisat elementul de la linia 0 si coloana 0

Indexarea de la 1

Pentru a fi mai intuitiv sa lucram cu o matrice, putem sa numerotam de la 1. Trebuie sa:

  • declaram matricea cu 1 linie in plus si 1 coloana in plus fata de maximul necesar
  • sa ignoram indicele 0
    • adica sa ignoram atat linia 0
    • cat si coloana 0

Ex:

cpp
// am nevoie de o matrice cu n linii si m coloane
// in enunt imi spune ca:
// n <= 100
// m <= 200
int a[101][201];
// elementul din coltul din stanga-sus va fi a[1][1]
// si cel din coltul din dreapta-jos va fi a[n][m]

Citirea unei matrici cu n linii si m coloane

Pentru a citi o matrice avem nevoie de doua for-uri imbricate:

  • for-ul exterior parcurge liniile (i de la 1 la n)
  • for-ul interior parcurge coloanele (j de la 1 la m)

La fiecare pas citim elementul a[i][j] - elementul de pe linia i si coloana j.

cpp
#include <iostream>
using namespace std;
int a[101][101], n, m, i, j;

int main()
{
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    return 0;
}

Intrare:

3 4
1 2 3 4
5 6 7 8
9 10 11 12

Dupa executia for-urilor, matricea are:

coloana 1coloana 2coloana 3coloana 4
linia 11234
linia 25678
linia 39101112

Observatie

ordinea in care citim este: a[1][1], a[1][2], ..., a[1][m], apoi trecem la linia urmatoare a[2][1], a[2][2], ..., a[2][m], si tot asa pana la a[n][m]. Aceasta este parcurgerea linie cu linie.


Afisarea unei matrici cu n linii si m coloane

Folosim aceeasi structura de for-uri, dar in locul citirii afisam fiecare element. Dupa fiecare linie afisam endl pentru a trece pe randul urmator.

cpp
#include <iostream>
using namespace std;
int a[101][101], n, m, i, j;

int main()
{
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

Intrare:

3 4
1 2 3 4
5 6 7 8
9 10 11 12

Afisare:

1 2 3 4 
5 6 7 8 
9 10 11 12

Important

cout << endl; este pus in afara for-ului interior, dar in interiorul for-ului exterior. Asa, dupa ce am afisat toate elementele unei linii, trecem pe randul urmator.


Suma elementelor intr-o matrice

Folosim o variabila s in care acumulam suma. Pornim cu s = 0 si la fiecare element din matrice adunam a[i][j].

cpp
#include <iostream>
using namespace std;
int a[101][101], n, m, i, j, s;

int main()
{
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    s = 0;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            s = s + a[i][j];
        }
    }
    cout << s;
    return 0;
}

Intrare:

3 4
1 2 3 4
5 6 7 8
9 10 11 12

Afisare:

78

Observatie

suma este 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 = 78.


Produsul elementelor pe linie

Vrem sa calculam produsul elementelor de pe fiecare linie in parte. Pentru fiecare linie i, obtinem cate un produs.

Logica:

  • for-ul exterior parcurge liniile (i de la 1 la n)
  • la inceputul fiecarei linii resetam produsul: p = 1
  • for-ul interior parcurge coloanele si inmulteste fiecare element in p
  • dupa ce s-a terminat linia, afisam produsul p
cpp
#include <iostream>
using namespace std;
int a[101][101], n, m, i, j, p;

int main()
{
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    for (i = 1; i <= n; i++)
    {
        p = 1;
        for (j = 1; j <= m; j++)
        {
            p = p * a[i][j];
        }
        cout << p << endl;
    }
    return 0;
}

Intrare:

3 4
1 2 3 4
5 6 7 8
9 10 11 12

Afisare:

24
1680
11880

Observatie

pentru linia 1, produsul este 1 * 2 * 3 * 4 = 24. Pentru linia 2, 5 * 6 * 7 * 8 = 1680. Pentru linia 3, 9 * 10 * 11 * 12 = 11880.

Important

este foarte important ca p = 1 sa fie in interiorul for-ului pe i, dar in afara for-ului pe j. Altfel produsul ar continua de pe linia anterioara.


Suma elementelor pe coloana

Vrem sa calculam suma elementelor de pe fiecare coloana in parte. De data aceasta, coloana este fixata si parcurgem liniile.

Logica:

  • for-ul exterior parcurge coloanele (j de la 1 la m)
  • la inceputul fiecarei coloane resetam suma: s = 0
  • for-ul interior parcurge liniile si aduna fiecare element in s
  • dupa ce s-a terminat coloana, afisam suma s
cpp
#include <iostream>
using namespace std;
int a[101][101], n, m, i, j, s;

int main()
{
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }
    for (j = 1; j <= m; j++)
    {
        s = 0;
        for (i = 1; i <= n; i++)
        {
            s = s + a[i][j];
        }
        cout << s << " ";
    }
    return 0;
}

Intrare:

3 4
1 2 3 4
5 6 7 8
9 10 11 12

Afisare:

15 18 21 24

Observatie

pentru coloana 1, suma este 1 + 5 + 9 = 15. Pentru coloana 2, 2 + 6 + 10 = 18. Pentru coloana 3, 3 + 7 + 11 = 21. Pentru coloana 4, 4 + 8 + 12 = 24.

Observatie

observa ca for-urile sunt inversate fata de parcurgerea obisnuita: for-ul pe j (coloane) este exterior, iar for-ul pe i (linii) este interior. Asta pentru ca pentru o coloana fixata, vrem sa parcurgem toate liniile.