Documente Academic
Documente Profesional
Documente Cultură
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
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:
Î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ță
î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.
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++)
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:
Parcurgerea liniei x
Parcurgerea coloanei x
Temă
Ușoare: #767, #658, #2807, #2825, #2800
Medii: #659, #770, #772, #776, #778
Concurs: #1584, #1699, #1129, #1218, #1980