Sunteți pe pagina 1din 27

Introducere Definiie Declararea tabloului Iniializarea tabloului

Accesul la elemente
Operaii posibile

Numrul de variabile ce pot fi declarate i utilizate ntr-o aplicaie este limitat. Exist aplicaii care necesit memorarea i prelucrarea unor serii de sute i mii de valori. Accesarea unui numr mare de variabile este anevoios i generator de erori. Pentru a rezolva aceast problem au fost create structuri de date (colecii de date) specializate ce ocup spaii de memorie nvecinate i n care aranjarea lor este interdependent.

Memorarea i prelucrarea mediilor de absolvire pentru totalitatea elevilor unui liceu

Memorarea i identificarea numerelor de nmatriculare ale autovehiculelor dintr-un jude Evidena biletelor eliberate (vndute) ctre clieni cu ocazia unui spectacol de anvergur (de exemplul pe un stadion)

Structur de date creia i se atribuie un nume. Este format dintr-o colecie de elemente de acelai tip, dispuse contiguu ntr-un bloc de memorie. Elementele pot fi accesate individual prin indici sau ca un tot unitar. Toate elementele au un predecesor (excepie primul) i un succesor (excepie ultimul)

Tip_de_baz nume_tablou [dimensiune_max]


Tip_de_baz - precizeaz tipul datelor (ntregi, caracter, etc.)

Nume tablou identificator, precizeaz numele dat tabloului

Dimensiune max numrul maxim de componente (o constant ntreag) Dimensiune max = memoria fizic alocat. Dimens. logic dimens.max

vectorul (poate) conine 3 elemente de tip int vectorul (poate) conine 99 elem. vectorul (poate) conine 99 elem de tip float vectorul (poate) conine 3 elemente de tip char vectorul sir(poate) conine 11 elemente de tip char au fost declarai doi vectori a, b

tipul integer nu e definit in C++ max este declarat ca variabil n nume exist caracterul spaiu s-a folosit ca nume cuvntul rezervat char lungimea declarata este mai mare ca max[3]

vectorul (poate) conine 3 elemente de tip int vectorul conine elementele din acolad coninutul este indicat n acolad vectorul conine caracterele a, b ,c vectorul sir conine 6 elemente de tip char vectorul conine caracterele a, b

Se folosete numele tabloului urmat de indicele (numrul de ordine) elementului referit, nscris ntre paranteze ptrate. Ex. nume[indice]

12
V[0]

23
V[1]

34
V[2]

45
V[3]

Primul element din vector are numrul de ordine (indicele) zero ! Astfel, elementul cu numr de ordine 0 din vector este 12, elementul al 2-lea este 23 i elementul 45 este al 4-lea element din vector (are indicele 3).

Vectorul a fost declarat ca avnd lungimea max. max a fost declarat ca o constant avnd valoarea 99 Numrul de elemente n al vectorului se citete repetat n instruciunea do while atta timp ct valoarea citit este mai mare ca 99 n repetiia for, i se atribuie fiecrui element al vectorului valoarea i, astfel nct vectorul va avea forma : 1, 2 ,3 ,4 , ...n

#include<iostream.h> #include<conio.h> void main() { const max=99; int vec[max], i, n; clrscr(); do { cout<<"\nNr. elemente = "; cin>>n; } while (n>99); for ( i=0;i<n;i++) vec[i]=i; getche(); }

Numrul n de elemente al vectorului se citete de la tastatur n mod repetat atta timp ct numrul citit este mai mare ca 99 n repetiia for, se citete de la tastatur valoarea fiecrui element al vectorului (citirea se face simultan cu memorarea n vector) Afiarea se face n interiorul structurii repetitive for, ntre elementele vectorului fiind un spaiu liber (cout<<vec*i+<<" ;)

#include<iostream.h> #include<conio.h> void main() { int vec[999], i, n; clrscr(); do { cout<<"\nNr. elemente = "; cin>>n; } while (n>99); for ( i=0;i<n;i++) { cout<<"\nElementul = "; cin>>vec[i]; } cout<<"\nVectorul este : "; for (i=0; i<n; i++) cout<<vec[i]<<" "; getche(); }

Numrul n de elemente al vectorului se citete de la tastatur n repetiia for, se citete de la tastatur valoarea fiecrui element al vectorului (citirea se face simultan cu memorarea n vector) Pentru cutarea elementului k se parcurge vectorul i fiecare element al su se compar dac este egal cu k. Dac se gsete o egalitate, variabila este se modific din 0 n 1 i variabila poz memoreaz valoarea lui i (unde a fost gsit elementul). Afiarea se face funcie de este .

#include<iostream.h> #include<conio.h> void main() { int vec[999], i, n, este=0, k, poz; cout<<"\nNr. elemente = "; cin>>n; for ( i=0;i<n;i++) { cout<<"\nElementul = "; cin>>vec[i]; } cout<<"Cautam elementul : "; cin>>k; for (i=0;i<n;i++) if (vec[i]==k) { poz=i; este=1; } if (este == 1) cout<<Gasit pe pozitia "<<poz; else cout<<k<< nu e in vector"; getche(); }

Algoritmul presupune c vectorul este sortat anterior Cutarea se execut prin njumtiri repetate a intervalului de cutare rezultnd doi subvectori x*st+x*mij-1] i x*mij+1+x*dr+ (st = indicele primului element din stnga, dr = indice din dreapta, mij = indice element central) Algoritmul identific subvectorul n care poate fi elementul cutat divizndu-l succesiv dac este cazul, pn la gsirea elementului cutat sau pn cnd subvectorul nu mai poate fi divizat (elementul nu a fost gsit)

#include<iostream.h> #include<conio.h> void main() { int a[9]={3,5,6,7,8,9,19,99,101}, n=0, x, este=0, st=0, dr, mi; while (a[n+1]!=NULL) { cout<<a[n]<<" "; n++; } dr=n-1; cout<<"\nElementul cautat = "; cin>>x; while (st<=dr && !este) { mi=(st+dr)/2; if(a[mi]==x) este=1; else if (x<a[mi]) dr=mi-1; else st=mi+1; } if (st>dr) cout<<"Element negasit !"; else cout<<Gasit pe pozitia "<<mi+1; getch(); }

Variabila sum este iniializat cu 0 n repetiia do-while, se citete numrul de elemente n pn cnd acesea este mai mic ca 99 Simultan cu citirea elementelor vectorului (n repetiia for) suma se incrementeaz cu valoarea elementului de vector citit adic altfel scris : suma = suma + vec[i] La terminarea repetiiei, suma elementelor citite este afiat

#include<iostream.h> #include<conio.h> void main() { int vec[999], i, n, sum=0; clrscr(); do { cout<<"\nNr. elemente = "; cin>>n; } while (n>99); for ( i=0;i<n;i++) { cout<<"\nElementul = "; cin>>vec[i]; sum+=vec[i]; } cout<<"\nSuma elementelor = " <<sum; getche(); }

Variabila par este iniializat cu 0. Ea va numra cte elemente sunt pare n repetiia do-while, se citete numrul de elemente n pn cnd acesta este mai mic ca 99 Dup memorarea elementelor, parcurgem vectorul (cu repetiiafor) i comparm pentru fiecare element dac restul mpririi lui la 2 este 0. (vec[i] % 2 == 0). Dac da, (restul = 0) atunci nseamn c elementul este par i contorul par crete cu o unitate. Numr impare = total par

#include<iostream.h> #include<conio.h> void main() { int vec[999], i, n, par=0; clrscr(); do { cout<<"\nNr. elemente = "; cin>>n; } while (n>99); for ( i=0;i<n;i++) { cout<<"\nElementul = "; cin>>vec[i]; } for (i=0;i<n;i++) if (vec[i]%2 == 0) par++; cout<<"\nElem. pare = "<<par; cout<<"Elem. impare = "<<n-par; getche(); }

Variabilele min i max sunt iniializate cu valoarea primului element de vector vec[0]. Dup memorarea elementelor, parcurgem vectorul (cu repetiiafor) Comparm pentru fiecare element dac este mai mic ca min. Dac da, atunci acesta devine min min=vec[i]) Comparm i dac este mai mare ca max. Dac dac da, acestuia i se atribuie valoarea lui max (max=vec[i]). La terminarea parcurgerii, valorile min i max sunt afiate

#include<iostream.h> #include<conio.h> void main() { int vec[999], i, n, max, min; cout<<"\nNr. elemente = "; cin>>n; } for ( i=0;i<n;i++) { cout<<"\nElementul = " cin>>vec[i]; } max = min = vec[0]; for (i=0;i<n;i++) { if (vec[i]>max) max = vec[i]; if (vec[i]<min) min = vec[i]; } cout<<"\nElement max = "<<max; cout<<"\nElement min = "<<min; getche(); }

Vectorul este afiat folosind instruciunea while n mod repetat, atta timp ct elementul de afiat este diferit de NULL Variabila i reine lungimea vectorului, crescnd cu o unitate dup fiecare afiare (i++) Dup ultima afiare, lungimea vectorului crete cu o unitate, astfel se creaz o locaie suplimentar pentru adugarea unui element nou. Elementul ce se adaug la capt se introduce aadar pe poziia i (pe ultima poziie)

#include<iostream.h> #include<conio.h> void main() { int vec[]={1,2,3,4,5,6,7,8,9}, i=0; clrscr(); while (vec[i]!=NULL) { cout<<vec[i]<<" "; i++; } cout<<"Element = "; cin>>vec[i]; i=1; do { cout<<vec[i-1]<<" "; i++; } while (vec[i] != NULL); getche(); }

Vectorul este afiat folosind instruciunea while n mod repetat, atta timp ct elementul de afiat este diferit de NULL Variabila capat reine lungimea vectorului iniial i mrit cu o unitate, pentru a permite inseria Noul element se adaug pe poziia k Toate elementele, ncepnd de la capt, descresctor pn la k+1, sunt deplasate spre dreapta cu o poziie Fiind creat o locaie liber (indice k) aici se introduce noul element (vec[k])

#include<iostream.h> #include<conio.h> void main() { int vec[11]={1,2,3,4,5}, i=0, capat, k; clrscr(); while (vec[i]!=NULL) { cout<<vec[i]<<" "; i++; } capat=i+1; cout<<"Pozitia unde memoram = "; cin>>k; for (i=capat; i>=k; i--) vec[i]=vec[i-1]; cout<<"Elementul introdus = "; cin>>vec[k]; for (i=0;i<capat;i++) cout<<endl<< ; getche(); }

Vectorul este afiat folosind instruciunea while n mod repetat, atta timp ct elementul de afiat este diferit de NULL Variabila capat reine lungimea vectorului iniial, fiind i Elementul se terge de pe poziia k Fiecare element, ncepnd de la poziia k, pn la capat ia valoarea urmtorului element : vec[i]=vec[i+1] Prin suprascriere, elementele de la capt pn pe poziia k sunt deplasate spre stnga. Lungimea vectorului scade cu 1 (capat--)

#include<iostream.h> #include<conio.h> void main() { int vec[11]={1,2,3,4,5,6,7,8,9}, i=0, capat,k; while (vec[i]!=NULL) { cout<<vec[i]<<" "; i++; } capat=i; cout<<"Pozitia din care stergem = "; cin>>k; for (i=k;i<capat;i++) vec[i]=vec[i+1]; capat--; for (i=0; i<capat; i++) cout<< <<vec*i+ ; getche(); }

A sorta un vector nseamn a-l reordona dup anumite criterii. Criterii uzuale folosite n sortare : o numeric cresctor o numeric descresctor o alfabetic cresctor (A ... Z) o alfabetic descresctor (Z ... A) Exemplu tablou nesortat = {2, 7, 9, 1, 0, 5, 4} tablou sortat = {0, 1, 2, 4, 5, 7, 9} Exist mai multe metode de sortare bazate pe algoritmi diferii. n continuare sunt prezentate cteva metode utilizate n acest scop.

Sortare prin metoda bulelor Sortare prin inserie Sortare prin inserie direct Sortare prin numrare Sortare prin inserie rapid Sortare prin selecie direct

Elementele de vector se afiaz pn cnd elementul de afiat este NULL Variabilele: n= lungimea vectorului inv= variabil pentru inversarea elementelor, ok=comutator (iniial 1) Se parcurge vectorul i se compar elementele nvecinate. Dac elementul din stnga e mai mic dect vecinul din dreapta (vec[i]>vec[i+1]), ele se interschimb i comutatorul ok devine 0. Interschimbarea (a dou cte dou elemente) continu atta timp ct comutatorul ok este egal cu 0

#include<iostream.h> #include<conio.h> void main() { int vec[99]={7,5,29,9}, i=0, n, ok, inv; while (vec[i] != NULL) { cout<<vec[i]<<" "; i++; } n = i; do { ok=1; for (i=0;i<n-1;i++) if (vec[i]>vec[i+1]) { inv=vec[i]; vec[i]=vec[i+1]; vec[i+1]=inv; ok=0; } } while (ok==0); cout<<endl<<Vectorul sortat = ; for (i=0;i<n;i++) cout<<" "<<vec[i]; }

Metoda folosete doi vectori x i y Variabilele: l= lungime, i, j, k indici P1 - Se copiaz primul element din vectorul x n vectorul y. P2 - Pentru toat lungimea l a vectorului x, se compar elementul x[i] cu y[j] i dac x[i]>y[j] j crete cu 1 pentru a gsi urmtoarea poziie de inserare P3 - Se iniializeaz k cu i pe pentru a efectua creterea indicelui de inserie n vectorul cu elemente sortate y . P4 se insereaz n y[j] elementul x[i] n final, vectorul y este cresctor

#include<iostream.h> #include<conio.h> void main() { int x[9]={3,1,9,7,4}, y[9],i,j,l ,k; l=5; y[0]=x[0]; clrscr(); for (i=1;i<l;i++) { j=0; while (j<=i-1 && x[i]>y[j]) j++; for (k=i; k>=j+1;k--) y[k]=y[k-1]; y[j]=x[i]; } for (i=0;i<l;i++) cout<<" "<<y[i]; getch(); }

Metoda mparte vectorul n doi subvectori : surs x*i+x*l-1] i destinaie x*0+x*i-1] Variabila inv memoreaz elementul x[i] pe timpul deplasrii spre dreapta n interiorul vectorului destinaie Variabila i mparte vectorul n subvectori i la fiecare mprire crete cu 1 pn cnd are valoarea n-1 (subvectorul surs nu mai conine elemente) Variabila j se iniializeaz cu indicele ultimului element din subvectorul destinaie

#include<iostream.h> #include<conio.h> void main() { int x[9]={3,1,9,7,4}, i, j, l , inv; l=5; clrscr(); for (i=1;i<l;i++) { inv=x[i]; j=i-1; while (j>0 && inv<x[j]) { x[j+1]=x[j]; j--; } if (inv>=x[j]) x[j+1]=inv; else {x[1]=x[0]; x[0]=inv; } } for (i=0;i<l;i++) cout<<" "<<x[i]; getch(); }

Metoda folosete trei vectori sursa x, destinaie y i pentru contoare z Elementele din sursa x sunt copiate n y prin inserie Pentru a determina locul de inserie n y, este parcurs sursa x i se memoreaz n z pentru fiecare x[i] cte elemente sunt mai mici dect acesta Fiecare element din z este deci un contor pentru elementul corespunztor din x acesta fiind de fapt poziia de inserare a lui x[i] n vectorul destinaie (y (y[z[i]]) variabile : i, j = contoare, l=lungimea

#include<iostream.h> #include<conio.h> void main() { int x[9]={3,1,9,7,4}, y[9],z[9]={NULL},i ,j ,l ; l=5; clrscr(); for (i=0; i<l-1; i++) for (j=i+1; j<l; j++) if (x[i]>x[j]) z[i]++; else z[j]++; for (i=0; i<l; i++) y[z[i]]=x[i]; for (i=0; i<l; i++) cout<<" "<<y[i]; getch(); }

Metoda folosete mprirea vectorului n doi subvectori surs i destinaie ca la inseria direct Cutarea poziiei unde se insereaz elementul x[i] din subvectorul surs se face prin algoritmul de cutare binar. Astfel subvectorul destinaie se mparte n doi subvectori i se testeaz relaia dintre elementul de mijloc i elementul a[i] Se stabilete dac inseria are loc n dreapta sau stnga fa de mijloc Operaia de mprire a subvectorului continu pn se gsete poziia de inserat a lui a[i]

#include<iostream.h> #include<conio.h> void main() { int x[9]={3,1,9,7,4},i, j, l=5,inv, st, dr, mi; for (i=1;i<l;i++) { inv=x[i]; st=0; dr=i-1; while (st<dr) { mi=(st+dr)/2; if (inv<x[mi]) dr=mi-1; else st=mi+1; } j=i-1; while (j>=st) { x[j+1]=x[j]; j--; } x[st]=inv; } for (i=0;i<l;i++) cout<<" "<<x[i]; getch(); }

Variabilele: l= lungimea vectorului inv= variabil pentru inversarea elementelor, i i j= contoare Se parcurge vectorul i memoreaz pe prima poziie elementul cu valoarea cea mai mic Se parcurge vectorul i se memoreaz pe poziia urmtoare disponibil, urmtorul element cu valoarea cea mai mic din cele n-i elemente rmase nesortate valorile se inverseaz dac x[j]<x[i] Dac i >= l-1 (i crete la fiecare comparaie) sortarea se ncheie

#include<iostream.h> #include<conio.h> void main() { int x[9]={3,1,9,7,4}, i, j, l, inv; l=5; clrscr(); for (i=0;i<l-1;i++) for (j=i+1;j<l;j++) if (x[j]<x[i]) { inv=x[i]; x[i]=x[j]; x[j]=inv; } for (i=0;i<l;i++) cout<<" "<<x[i]; getch(); }

Intreclasarea presupune reuniunea a doi vectori care au fost sortai anterior. Algoritmul parcurge cei doi vectori surs a i b i compar elementele. Elementul determinat a avea valoarea cea mai mic din surs este memorat n vectorul destinaie c Operaia de comparare i memorare n destinaie continu pn cnd se ajunge la captul unuia dintre cele dou surse Elementele rmase n cellalt vector sunt memorate la captul vectorului destinaie c

#include<iostream.h> #include<conio.h> void main() { int a[9]={3,5,9,19,99}, b[9]={1,7,33}, c[99], i, j, n=5, m=3, k; i=0; j=0; k=0; while ((i<n) && (j<m)) { if (a[i]<b[j]) { c[k]=a[i]; i++; k++;} else { c[k]=b[j]; j++; k++; } } if (i<n) while (i<n) { c[k]=a[i]; k++; i++; } else while (j<m) { c[k]=b[i]; k++; j++; } for (i=0;i<k;i++) cout<<" "<<c[i]; getch(); }