Sunteți pe pagina 1din 4

Tablouri 2-dimensionale (matrici)

Indexarea datelor intr-un tablou 2- dim se face cu doi indici, la matematica valoarea initiala
a indicilor este de la 1, dar totusi se aloca memorie si pentru linia 0 si coloana 0. Vom declara
un tablou 2-dim in felul urmator Ex. <tip> A[8][10]. Tabloul A va contine maximal 8-linii si
10 – coloane. Automat se aloca memorie si pentru linia 0 si coloana 0 Daca intexarea va incepe
de la 1, atunci putem avea maxim 7- linii si 9- coloana. La matematica tabloul A[n][m] cu n-
linii si m- coloane se scrie in felul urmator:

Pentru a citi, a scrie, a parcurge un tablou 2- dimensional se folosesc 2 instructiuni ciclice una
in alta. Ex un for (i=1; i<=n; i++) si in acest for un alt for (j=1; j<=m; j++). Ciclul cu indicile j
se va executa pentru fiecare valoare a lui i. Vom avea (n*m - elemente)
Citirea: cin>>n>>m;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{ cout<<”A[“<<i<<”][”<<j<<”]=”; cin>>A[i][j]; }

Scrierea: for (i=1; i<=n; i++)


for (j=1; j<=m; j++)
{ cout<<setw[5]<<A[i][j];
cout<<endl;
}

Problema:
De parcurs tabloul A si de aflat suma numerele, numarul maxim, numarul minim:
int S=0, maxi=A[1][1], mini=A[1][1];
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{ S+=A[i][j] ;
maxi=max(maxi,A[i][j]);
mmii=min(mini,A[i][j]);
}
Ex de program: Problema1
1. Citeste n, m
2. Citeste tabloul A
3. Scrie tabloul A, aliniind numerele in coloane
4. Afla si scrie suma- S; nr. maxim maxx;
numarul minim minn; cate numere sunt divizibile cu 3
#include <bits/stdc++.h>
using namespace std;
int A[10] [15], n, m, i, j;
int main()
{ cout<<"n="; cin>>n; // n- indica numarul de linii
cout<<"m="; cin>>m; // m- indica numarul de coloane
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{ cout<<"A["<<i<<"]["<<j<<"]="; cin>>A[i][j]; }
cout<<"avem tabloul 2-dim"<<endl;
for (i=1; i<=n; i++)
{ for (j=1; j<=m; j++)
cout<<setw(5)<<A[i][j];
cout<<endl;
}
int S=0, maxx=A[1][1], minn=A[1][1], k=0;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{ S+=A[i][j];
maxx=max(maxx, A[i][j]);
minn=min(minn, A[i][j]);
if ( A[i][j] % 5 = =0) k++;
}
cout<<"Suma="<<S<<endl;
cout<<"numarul maxim="<<maxx<<endl;
cout<<"numarul minim="<<minn<<endl;
if (k) cout<<"numarul de nr divizibile cu 5 este k="<<k<<endl;
else cout<<"nu sunt numere divizibile cu 5"<<endl;
return 0; }

Sortarea liniilor / coloanelor unui tablou 2- dim


De exemplu: De sortat liniile unui tablou 2-dim in ordine crescatoare prin insertie:
For (i=1; i<=n; i++)
for (k=2; k<=m; k++)
{ x=A[i][k];j=k-1;
while (j>=1 && x<A[i][j]) {A[i][j+1]=A[i][j]; j-- ;}
A[i][j+1]=x;
}
cout<<"Liniile tabloului sortate crescator sunt:"<<endl;
for (i=1; i<=n; i++)
{ for (j=1; j<=m; j++)
cout<<setw(5)<<A[i][j];
cout<<endl;
}
Observam ca avem nevoie de 3 instructiuni ciclice:
1. for cu I parcurge liniile
2. for cu j si while sorteaza numerele in linie
Analog se sorteaza si coloanele

Tablouri (matrici) patrate: m=n.


La tablourile patrate nr. liniilor coincide cu numarul coloanelor
Tabloul patrat are 2 diagonale:
1. Diagonala principala, unde j=i si contine elementele A[1][1] A[2][2] ….A[n][n]
2. Diagonala secundara, unde j=n+1-i si contine elementele A[1][n] A[2][n-1] … A[n][1]
Daca n>=3, atunci diagonalele impart elementele tabloului 2- dim in 4 sectoare:

I sector : (j>I && j<n+1-i)


II sector : (j<I && j<n+1-i)
III sector : (j<i && j>n+1-i)
IV sector : (j>i && j>n+1-i)

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


for (j=1; j<=n; j++) { …..} // parcurgerea tabloului 2-dim
int s1=0, s2=0;
2. for (i=1; i<=n; i++) // suma numerelor de pe diagonala principala/ secund
{s1+=A[i][i]; s2+= A[i][n+1-i];
}

3.

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