2. Introducere
Definiie
Declararea tabloului
Iniializarea tabloului
Accesul la elemente
Operaii posibile
3. Memorarea i prelucrarea mediilor de absolvire pentru
totalitatea elevilor unui liceu
!
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 identificarea numerelor de 樽nmatriculare ale
autovehiculelor dintr-un jude
Evidena biletelor eliberate (v但ndute) ctre clieni cu ocazia
unui spectacol de anvergur (de exemplul pe un stadion)
4. 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)!
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)
Dimensiune max = memoria fizic alocat. Dimens. logic dimens.max
5. 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
vectorul (poate) conine 3 elemente de tip int
6. tipul integer nu e definit in C++
max este declarat ca variabil
樽n nume exist caracterul spaiu
s-a folosit ca nume cuv但ntul rezervat char
lungimea declarata este mai mare ca max[3]
7. 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
vectorul (poate) conine 3 elemente de tip int
8. 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).
V[0] V[1] V[2] V[3]
12 23 34 45
Se folosete numele tabloului urmat de indicele (numrul de ordine)
elementului referit, 樽nscris 樽ntre paranteze ptrate. Ex. nume[indice]
10. #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();
}
Vectorul a fost declarat ca av但nd
lungimea max.
max a fost declarat ca o constant
av但nd valoarea 99
Numrul de elemente n al
vectorului se citete repetat 樽n
instruciunea do while at但ta timp c但t
valoarea citit este mai mare ca 99
n repetiia for, i se atribuie fiecrui
element al vectorului valoarea i, astfel
樽nc但t vectorul va avea forma :
1, 2 ,3 ,4 , ...n
11. #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
mod repetat at但ta timp c但t 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+<<" ;)
12. #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();
}
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 .
13. #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();
}
Algoritmul presupune c vectorul
este sortat anterior
Cutarea se execut prin 樽njumtiri
repetate a intervalului de cutare
rezult但nd doi subvectori x*st+x*mij-1]
i x*mij+1+x*dr+ (st = indicele primului
element din st但nga, dr = indice din
dreapta, mij = indice element central)
Algoritmul identific subvectorul 樽n
care poate fi elementul cutat
diviz但ndu-l succesiv dac este cazul,
p但n la gsirea elementului cutat sau
p但n c但nd subvectorul nu mai poate fi
divizat (elementul nu a fost gsit)
14. #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 sum este iniializat cu 0
n repetiia do-while, se citete
numrul de elemente n p但n c但nd
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
15. #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();
}
Variabila par este iniializat cu 0.
Ea va numra c但te elemente sunt pare
n repetiia do-while, se citete
numrul de elemente n p但n c但nd
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
16. #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();
}
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
17. #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,
at但ta timp c但t elementul de afiat este
diferit de NULL
Variabila i reine lungimea
vectorului, cresc但nd 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)
18. #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,
at但ta timp c但t 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, 樽ncep但nd de la
capt, descresctor p但n la k+1, sunt
deplasate spre dreapta cu o poziie
Fiind creat o locaie liber (indice k)
aici se introduce noul element (vec[k])
19. #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();
}
Vectorul este afiat folosind
instruciunea while 樽n mod repetat,
at但ta timp c但t elementul de afiat este
diferit de NULL
Variabila capat reine lungimea
vectorului iniial, fiind i
Elementul se terge de pe poziia k
Fiecare element, 樽ncep但nd de la
poziia k, p但n la capat ia valoarea
urmtorului element : vec[i]=vec[i+1]
Prin suprascriere, elementele de la
capt p但n pe poziia k sunt deplasate
spre st但nga.
Lungimea vectorului scade cu 1
(capat--)
20. Sortare prin metoda bulelor
Sortare prin inserie
Sortare prin inserie direct
Sortare prin numrare
Sortare prin inserie rapid
Sortare prin selecie direct
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 c但teva
metode utilizate 樽n acest scop.
21. #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];
}
Elementele de vector se afiaz p但n
c但nd 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 st但nga e mai mic dec但t vecinul din
dreapta (vec[i]>vec[i+1]), ele se
interschimb i comutatorul ok
devine 0.
Interschimbarea (a dou c但te dou
elemente) continu at但ta timp c但t
comutatorul ok este egal cu 0
22. #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 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
23. #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 樽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 p但n c但nd are valoarea n-1
(subvectorul surs nu mai conine
elemente)
Variabila j se iniializeaz cu indicele
ultimului element din subvectorul
destinaie
24. #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 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] c但te
elemente sunt mai mici dec但t 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
25. #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();
}
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 st但nga fa de mijloc
Operaia de 樽mprire a
subvectorului continu p但n se
gsete poziia de inserat a lui a[i]
26. #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();
}
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
27. #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();
}
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 p但n c但nd se
ajunge la captul unuia dintre cele
dou surse
Elementele rmase 樽n cellalt vector
sunt memorate la captul vectorului
destinaie c