Sunteți pe pagina 1din 15

Tablouri bidimensionale-Matrici Ptratice

Zuleam Andreea, clasa XII D, Colegiul National Carol I Craiova

Tablouri ptratice

Definiie general:

Numim tablou o colecie (grup, mulime ordonat) de date, de acelai tip, situate ntr-o zon
de memorie continu (elementele tabloului se afl la adrese succesive). Tablourile sunt variabile
compuse (structurate), deoarece grupeaz mai multe elemente. Variabilele tablou au nume, iar tipul
tabloului este dat de tipul elementelor sale. Elementele tabloului pot fi referite prin numele tabloului
i indicii (numere ntregi) care reprezint poziia elementului n cadrul tabloului.
n funcie de numrul indicilor utilizai pentru a referi elementele tabloului, putem ntlni tablouri
unidimensionale (vectorii) sau multidimensionale (matricile sunt tablouri bidimensionale).
Exemplu de tablou ptratic n care indexarea a fost facut de la 0:

Matricea ptratic este un caz particular de matrice pentru care numrul de linii este
egal cu numrul de coloane.

Proprieti ale zonelor speciale din matricile ptratice

Diagonala principal are proprietatea de avea indicii de linie i coloana egali. (pentru elementrul
ai,j, i=j)
Diagonala secundar conine elementele a1n, a2 n-1 , a3 n-2,...,an1 cu proprietatea c suma
indicilor este egal cu numrul de linii+1. (pentru elementrul ai,j, i+j=n+1)

Zona de deasupra diagonalei principale


Elementele de deasupra diagonalei principale sunt a12, a13, a14,...,a1n, a23, a24, a25,...,a2n, ....,
an-1 n-1, an-1 n.
Proprietatea elementelor din zona aceasta, este c indicele liniei este mai mic dect cel al
coloanei(pentru elementrul ai,j, i<j).
Zona de sub diagonala principal
Elementele a21, a31, a32,...,a41, a42, a43, .....,an1, an2, an n-1 se afl sub diagonala
principal i au au ca proprietate faptul c indicele liniei este nai mare dect indicele
coloanei.( pentru elementrul ai,j, i>j).
Elemente de baza: diagonala principal i diagonala secundar.
2

Modaliti de prelucrare a elementelor n matrice ptratic de dimensiune nxn


Diagonala principala:
for (i=1;i<=n;i++)
< secven de instruciuni asupra a[i][i]>
Diagonala secundara:
for (i=1;i<=n;i++)
< secven de instruciuni asupra a[i][n-i+1]>
Deasupra diagonalei principale:
for (i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
< secven de instruciuni asupra a[i][j]>
Sub diagonala principala:
for (i=2;i<=n;i++)
for(j=1;j<=i-1;j++)
< secven de instruciuni asupra a[i][j]>
Prelucrarea intr-o singura parcurgere a mai multor zone:
for (i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (i==j)*<prelucreaz a[i,j] diag. princ.>
else
if (i+j==n+1)
*<prelucreaz a[i,j] diag. sec.>
else

if (i>j)
*<prelucreaz a[i,j] deasupra diag. princ.>

else

*<prelucreaz a[i,j] sub diag. princ.>


if (i+j<n+1)
*<prelucreaz a[i,j] deasupra diag. sec.>

Declararea tabourilor
Ca i variabilele simple, variabilele tablou bidimensionale trebuie declarate nainte de utilizare.
Modul de declarare:
tip nume_tablou[numr linii][numr coloane];numa
unde:tip reprezint tipul elementelor tabloului; numr_linii, numr_coloane sunt numere ntregi sau
expresii constante ntregi (a cror valoare este evaluat la compilare) care reprezint limitele
superioare ale indicilor tabloului.
Exemple:
double matrice[2][3]; // declararea tabloului matrice (bidimensional),
// maximum 2 linii i maximum 3 coloane, elemente tip double
Din punct de vedere conceptual, elementele unui tablou bidimensional sunt plasate n spaiu pe dou
direcii. Matricea reprezint o aplicaie natural a tablourilor bidimensionale.
n matematic:
...

q 1nq 11

q 12

q 13

q 21

q 22

q 23

Q=

...

q 2n

..........................
q m1

q m2

q m3

...

Q mn

q mn

n limbajele C/C++ (indicii de linie i de coloan pornesc de la 0):


q 00
q 10
Q=

q 01
q 11

q 02
q 12

...
...

q 0,n 1
q 1,n

Q mn

............................
q
q m1,2 . . .
q m1,n 1
q m1,0 m1,1

Exemplu:
double q[3][2];
double

// declararea matricii q, cu maxim3 linii i 2 coloane, elemente tip

Iniializarea elementelor unei matrici


Dac se dorete iniializarea elementelor unei matrici n momentul declarrii acesteia, se poate
proceda astfel:
int mat[4][3] = {
{10, -50, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 19} };
Prin aceast construcie, elementele matricii mat se iniializeaz n modul urmtor:
mat[0][0]=10, mat[0][1]=-50, mat[0][2]=3
mat[1][0]=32, mat[1][1]=20, mat[1][2]=1
mat[2][0]=-1, mat[2][1]=1, mat[2][2]=-2
mat[3][0]=7, mat[3][1]=-8, mat[3][2]=19
La declararea unei matrici i iniializarea elementelor sale, se poate omite numrul maxim de linii,
n schimb, datorit modului de memorare, trebuie specificat numrul maxim de coloane:
int mat[][3] = {
{10, -5, 3},
{32, 20, 1},
{-1, 1, -2},
{7, -8, 9} };
Construcia are acelai efect ca precedenta.
int mat[][3] = {
{1, 1},
{ -1},
{3, 2, 1}};
mat reprezint o matrice 3 3, ale crei elemente se iniializeaz astfel:
mat[0][0]=1, mat[0][1]=1, mat[1][0]=-1, mat[2][0]=3, mat[2][1]=2, mat[2][2]=1
Elementele mat[0][2], mat[1][1], mat[1][2] nu sunt initalizate. Ele au valoarea zero dac tabloul
este global i valori iniiale nedefinite dac tabloul este automatic.

Construciile utilizate la iniializarea tablourilor bidimensionale se extind pentru tablouri


multidimensionale, cu mai mult de doi indici.
Exemplu:
int a[2][2][3]={
{ {10, 20}, {1, -1}, {3, 4}},
{ {20, 30}, {50, -40}, {11, 12}}
};

Citirea i afiarea unei matrici pe ecran


S se citeasc de la tastatur elementele unei matrici de maxim 10 linii i 10 coloane. S se afieze
matricea citit.
#include <iostream.h>
void main()
{
int A[10][10], nr;
cout<<"Nr. :";
cin>>nr;
int i, j;
//urmeaz citirea elementelor unei matrici
for (i=0; i<nr; i++)
for (j=0; j<nr; j++)
{
cout<<"A["<<i<<","<<j<<"]=";

//afiarea unui mesaj prealabil citirii

cin>>A[i][j];
}
//urmeaz afiarea elementelor matricii
for (i=0; i<nr; i++) {
for (j=0; j<nr; j++)
cout<<A[i][j]<<' ';
cout<<'\n';

// dup afiarea elementelor unei linii, se face saltul la linia urmtoare}}

Probleme propuse

1. S se scrie programul care citete de la tastatur o matrice cu n linii i n coloane (cel mult 20
linii i 20 coloane) i s se calculeze suma elementelor pozitive din matricea astfel citit.
Programul surs:
#include<iostream>
using namespace std;
int main()
{
int a[20][20],i,j,n,s=0;
cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>0)
s=s+a[i][j];
cout<<"s="<<s<<endl;
return 0;
}

Implementarea programului n mediul de programare CodeBlocks:

Rularea i afiarea rezultatului:

Se va afia suma elementelor pozitive puse n matrice, adic, pentru datele introduce,
3+13+19+10+12=57.

2. S se citeasc de la tastatur o matrice cu maximum 10 linii si 10 coloane, s se afieze pe


ecran i s se calculeze urma ei, daca este cazul. Altfel, s se afieze un mesaj corespunztor.
Programul surs:
#include<iostream>
using namespace std;
int main()
{
int a[20][20],i,j,n,m,tr=0;
cout<<"Numarul de linii=";
cin>>n;
cout<<"Numarul de coloane=";
cin>>m;
if(m!=n)
cout<<"Matricea nu este patratica. Nu se poate calcula urma."<<endl;
else
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
cout<<"Matricea este:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
for(i=1;i<=n;i++)
tr+=a[i][i];
cout<<"Urma matricei este: "<<tr<<endl;
return 0;}

Implementarea programului n mediul de programare CodeBlocks:

Rularea i afiarea rezultatului:


a) n cazul n care se poate calcula urma matricei:

b) n cazul n care nu se poate calcula urma matricei:

3. Se cere s se citeasc o matrice ptratic de cel mult 20x20 elemente i s se verifice daca
este simtetric fat de prima diagonal. S se afieze matricea pe ecran n ordinea invers a
citirii elementelor i s se enune un mesaj corespunztor n cazul existenei sau neexistenei
simetriei.
Programul surs:
#include<iostream>
using namespace std;
int main()
{
int a[20][20],i,j,n,ok;
cout<<"Numarul de linii=";
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]=";
cin>>a[i][j];
}
cout<<"Matricea, in ordinea inversa a citirii elementelor, este:"<<endl;
for(j=n;j>=1;j--)
{
for(i=n;i>=1;i--)
cout<<a[i][j]<<' ';
cout<<endl;
}
ok=1; //presupunem ca matricea este simetrica si intrerupem cautarea cand se dovedeste
contrariul
for(i=1;i<=n &&ok ;i++)
for(j=1;j<=n;j++)

if(a[i][j]!=a[j][i])
ok=0;
if(ok)
cout<<"Matricea este simetrica fata de prima diagonala"<<endl;
else
cout<<"Matricea nu este simetrica fata de prima diagonala"<<endl;
return 0;
}

Implementarea programului n mediul de programare CodeBlocks:

Rularea i afiarea rezultatului:

a) n cazul n care matricea este simetric:

b) n cazul n care matricea nu este simetric:

Cuprins

1. Definiie general...................................................................... 1
2. Proprieti ale zonelor speciale din matrici ptratice.............. 2
3. Modaliti de prelucrare a elementelor.................................... 3
4. Declararea tablourilor bidimensionale.................................... 4
5. Iniializarea elementelor unei matrici ptratice....................... 5
6. Citirea i afiarea unei matrici pe ecran.................................. 6
7. Probleme propuse..................................................................... 7
8. Cuprins..................................................................................... 15

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