Sunteți pe pagina 1din 6

Prof.

Mihaela Corina ILDEGEZ


Centru pentru pregătire pentru Performanță

Obiective:
Declarare
TABLOURI BIDIMENSIONALE Parcurgerea matricei în diferite
moduri
Prelucrare linie
Prelucrare coloane

Cuprins
Discutarea și analiza problemelor de la OJI 2019 clasa VI ...................................................................................................... 1
Tablouri bidimensionale ......................................................................................................................................................... 1
Declararea unei matrice ..................................................................................................................................................... 1
Spațiul de memorie ocupat de o matrice ........................................................................................................................... 3
Parcurgerea matricelor ....................................................................................................................................................... 3
Citirea matricei ................................................................................................................................................................... 3
Afișarea matricei ................................................................................................................................................................. 4
Diferite parcurgeri .............................................................................................................................................................. 4
Pe linii.............................................................................................................................................................................. 4
Pe coloane....................................................................................................................................................................... 4
Pe conturul exterior ........................................................................................................................................................ 5
Parcurgerea liniei x ......................................................................................................................................................... 6
Parcurgerea coloanei x ................................................................................................................................................... 6
Temă ....................................................................................................................................................................................... 6

Discutarea și analiza problemelor de la OJI 2019 clasa VI

Tablouri bidimensionale
Declararea unei matrice
Declararea tablourilor bidimensionale (matrice) 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:
tip_element numematrice[nrmaxlinii][nemaxcoloane];

de exemplu:
int a[10][20];

unde:

 int – reprezintă tipul elementelor matricei


Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

 a – reprezintă numele variabilei de tip tablou bidimensional


 10 – numărul maxim de linii(dimensiunea fizică)
 20 – numărul maxim de coloane(dimensiunea fizică)
Observații:
 Numărul maxim memorat în matrice va fi 10*20=200 de numere întregi, deci 200*4 octeți=800 de octeți
 A fel ca la tablouri unidimensionale matricea va avea alocat spațiu începând de la linia 0 până la linia 9,
deci în total 10 linii, iar pentru coloane de la coloana 0 până la coloana 19. Dacă însă dorim să prelucrăm
matrcea începînd cu linia 1 și coloana 1 vor trebui alocate suplimentar încă o linie și o coloană, iar
declararea matricei va fi:
int a[11][21];

 În acest caz vom lăsa nefolosite linia 0 și coloana 0, dar pe acestea putem însă memora informații
referitoare la elementele de pe fiecare linie/fiecare coloană fără a fi necesar în acest caz suplimentarea
spațiului de memorie cu doi vectori.
Dacă vom considera declarația de mai sus și numărul de linii curent al matricei va fi n=5, iar
numărul actual de coloane va fi m=8 atunci un exemplu de matrice poate fi:

Ce se observă?
 Dimensiunea logică a matricei este n=5 linii și m=8 coloane.
 Matricea dată ca exemplu are elementele ocupate începând cu linia 1 și coloana 1, linia 0 și coloana 0
sunt libere
 O linei din matrice are un număr de elemente egal cu numărul de coloane, respectiv o coloană din matrice
are un număr de elemente egal cu numărul de linii.
 Liniile sunt numerotate de sus în jos iar coloanele de la stânga la dreapta
 Elementul aflat la intersecția dintre linia 3 și linia 5 se numește a[3][5]. Deci la fel ca la vectori se face
referirea unui element din matrice folosind operatorul C++ de indexare [ ] , dar cu observația că în acest
caz se vor folosi doi:
o Primul reprezintă linia
o Al doilea reprezintă coloana pe care se găsește elemntul dorit în matrice
a[linie][coloana]
Cade în sarcina programatorului (adică tu!) să se asigure că valorile indicilor folosiți în expresiile de
indexare fac parte din intervalul corect, conform declarării tabloului. Dacă valorile indicilor nu sunt
corecte, comportamentul programului este impredictibil: rezultatele obținute vor fi eronate sau se vor
produce erori la execuția programului.
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

Spațiul de memorie ocupat de o matrice

De exemplu pentru declararea:


int a[1000][1000];
matricea poate memora 1000*1000 =1 000 000 de elemente de tip int. O variabilă de tip int ocupă 4 octeti(4
byte) deci putem deduce că tabloul bidimensional declarat mai sus ocupă 1 000 000 * 4 = 4 000 000 octeți(bytes),
deci, un pic mai puțin de 4 Mb.
Parcurgerea matricelor
Considerăm următoarea declarare:
int a[100][100], n, m;

în care am declarat o matrice cu maxim 100 de linii(0..99) și 100 de coloane(0..99) și am notat cu n numărul
logic(concret) de linii și cu m numărul de coloane
De regulă o matrice se parcurge pe linii de sus în jos și pe coloane de la stânga la dreapta.

for(int i=1;i<=n;i++) /// pentru fiecare linie de la 1 la n


for(int j=1;j<=m;j++) /// pentru fiecare elem de pe linia i de la col 1 la col m
… prelucreaza elementul curent a[i][j]
Citirea matricei
Se realizează în două etape:

 Pas 1: Citirea dimensiunii logice:


o n - număr de linii și
o m – număr de coloane
 Pas 2: elementele matricei se citesc folosind o parcurgere a liniilor de sus în jos și a coloanelor de la
stânga la dreapta

De la tastatură: Din fișierul text mat.in:


cin>>n>>m; ifstream f(”mat.in”);
for(int i=1;i<=n;i++) f>>n>>m;
for(int j=1;j<=m;j) for(int i=1;i<=n;i++)
cin>> a[i][j]; for(int j=1;j<=m;j)
f>> a[i][j];
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

Afișarea matricei
De la tastatură: Din fișierul text mat.out:
for(int i=1;i<=n;i++) ofstream g(”mat.out”);
{for(int j=1;j<=m;j) for(int i=1;i<=n;i++)
cout>> a[i][j]<<” ”; {for(int j=1;j<=m;j)
cout<<endl; g>> a[i][j]<<” ”;
} g<<endl;
}

Diferite parcurgeri
Pe linii
a. Alternativ pe linii – liniile se vor parcurge de sus în jos astfel:
 Dacă numărul liniei este impar atunci elementele ei vor fi parcurse de la stânga la dreapta
 Dacă numărul liniei este par atunci elementele ei vor fi parcurse de la dreapta la stânga
for(int i=1;i<=n;i++)
if (i%2==1) ///linie impară
for(int j=1;j<=m;j++)
… prelucreaza elementul curent a[i][j]
else
for(int j=m;j>=1;j--)
… prelucreaza elementul curent a[i][j]

Pe coloane
a. Fiecare coloană de la stânga la dreapta, iar în cadrul unei coloane de sus în jos

for(int j=1;j<=m;j++)///pt fiecare col de la 1 la m


for(int i=1;i<=n;i++)///pt fiecare elem de pe col
///j de la lin 1 la lin n
… prelucreaza elementul curent a[i][j]

b. Alternativ pe coloane - coloanele se parcurg de la stânga la dreapta astfel:


 Dacă numărul coloanei este impar coloana se va parcurge de sus în jos
 Dacă numărul de coloană este impar atunci aceasta se va parcurge de jos în sus
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

for(int j=1;j<=m;j++)
if (j%2==1) ///coloană impară
for(int i=1;i<=n;i++)
… prelucreaza elementul curent a[i][j]
else
for(int i=n;i>=1;i--)
… prelucreaza elementul curent a[i][j]

Pe conturul exterior
Prin conturul exterior al unui tablou bidimensional se înțelege :

 prima linie,
 ultima coloană,
 ultima linie,
 prima coloană.
Dacă elementele aflate pe contur trebuie doar prelucrate(adunate, numărate, verificate) atunci nu
contează ordinea în care parcurgem elementele de pe contur, dar trebuie avut grijă să nu luăm colțurile matricei
de două ori.
///prelucreaza prima si ultima linie
for(int j=1;j<=m;j++)
{… prelucreaza elementul curent a[1][j]
… prelucreaza elementul curent a[n][j]
}
///prelucreaza prima si ultima coloana
for(int i=2;i<=n-1;i++)
{… prelucreaza elementul curent a[i][1]
… prelucreaza elementul curent a[i][m]
}
Dar dacă cerința este să prelucrăm elementele aflate pe contur în sensul acelor de ceas atunci acestea trebuie
parcurse pe rând astfel:

 prima linie: de la stânga la dreapta,


 ultima coloană: de sus în jos,
 ultima linie: de la dreapta la stânga,
 prima coloană: de jos în sus
///parcurg prima linie de la stanga la dreapta
for(int j=1;j<=m-1;j++)
… prelucreaza elementul curent a[1][j]
///parcurg ultima coloană de sus în jos
for(int i=1;i<=n-1;i++)
… prelucreaza elementul curent a[i][m]
///parcurg ultima linie de la dreapta la stanga
for(int j=n;j>=2;j--)
… prelucreaza elementul curent a[n][j]
///parcurg ultima coloană de jos în sus
for(int i=n;i>=2;i--)
… prelucreaza elementul curent a[i][1]
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

Parcurgerea liniei x

///parcurg doar linia x de la stanga la dreapta


for(int j=1;j<=m;j++)
… prelucreaza elementul curent a[x][j]

Parcurgerea coloanei x

///parcurg doar colona x de sus în jos


for(int i=1;i<=n;i++)
… prelucreaza elementul curent a[i][x]

Temă
Ușoare: #767, #658, #2807, #2825, #2800
Medii: #659, #770, #772, #776, #778
Concurs: #1584, #1699, #1129, #1218, #1980

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