Sunteți pe pagina 1din 7

Clasa a X-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_2] ..[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_2" .."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_2] [index_n] fiecare index respect#nd condiia index_i ia valori n intervalul #" "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]; Observaii - 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_2-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.2 *ni+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

Clasa a X-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[2][,]-..1"#"#/ " .2"#"#//! ''elementele lips au fost iniializate cu &

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']='; cin33a[i]; & Observaie 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.,.2 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; for47=1;71=n;7556 if48a[7]6 { f=7; brea9; &

Clasa a X-a

Tablouri

;erific#nd valoarea variabilei ( decidem dac n vectorul exist cel puin un element cu proprietatea cerut 0(-indicele acestuia3 sau nici unul 0( --13.

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; for47=n;73=1;7!!6 if484a[7]:266 { f=7; brea9; &

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 7=0; for4i=1;i1=n;i556 if4a[i]3=06 '( nu are proprietatea cerut (' b[557]=a[i]; '( pstram elementul n vectorul b (' n=7; '( 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 7=0; for4i=1;i1=n;i556 if4a[i]3=0% '( nu are proprietatea cerut (' a[557]=a[i]; '( mutm elementul la nceputul vectorului (' n=7; '( 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, 682,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 for47=9;71=n!1;7556 a[7]=a[751]; '( deplasm elementele spre st#n!a (' n!!; '( corectm dimensiunea ('

6.,.9 *nserarea 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 for47=n51;73=951;7!!6 a[7]=a[7!1]; '( deplasm elementele spre dreapta (' a[9]=y; '( inserm elementul ) (' n55; '( actualizm dimensiunea ('

Clasa a X-a

Tablouri

6.,.< 0ermutarea circular1 cu o po'i+ie spre st=n>a


"rin acest operaie, elementele din poziiile 2"," .."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 (' for47=1;71=n!1;7556 a[7]=a[751]; '( 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"2" "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 (' for47=n;73=2;7!!6 a[7]=a[7!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 n2 . 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 9=n; '( iniial verificm tot vectorul (' do{ f=0; '( numr perec$ile neordonate (' for47=1;71=9!1;7556 if4a[7]3a[751]6 '( pentru ordonare cresctoare (' { aux=a[7]; a[7]=a[751]; a[751]=aux; '( intersc$imbm elementele (' f55; '( numrm in f (' & 9!!; '( 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 (' for47=i51;71=n;7556 '( elem. de dup el cu care se compar (' if4a[i]3a[7]6 '( pentru ordonare cresctoare ('

Clasa a X-a { &

Tablouri aux=a[i]; a[i]=a[7]; a[7]=aux; '( intersc$imbm elementele ('

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 0 x 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>2n. 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 (' . ,i7=4st5dr6<2; '( indicele elementului din mi6locul secvenei de cutare (' if4a[,i7]==x6 { f=,i7; '( memorm poziia n care apare (' brea9; '( cutare nc$eiat cu succes (' & if4x1a[,i7]6 dr=,i7!1; '( cutarea continu n prima 6umtate (' else st=,i751; '( cutarea continu n a doua 6umtate (' &

6.,.12 *nterclasarea 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 (' 7=1; '( indicele elementului curent din @ (' for49=1; 91=,5n; 9556 '( A este indicele elementului curent din 7 ('

Clasa a X-a

Tablouri

if4a[i]1b[7]6 '( pentru ordonare cresctoare (' c[9]=a[i55]; '( avansez n vectorul A (' else c[9]=b[755]; '( avansez n vectorul @ ('

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 ./0@A= 5 '( numrul maxim de coloane (' int a[./0=>?][./0@A=]; 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 B>. % int a[B>.][B>.]; int n; '( dimensiunea real a matricii (' CCCCCCCCCCCCC.. 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 BAXF*G&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 BAXF*G&BAXCHF elemente, unele din aceste elemente put#nd fi neutilizate. Baionamentul se aplic identic pentru matricile ptratice, numrul de elemente fiind D*B&D*B 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 0 m-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 (' for47=1;71=n;7556 '( indicele de coloan (' { cout112a[211i11','11711']='; cin33a[i][7]; &

6.3.2 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 { for47=1;71=n;7556 cout11a[i][7]11' 2; '( tiprete elementele de pe o linie (' cout11endl; '( trece la o linie nou (' &

Clasa a X-a

Tablouri

6.3., Determinarea elementului maxim2minim


9etoda uzual este urmtoarea se iniializeaz maximul'minimul cu primul element din matrice 0 a[#][#]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 for47=1;71=n;7556 if4,axi,1a[i][7]6 '( minimCa+i,+6, (' ,axi,=a[i][7]; '( minim-a+i,+6, ('

6.3.3 *denti(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 0I*3. 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" a22" ."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-2" 1" i8C-n81/-.a 1n" a2n-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 I*-.aiC J i-2" .n " C-1" i-1/ Un element a[i][C] din I@ are drept simetric elementul a[C][i] din I*. 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 I* aa cum se vede n secvena de mai 6os for4i=1; i1=n!1; i556 for47=i51; 71=n; 7556 { aux=a[i][7]; a[i][7]=a[7][i]; a[7][i]=aux; &

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