Sunteți pe pagina 1din 19

Matrice

Declararea matricelor
Declararea tablourilor bidimensionale (matrice) se 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):

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ă.

Parcurgerea matricei
Parcurgerea presupune accesarea elementelor curente ale matricei, într-o anumită
ordine – de regulă aceasta se face pe linii, de sus în jos și de la stânga la dreapta:

int n, m, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 0 ; j < m ; j ++)
.....
Parcurgerea unei linii
Toate elementele de pe o anumită linie au același indice de linie și diferă prin indicele
de coloană. Pentru a parcurge o anumită linie k, vom parcurge indici de coloană:

for(int j = 1 ; j <= m ; j++)


{
// A[k][j]
}

Parcurgerea unei coloane


Toate elementele de pe o anumită coloană au același indice de coloană și diferă prin
indicele de linie. Pentru a parcurge o anumită coloană k, vom parcurge indici de linie:

for(int i = 0 ; i < n ; i ++)


{
// A[i][k]
}

Citirea unei matrice


De regulă, elementele matricei se dau în ordine: de sus în jos și de la stânga la dreapta.
Citirea presupune nu doar citirea elementelor matricei, dar și citirea
dimensiunilor n și m:

cin >> n >> m;


for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < m ; j ++)
cin >> A[i][j];

Afișarea unei matrice


Pentru a obține aspectul specific tabloului bidimensional, după afișarea elementelor de
fiecare linie vom trece la linia următoare a ecranului. Elementele fiecărei linii sunt de
regulă separate printr-un spațiu:

for(int i = 0 ; i < n ; i ++)


for(int j = 0 ; j < m ; j ++)
cout << A[i][j] << " ";

Tablouri patratice
Un tablou bidimensional este tablou pătratic sau matrice pătratică dacă numărul de
linii este egal cu numărul de coloane.

În această situație folosim pentru ambele dimensiuni o singură variabilă, de regulă n:

int n, A[100][100];

Într-o matrice pătratică se disting o categorie specială de elemente, diagonalele. Un


element al matricei aparține sau nu diagonalelor sau zonelor delimitate de acestea dacă
respectă anumite reguli, în care intervin indicii elementului. În cele ce urmează, pentru un
element oarecare al matricei vom nota cu i indicele de linie și cu j indicele de coloană.

Diagonala principală
Parcurgerea elementelor de pe diagonala principală:

for(int i = 1 ; i <= n ; i ++)


{
// A[i][i]
}

Diagonala secundară
Parcurgerea elementelor de pe diagonala secundară:

for(int i = 1 ; i <= n ; i ++)


{
// A[i][n + 1 - i]
}
Deasupra diagonalei Sub diagonală

(i<j) (i>j)

Elementele delimitate de diagonala principală

Elementele delimitate de diagonala secundară


Zonele delimitate
de Deasupra diagonalei Sub diagonala diagonale
Cele două diagonale
i+j < n+1 i+j > n+1
delimitează în matrice
patru
zone: Nord,  Est, Sud și V
est. Condițiile
verificate de indicii
elementelor din aceste
zone sunt prezentate
mai jos:

Probleme

666.
Cerința
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine câte
dintre elementele situate pe linii cu indici pari sunt prime.

Date de intrare
Programul citește de la tastatură numerele n m, iar apoi n șiruri cu câte m numere naturale,
reprezentând elementele matricei.

Date de ieșire
Programul va afișa pe ecran numărul C, reprezentând valoarea căutată.

Restricții și precizări
 1 ≤ n , m ≤ 100
 elementele matricei sunt numere naturale mai mici decât 1.000.000
 liniile matricei sunt numerotate de 1 la n, iar coloanele de la 1 la m
Exemplu
Intrare

4 3
5 12 10
3 9 1
7 10 1
10 9 3

Ieșire

Explicație
Cele 2 valori prime determinate sunt cele îngroșate mai jos:

5 12 10
3 9 1
7 10 1
10 9 3
Observăm că matricea conține și alte elemente prime, dar ele nu sunt situate pe linii cu
indici pari.

#include <iostream>
using namespace std;
int main() {
int n, m, a[101][101], C = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];

for (int i = 2; i <= n; i += 2)


for (int j = 1; j <= m; j++) {
int ok = 1;
if (a[i][j] < 2) ok = 0;
for (int d = 2; d * d <= a[i][j]; d++) if (a[i][j] % d == 0)ok = 0;
if (ok == 1) C++;
}
cout << C;
return 0;
}
770.
Cerința
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se permute coloanele
matricei circular spre stânga cu o poziție.

Date de intrare
Programul citește de la tastatură numerele n şi m, iar apoi n*m numere naturale, separate prin
spații, reprezentând elementele matricei, linie cu linie.

Date de ieșire
Programul afișează pe ecran elementele matricei transformate, câte un linie a matricei pe o linie a
ecranului, elementele de pe o linie fiind separate prin câte un spațiu.

Restricții și precizări
 1 ≤ m, n ≤ 100
 elementele matricei vor fi mai mici decât 1.000.000

 Exemplu
Date de intrare

4 6
4 20 15 23 18 9
1 8 23 22 14 18
17 15 13 18 12 15
3 18 8 20 12 5

Date de ieșire

20 15 23 18 9 4
8 23 22 14 18 1
15 13 18 12 15 17
18 8 20 12 5 3
#include <iostream>
using namespace std;
int main() {
int n, m, a[101][101];
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m;
j++)
cin >> a[i][j];

for (int j = 1; j < m; j++)


for (int i = 1; i < n;
i++)
swap(a[i][j],
a[i][j + 1]);

for (int i = 1; i <= n; i++) {


for (int j = 1; j <= m;
j++)
cout << a[i][j]
<< ' ';
cout << endl;
}
return 0;
}

313.
Cerinţa
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi diferenţa în
valoare absolută dintre sumele elementelor de pe cele două diagonale.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n*n numere naturale, separate prin
spaţii, reprezentând elementele matricei, linie cu linie.

Date de ieşire
Programul afișează pe ecran numărul D, reprezentând valoarea calculată.

Restricţii şi precizări
 1 ≤ n ≤ 20
 elementele matricei vor fi mai mici decât 10000

Exemplu
Date de intrare

4
8 3 3 7
1 1 6 5
8 7 1 1
9 8 7 1

Date de ieșire

18

#include <iostream>
using namespace std;
int main() {
int n, a[101][101], S1 = 0, S2 = 0;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
S1 += a[i][i];
for (int i = 1; i <= n; i++)
S2 += a[i][n - i + 1];
cout << abs(S2 - S1);
return 0;
}

780.
Cerinţa
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi cel mai mare
divizor comun al sumei elementelor de deasupra diagonalei principale și al sumei
elementelor de sub diagonala principală.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n*n numere naturale, separate prin
spaţii, reprezentând elementele matricei, linie cu linie.

Date de ieşire
Programul afișează pe ecran numărul D, reprezentând valoarea calculată.

Restricţii şi precizări
 1 ≤ n ≤ 20
 elementele matricei vor fi mai mici decât 1.000.000
 cel puţin un element situat deasupra diagnalei principale şi cel puţin un element
situat sub diagonala principală sunt nenule

Exemplu
Date de intrare

4
8 3 5 6
5 5 6 5
3 8 6 5
8 4 8 8

Date de ieșire

#include <iostream>
using namespace std;
int main() {
int n, a[101][101], S1 = 0, S2 = 0;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i < n; i++)
for (int j = i + 1; j <= n; j++)
S1 += a[i][j];
786.
Cerinţa
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se construiască o matrice
care să fie simetrica față de diagonala principală a matricei date.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n*n numere naturale, separate prin spaţii,
reprezentând elementele matricei, linie cu linie.

Date de ieşire
Programul afișează pe ecran elementele matricei construite, câte un linie a matricei pe o linie a
ecranului, elementele de pe o linie fiind separate prin câte un spațiu.
Restricţii şi precizări
 1 ≤ n ≤ 100
 elementele matricei vor fi mai mici decât 1.000.000
 două matrice A și B sunt simetrice față de diagonala principală dacă A[i,j]=B[j,i],
pentru orice i,j.

Exemplu
Date de intrare

4
3 1 8 5
7 8 5 1
2 2 6 7
9 8 1 3

Date de ieșire

3 7 2 9
1 8 2 8
8 5 6 1
5 1 7 3

#include <iostream>

using namespace std;


int n, a[100][100], i, j, aux;
int main()
{
cin >> n;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
cin >> a[i][j];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++)
{
aux = a[i][j];
a[i][j] = a[j][i];
a[j][i] = aux;
767.
Cerinţa
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Determinați suma valorilor
pare din matrice.

Date de intrare
Programul citește de la tastatură numerele n şi m, iar apoi n*m numere naturale, separate prin
spaţii, reprezentând elementele matricei, linie cu linie.

Date de ieşire
Programul afișează pe ecran suma căutată S.

Restricţii şi precizări
 1 ≤ m,n ≤ 100
 elementele matricei vor fi mai mici decât 10000

Exemplu
Date de intrare

4 6
4 20 15 23 18 9
1 8 23 22 14 18
17 15 13 18 12 15
3 18 8 20 12 5

Date de ieșire

192

#include <iostream>
using namespace std;
int main() {
int n, m, a[101][101], s = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++){
cin >> a[i][j];
if (a[i][j] % 2 == 0) s += a[i][j];
}
cout << s;
return 0;
}

658.
Cerința
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine suma
elementelor de pe fiecare linie.

Date de intrare
Programul citește de la tastatură numerele n m, iar apoi n șiruri cu câte m numere naturale,
reprezentând elementele matricei.

Date de ieșire
Programul va afișa pe ecran n numere, separate prin câte un spațiu reprezentând suma
elementelor de pe fiecare linie, de sus în jos.

Restricții și precizări
 1 ≤ n , m ≤ 100
 elementele matricei sunt numere naturale mai mici decât 1.000.000

Exemplu
Intrare

3 4
5 5 10 5
3 9 1 2
4 10 1 2

Ieșire

25 15 17

#include <iostream>
using namespace std;
int main() {
int n, m, a[101][101], s;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];

for (int i = 1; i <= n; i++) {


659.
Cerința
Gigel a găsit o matrice cu n linii și m coloane și elemente numere naturale. El își propune să
determine, pentru fiecare linie, cea mai mică valoare care se poate obține adunând
elementele de pe linie, cu excepția unuia.

Date de intrare
Programul citește de la tastatură numerele n m, iar apoi n șiruri cu câte m numere naturale,
reprezentând elementele matricei.

Date de ieșire
Programul va afișa pe ecran n numere, separate prin câte un spațiu, reprezentând valorile
obținute pentru fiecare linie, de sus în jos.

Restricții și precizări
 1 ≤ n , m ≤ 100
 elementele matricei sunt numere naturale mai mici decât 1.000.000
Exemplu
Intrare

3 4
5 5 10 5
3 9 1 9
4 10 1 2

Ieșire

15 13 7

#include <iostream>
using namespace std;
int main() {
int n, m, a[101][101], maxi, s;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];

for (int i = 1; i <= n; i++) {


maxi = 0;
s = 0;
for (int j = 1; j <= m; j++) {
s += a[i][j];
if (a[i][j] > maxi) maxi = a[i][j];
}
s -= maxi;
cout << s << ' ';
}
return 0;
}

S-ar putea să vă placă și