Documente Academic
Documente Profesional
Documente Cultură
Tablouri
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 &
.
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; &
?