Sunteți pe pagina 1din 9

Clasa a IX-a Tablouri

Cap.6 Tablouri
6.1 Declararea tablourilor
Un tablou reprezint un tip structurat de date care ocup o zon de memorie continu,cu elemente
componente de acelai tip. n cadrul tabloului un element este n mod unic identificat prin poziia ocupat n cadrul
structurii. Aceast poziie este definit prin unul sau mai muli indici sau indeci, din acest motiv tablourile
numindu-se variabile indexate.
Declararea unui tabou se face cu sintaxa
tip nume[dim_1][dim_]!!..[dim_n]"
unde
- tip este tipul elementelor componente ale tabloului. Acesta poate fi un tip predefinit sau definit de utilizator
- nume este numele variabilei tablou
- dim_1# dim_#!..#dim_n sunt numere ntre!i pozitive care exprim dimensiunile tabloului
"entru a utiliza un element din tablou se folosete sintaxa
nume[index_1][index_]!![index_n]
fiecare index respect#nd condiia index_i {$#!!#dim_i-1}.
Un tablou unidimensional se numete vector, iar un tablou bidimensional se numete matrice .
Exemple
char s[100];
int x[25];
long double a[10][15];
Observa ii
- primul element dintr-un vector va avea indexul $, iar ultimul element stocat va avea indexul dim-1
- primul element dintr-o matrice va avea indexul %$#$&, iar ultimul va avea indexul %dim_1-1#dim_-1&
- dimensiunile tabloului trebuie s fie expresii constante
- compilatorul nu face verificri pentru depirea dimensiunii tabloului
- pentru alocarea unui tablou sunt necesari nr_elemente'si(eo)%tip& octei, unde tip este tipul de baz al
tabloului
- atribuirea tablourilor nu poate fi fcut direct
Exemplu *
int x[10],y[10];
x=y; /*operaie ilegal*/
6. Ini+iali(area tablourilor
Declaraia unui tablou poate fi urmat de o secven de iniializare format din una sau mai multe perec$i
de acolade ntre care se pun valori ale tipului de baz, separate prin vir!ul.
"entru tablourile unidimensionale este permis omiterea numrului de elemente. %l va fi e!al cu numrul
de valori folosite la iniializare.
n cazul n care la iniializarea tablourilor de tip numeric sunt folosite mai puine elemente dec#t
dimensiunea tabloului, restul elementelor sunt iniializate cu &.
Exemple *
float x[5]={1.2,3.e3,!2,"0.#$!%,!%%.5e!#&;
char s[100]='test tablou';
short y[]={0,1,2,3,&; '( ) are * elemente ('
char s[]={(t),(e),(s),(t),(*0)&; '( c$ar s+,-.test./ ('
int x[5]={1,2&; '( x-01, 2, &, &, &3 ('
4niializarea unui tablou multidimensional se face asemntor cu cea a unui vector. 5e poate face
specificarea complet sau parial a datelor, cele nedefinite fiind iniializate cu &. %ste permis doar omiterea primei
dimensiuni 0cea din st#n!a3.
Exemple *
int a[3][2]={{1,2&,{3,&,{5,+&&;
ec$ivalent cu
1
Clasa a IX-a Tablouri
int a[][2]={{1,2&,{3,&,{5,+&&;
sau c$iar cu
int a[3][2]={1,2,3,,5,+&;
4niializarea
int ,[2][3]={{1&,{2&&;
este ec$ivalent cu
int m[][,]-..1#$#$/ # .#$#$//" ''elementele lips au fost iniializate cu &

Clasa a IX-a Tablouri


6., 0relucr1ri elementare ale vectorilor
Deoarece limba6ul 7 nu verific depirea dimensiunilor maxime declarate pentru tablourile utilizate n
aplicaii, pentru a evita scrierea accidental a unor zone de memorie, pro!ramatorul trebuie s asi!ure validarea
dimensiunilor reale 0implicit a numrului de elemente3 citite de la intrare. Uzual, un vector se declar n urmtoarea
manier
-define ./0 100 '( dimensiunea maxim admis ('
8888888888
int a[./0];
int n; '( dimensiunea real citit la intrare ('
cout112n='; cin33n;
6.,.1 Citirea elementelor unui vector
Dup validarea dimensiunii, citirea elementelor unui vector se face n ordinea cresctoare a indicilor, uzual
cu o instruciune for
for4int i=0; i1n; i556
{ cout112a[211i11']=';
cin337a[i];
&
Observa ie Dei tablourile sunt indexate n 7 ncep#nd de la &, se pot utiliza elementele numai de la indexul 1
0ca n "ascal3, elementul a[$] rm#n#nd liber. n aceast situaie secvena de citire 0i toate celelalte secvene de
prelucrare3 se vor modifica corespunztor, conform modelului de mai 6os
for4int i=1;i1=n;i556
{ cout112a[211i11']=';
cin33a[i];
&
6.,. Determinarea elementului minim2maxim
9etoda tipic de
determinare a elementului minim'maxim dintr-un vector este urmtoarea se iniializeaz minimul'maximul cu
primul element din vector apoi se compar cu celelalte elemente din vector rein#ndu-se, pe r#nd, valorile mai
mici'mai mari.
,ini,=a[1]; '( maxim-a+1,/ ('
for4i=2; i1=n; i556
if4,ini,3a[i]6 '( 0maxim:a+i,3 ('
,ini,=a[i]; '( maxim-a+i,/ ('
6.,., Determinarea primului element cu o anumit1 proprietate
"entru a determina primul element 0de indice minim3 cu o anumit proprietate, se parcur!e vectorul de la
st#n!a la dreapta p#n c#nd !sim primul element cu proprietatea cerut sau p#n c#nd epuizm elementele
vectorului. De exemplu, determinarea primului element nul dintr-un vector se realizeaz cu secvena
f=!1;
for48=1;81=n;8556
if49a[8]6
{ f=8; brea:; &

;erific#nd valoarea variabilei ) decidem dac n vectorul exist cel puin un element cu proprietatea cerut
0)-indicele acestuia3 sau nici unul 0) --13.
,
Clasa a IX-a Tablouri
6.,.3 Determinarea ultimului element cu o anumit1 proprietate
"entru a determina ultimul element 0de indice maxim3 cu o anumit proprietate, se parcur!e vectorul de la
dreapta spre st#n!a 0n ordinea descresctoare a indicilor3 p#n c#nd !sim primul element cu proprietatea cerut
sau p#n c#nd epuizm elementele vectorului. De exemplu, determinarea ultimului element par dintr-un vector se
realizeaz cu secvena
f=!1;
for48=n;83=1;8!!6
if494a[8];266
{ f=8; brea:; &
6.,.4 5liminarea tuturor elementelor cu o anumit1 proprietate
7ea mai simpl metod de a elimina dintr-un vector toate elementele cu o anumit proprietate este s
crem un nou vector n care se pstreaz elementele care nu au proprietatea respectiv. De exemplu, pentru a
elimina dintr-un vector toate elementele ne!ative, putem utiliza secvena
8=0;
for4i=1;i1=n;i556
if4a[i]3=06 '( nu are proprietatea cerut ('
b[558]=a[i]; '( pstram elementul n vectorul b ('
n=8; '( actualizm dimensiunea vectorului ('
9etoda este ineficient datorit consumului de memorie necesar pentru vectorul b. < metod mult mai eficient
este s folosim acelai vector n care vom =n!rmdi. pe primele poziii elementele care trebuie pstrate. "rin
actualizarea dimensiunii vectorului, elementele de prisos nu vor mai fi luate n consideraie n prelucrrile ulterioare.
5ecvena care realizeaz aceast operaie este urmtoarea
8=0;
for4i=1;i1=n;i556
if4a[i]3=0& '( nu are proprietatea cerut ('
a[558]=a[i]; '( mutm elementul la nceputul vectorului ('
n=8; '( actualizm dimensiunea vectorului ('
6.,.6 5liminarea elementului din po(i+ia 6 dat1 %17-67-n&
"rin eliminarea elementului din poziia 6 dat 0elementul de indice 6-13, se observ c primele 6-1
elemente rm#n nesc$imbate, n timp ce elementele din poziiile 681, 68,88.,n se deplaseaz cu o poziie spre
st#n!a pentru a >umple. !olul rmas prin eliminarea elementului din poziia 6. %vident, dimensiunea vectorului
scade cu o unitate
for48=:;81=n!1;8556 a[8]=a[851];
'( deplasm elementele spre st#n!a ('
n!!; '( corectm dimensiunea ('
6.,.9 Inserarea unui element : ;n po(i+ia 6 dat1 %17-67-n&
7um inserarea unui element se face fr a pierde vreun element din vectorul iniial, elementele din poziiile
6, 681,.......n trebuie s se deplaseze cu o poziie spre dreapta pentru a face loc noii valori : introdus n poziia 6
0indice 6-13. Dimensiunea vectorului crete cu o unitate
for48=n51;83=:51;8!!6 a[8]=a[8!1];
'( deplasm elementele spre dreapta ('
a[:]=y; '( inserm elementul ) ('
n55; '( actualizm dimensiunea ('
3
Clasa a IX-a Tablouri
6.,.< 0ermutarea circular1 cu o po(i+ie spre st=n>a
"rin acest operaie, elementele din poziiile #,#!!..#n se deplaseaz cu o poziie spre st#n!a i
elementul din prima poziie a6un!e n poziia n. ;ectorul nu i modific dimensiunea
aux=a[1]; '(salvm temporar primul element ('
for48=10;81=n!1;8556 a[8]=a[851];
'( deplasm elementele spre st#n!a ('
a[n]=aux; '( mutm elementul n ultima poziie ('
6.,.? 0ermutarea circular1 cu o po(i+ie spre dreapta
"rin aceast operaie, elementele din poziiile 1##!!#n-1 se deplaseaz cu o poziie spre dreapta, iar
elementul din poziia n a6un!e n poziia 1. ;ectorul nu i modific dimensiunea
aux=a[n]; '( salvm temporar ultimul element ('
for48=n;83=2;8!!6 a[8]=a[8!1];
'(deplasm elementele spre dreapta ('
a[1]=aux; '( mutm elementul n prima poziie ('
6.,.1$ @ortarea vectorilor
"rin sortare se nele!e aran6area elementelor unui vector n ordine cresctoare sau descresctoare.
"entru rezolvarea acestei probleme au fost concepui diveri al!oritmi, mai mult sau mai puin rapizi, mai simpli sau
extrem de complicai. n acest moment vom aborda dou dintre cele mai simple metode de sortare de complexitate
n

.
A& Betoda bulelor %bubblesort&
7onform acestei metode, vectorul este parcurs de la st#n!a spre dreapta compar#ndu-se perec$i de
elemente succesive 0a[C] cu a[C81]3. Dac cele dou elemente nu sunt n ordinea cerut, se intersc$imb i, o
variabil iniial e!al cu &, se incrementeaz. n acest fel, la prima parcur!ere a vectorului, elementul maxim din ir
0dac se face ordonare cresctoare3 se deplaseaz spre dreapta p#n c#nd a6un!e n ultima poziie. ?a a doua
parcur!ere a vectorului , al doilea cel mai mare element a6un!e n penultima poziie etc. "arcur!erea vectorului se
reia p#n c#nd nu mai !sim nici-o perec$e de elemente consecutive neordonate. ?a fiecare parcur!ere, lun!imea
secvenei care se verific scade cu o unitate
:=n; '( iniial verificm tot vectorul ('
do{
f=0; '( numr perec$ile neordonate ('
for48=1;81=:!1;8556
if4a[8]3a[851]6 '( pentru ordonare cresctoare ('
{ aux=a[8]; a[8]=a[851];
a[851]=aux; '( intersc$imbm elementele ('
f55; '( numrm in f ('
&
:!!; '( lun!imea secvenei care se verific scade ('
&<hile4f6; '( repet c#t timp mai sunt perec$i neordonate ('

D&@ortarea prin selec+ie direct1
7onform acestei metode primul element 0a[$]3 se compar pe r#nd cu toate elementele de dup el i dac
ordinea de sortare nu este respectat, cele dou elemente se intersc$imb. Dup efectuarea tuturor comparaiilor,
n prima poziie a6un!e cel mai mic element din vector 0n cazul ordonrii cresctoare3. 5e compar apoi al doilea
element cu toate elementele de dup el etc. ?a ultimul pas se compar numai ultimele dou elemente. 5ecvena
corespunztoare de pro!ram este
for4i=1; i1=n!1; i556 '( elementul care se compar ('
for48=i51;81=n;8556 '( elem. de dup el cu care se compar ('
if4a[i]3a[8]6 '( pentru ordonare cresctoare ('
{ aux=a[i]; a[i]=a[8];
a[8]=aux; '( intersc$imbm elementele (' &
4
Clasa a IX-a Tablouri
6.,.11 Al>oritmul de c1utare binar1
5e consider un vector oarecare A cu n elemente i o valoare x. 5e cere s se verifice dac x apare
printre elementele vectorului sau nu. Dac lucrm cu un vector oarecare, se vor compara pe r#nd elementele
acestuia cu valoarea cutat x. 5unt necesare cel mult n comparaii n caz de succes 0x apare n vector3 i exact n
comparaii n caz de eec 0x nu apare n vector3. n cazul n care vectorul este ordonat cresctor sau descresctor
se poate folosi un al!oritm de cutare mult mai eficient av#nd complexitatea lo>n. Acest al!oritm se numete
>algoritmul de cutare binar. i poate fi descris astfel iniial se consider tot vectorul A i se compar x cu
elementul din mi6locul acestuia 0fie el a[miC]3. Dac x-a[miC], al!oritmul se nc$eie cu succes/ dac x7a[miC],
vectorul fiind ordonat, cutarea va continua n prima 6umtate, iar dac xEa[miC] cutarea va continua n a doua
6umtate. "rocedeul se repet p#n c#nd fie !sim valoarea x, fie nu mai avem secven valid de cutare, adic
elemente neverificate. 5ecvena curent n care se face cutarea elementului x este identificat prin indicele
elementului din extrema st#n!, respectiv indicele elementului din extrema dreapt. 5ecvena de pro!ram este
urmtoarea
f=!1; '( x nu a fost !sit n vectorul A ('
st=1; dr=n; '( secvena iniial de cutare este ntre!ul vector A ('
<hile4st1=dr6
'( secvena curent de cutare conine cel puin un element ('
. ,i8=4st5dr6=2;
'( indicele elementului din mi6locul secvenei de cutare ('
if4a[,i8]==x6
{ f=,i8; '( memorm poziia n care apare ('
brea:; '( cutare nc$eiat cu succes ('
&
if4x1a[,i8]6
dr=,i8!1; '( cutarea continu n prima 6umtate ('
else
st=,i851; '( cutarea continu n a doua 6umtate ('
&
6.,.1 Interclasarea vectorilor
5e consider doi vectori, A cu m elemente i D cu n elemente, ambii ordonai cresctor sau descresctor.
A interclasa cei doi vectori nseamn a obine un vector C cu m8n elemente, care conine toate elementele din A i
din D, ordonate n acelai mod. 9etoda de creare a vectorului rezultat C este foarte simpl se compar elementul
curent din A cu elementul curent din D, n C se introduce spre exemplu cel mai mic dintre ele 0la ordonare
cresctoare3. Dac elementul introdus a fost din vectorul A atunci se avanseaz la urmtorul element din A, altfel
se avanseaz la urmtorul element din vectorul D. n momentul n care elementele unui vector sunt epuizate,
elementele rmase n cellalt vector sunt copiate direct n vectorul 7. Acest al!oritm se simplific dac folosim
dou >santinele. care vor face ca cei doi vectori s se epuizeze simultan. < santinel este un element care nu
influeneaz valoarea unui rezultat, scopul utilizrii lui fiind numai obinerea unui al!oritm mai simplu i mai eficient.
n cazul al!oritmului de interclasare, vom adu!a la sf#ritul vectorului A o santinel mai mare dec#t cel mai mare
element din D, iar la sf#ritul vectorului D o santinel mai mare dec#t cel mai mare element din A. n acest caz,
dac presupunem c toate elementele utile din vectorul A au fost de6a introduse n vectorul rezultat C# atunci, toate
elementele utile din D care nu au fost nc verificate sunt mai mici dec#t santinela rmas n A i vor fi copiate
automat, fr nici-o verificare suplimentar, n vectorul rezultat C. 5ecvena care realizeaz interclasarea cu
santinele este
a[,]=b[n1]51;
'( santinela din A mai mare dec#t cel mai mare element din @ ('
b[n]=a[,1]51;
'( santinela din @ mai mare dec#t cel mai mare element din A ('
i=1; '( indicele elementului curent din A ('
8=1; '( indicele elementului curent din @ ('
for4:=1; :1=,5n; :556 '( A este indicele elementului curent din 7 ('
if4a[i]1b[8]6 '( pentru ordonare cresctoare ('
c[:]=a[i55]; '( avansez n vectorul A ('
6
Clasa a IX-a Tablouri
else
c[:]=b[855]; '( avansez n vectorul @ ('
9
Clasa a IX-a Tablouri
6.3 0relucr1ri elementare ale matricilor
7a i n cazul tablourilor unidimensionale, se pune problema depirii dimensiunilor maxime specificate n
declaraia unui tablou bidimensional 0matrice3. 9atricile sunt de dou tipuri dreptun!$iulare 0numrul de linii diferit
de numrul de coloane3 i ptratice 0numrul de linii e!al cu numrul de coloane3.
"entru matricile dreptun!$iulare maniera uzual de declarare i validare a dimensiunilor este urmtoarea
-define ./0>?@ # '( numrul maxim de linii ('
-define ./0AB> 5 '( numrul maxim de coloane ('
int a[./0>?@][./0AB>];
int ,,n; '( numrul real de linii, respectiv coloane ('
!!!!!!!!!!!!
cout112nu,arul de linii='; cin33,;
cout112nu,arul de coloane='; cin33n;
"entru o matrice ptratic maniera uzual de declarare i validare a dimensiunii este urmtoarea
-define C?. %
int a[C?.][C?.];
int n; '( dimensiunea real a matricii ('
DDDDDDDDDDDDD..
cout112di,ensiunea ,atricii='; cin33n;
%ste bine de tiut c memorarea matricilor se face pe linii 0ordine lexico!rafic3, adic compilatorul rezerv
pentru matrice o zon conti!u de memorie de dimensiune BAXFIG'BAXCHF'si(eo)%tip&, unde tip este tipul de
baz al matricii, adic tipul elementelor componente. "rimele BAXCHF locaii din aceast zon sunt pentru
elementele din prima linie 0de indice &3, c$iar dac nu toate sunt folosite, urmtoarele BAXCHF locaii sunt
rezervate pentru elementele din a doua linie 0de indice 13 etc. "ractic, n memorie, matricea este liniarizat sub
forma unui vector cu BAXFIG'BAXCHF elemente, unele din aceste elemente put#nd fi neutilizate. Baionamentul
se aplic identic pentru matricile ptratice, numrul de elemente fiind DIB'DIB 0dimensiunea matricii3.
n continuare, vom considera cazul !eneral al matricilor dreptun!$iulare, secvenele de instruciuni trebuind
modificate corespunztor pentru a lucra corect cu matricile ptratice 0m-n-dimensiunea matricii3.
6.3.1 Citirea elementelor unei matrici
Deoarece memorarea matricilor se face pe linii, elementele se citesc pe linii, adic indicele de coloan se
modific mai rapid dec#t indicele de linie. 5ecvena corespunztoare de pro!ram este urmtoarea
for4i=1;i1=,;i556 '( indicele de linie ('
for48=1;81=n;8556 '( indicele de coloan ('
{ cout112a[211i11','11811']=';
cin33a[i][8];
&
6.3. Tip1rirea elementelor unei matrici
Dac dorim s tiprim matricea cu valorile de pe aceeai coloan aliniate spre exemplu la dreapta, vom
folosi facilitile de aliniere i de specificare a numrului de zecimale 0pentru valori reale3 ale funciei cout77. 5pre
exemplu, tiprirea unei matrici de numere reale cu valorile aliniate la dreapta i trei zecimale exacte se poate
realiza cu secvena
for4i=1;i1=,;i556
{ for48=1;81=n;8556
cout11a[i][8]11' 2;
'( tiprete elementele de pe o linie ('
cout11endl; '( trece la o linie nou ('
&
<
Clasa a IX-a Tablouri
6.3., Determinarea elementului maxim2minim
9etoda uzual este urmtoarea se iniializeaz maximul'minimul cu primul element din matrice 0a[$][$]3,
se compar apoi pe r#nd cu toate elementele din matrice i se reine valoarea mai mare'mai mic. 5ecvena de
instruciuni care realizeaz acest lucru este urmtoarea
,axi,=a[1][1]; '( minim-a+1,+1, ('
for4i=1;i1=,;i556
for48=1;81=n;8556
if4,axi,1a[i][8]6 '( minimCa+i,+6, ('
,axi,=a[i][8]; '( minim-a+i,+6, ('
6.3.3 Identi)icarea elementelor speci)ice unei matrici p1tratice
n cazul matricilor ptratice se identific urmtoarele elemente specifice dia!onala principal 0 D03,
dia!onala secundar 0D@3, 6umtatea superioar 0I@3 i 6umtatea inferioar 0II3. Dia!onalele corespund
0!eometric3 dia!onalelor unui ptrat.
Dia!onala principal cuprinde elementele din colul st#n!a sus p#n n colul dreapta 6os, adic mulimea
D0-.aiCJ i-C# i-1#!..n/-. a11# a# !!!!!!.#ann/ unde n este dimensiunea real a matricii.
Dia!onala secundar cuprinde elementele din colul dreapta sus p#n n colul st#n!a 6os, adic mulimea
D@-.aiCJi-1#!n # C-n#n-1#n-#!1# i8C-n81/-.a1n# an-1#!!..#an1/
Dumtatea superioar cuprinde elementele de deasupra dia!onalei principale 0fr cele de pe D03, adic mulimea
I@-.aiC J i-1#!!!n-1 # C-i81#!!!!!!!#n/
Dumtatea inferioar cuprinde elementele de sub dia!onala principal 0fr elementele de pe D03, adic mulimea
II-.aiC J i-#!!!.n # C-1#!!!i-1/
Un element a[i][C] din I@ are drept simetric elementul a[C][i] din II. Astfel, transpusa unei matrici ptratice 0matricea
care are liniile drept coloane i reciproc3 se poate !enera uor intersc$imb#nd toate elementele din I@ cu
simetricele lor din II aa cum se vede n secvena de mai 6os
for4i=1; i1=n!1; i556
for48=i51; 81=n; 8556
{ aux=a[i][8]; a[i][8]=a[8][i]; a[8][i]=aux; &

?

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