Sunteți pe pagina 1din 20

CURS 8

Tablouri unidimensionale - vectori


Tablouri unidimensionale (vectori)

• Introducere
• Definiție
• Declararea tabloului
• Inițializarea tabloului
• Accesul la elemente
• Operații posibile
Tablouri unidimensionale
 Numărul de variabile ce pot fi declarate și utilizate într-o aplicație
este limitat.
 Există aplicații care necesită memorarea și prelucrarea unor serii
de sute și mii de valori.
 Accesarea unui număr mare de variabile este anevoios și
generator de erori. Pentru a rezolva această problemă au fost
create structuri de date (colecții de date) specializate ce ocupă
spații de memorie învecinate și în care aranjarea lor este
interdependentă

Exemple
 Memorarea și prelucrarea mediilor de absolvire pentru totalitatea
elevilor unui liceu;
 Memorarea și identificarea numerelor de înmatriculare ale
autovehiculelor dintr-un județ;
 Evidența biletelor eliberate (vândute) către clienți cu ocazia unui
spectacol de anvergură.
 Structură de date căreia i se atribuie un nume.
 Este formată dintr-o colecție de elemente de acelasi tip, dispuse
într-un bloc de memorie.
 Elementele pot fi accesate individual prin indici sau ca un tot
unitar.
 Toate elementele au un predecesor (excepție primul) și un
succesor (excepție ultimul).
Sintaxa

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 – numărul maxim de componente (o constantă
întreagă)
Dimensiune max = memoria fizică alocată.
Dimens. logică ≤ dimens.max
Declararea tablourilor

int vec [3]; vectorul (poate) conține 3 elemente de tip int

const int max=99; int vec[max]; vectorul (poate) conține 99 elem.

float vec [99] ; vectorul (poate) conține 99 elem de tip float

char vec [3] ; vectorul (poate) conține 3 elemente de tip char

int sir[3*3+2] ; vectorul “sir”(poate) conține 11 elemente de tip char

int a[99], b[99] ; au fost declarați doi vectori a, b


Exemple incorecte de declarare pentru că :

integer vec [99] ; tipul integer nu e definit in C++

float vec [max] ; “max” este declarat ca variabilă

char vec 1 [3*9] ; în nume există caracterul “spațiu”

int char[99] ; s-a folosit ca nume cuvântul rezervat “char”

int char[3] ={“eroare”} ; lungimea declarata este mai mare ca


max[3]
Inițializarea tablourilor

int vec [3]; vectorul (poate) conține 3 elemente de tip int

int vec [3] = {5, 6, 7}; vectorul conține elementele din acoladă

float vec [] ={1.4, -2, 1.2e+2}; conținutul este indicat în acoladă

char vec [3] = {‘a’, ‘b’, ‘c’}; vectorul conține caracterele a, b ,c

char sir[]={“vector”} ; vectorul “sir” conține 6 elemente de tip char

char sir[3]={char(97), char(98)} ; vectorul conține caracterele a, b


Accesul la elementele tabloului
Se foloseste numele tabloului urmat de indicele (numărul de
ordine) elementului referit, înscris între paranteze pătrate. Ex.
nume[indice]

int vec [4] = {12, 23, 34, 45}; 12 23 34 45

Referirea la elemente V[0] V[1] V[2] V[3]

Primul element din vector are numărul de ordine (indicele) zero !


Astfel, elementul cu număr 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).
Operații posibile
 Inițializarea (generarea) tabloului unidimensional;
 Mememorarea și afișarea elementelor unui tablou;
 Parcurgerea și căutarea elementelor memorate în tablou;
 Prelucrarea elementelor tabloului (sume, medii , căutări,
maxime, verificări);
 Ștergerea sau adaugarea unui element din tablou;
 Sortarea elementelor unui tablou;
 Interclasarea (concatenarea) a doi vectori sortați anterior.
Generarea tabloului
• Vectorul a fost declarat ca
#include<iostream>
având lungimea “max”.
using namespace std;
• “max” a fost declarat ca o
main()
constantă având valoarea 99;
{const max=99;
•Numărul de elemente “n” al
int vec[max], i, n;
vectorului se citește repetat în
do { cout<<"\n Nr. elemente = ";
instrucțiunea do – while atâta
cin>>n;
timp cât valoarea citită este mai
}
mare ca 99;
while (n>99);
• În repetiția for, i se atribuie
for ( i=0; i<n; i++) vec[i]=i;
fiecărui element al vectorului
}
valoarea i, astfel încât vectorul
va avea forma : 1, 2 ,3 ,4 , ...n;
Crearea și afisarea tabloului

• Numărul “n” de elemente al


vectorului se citește de la
tastatură în mod repetat atâta
timp cât numărul citit este mai
mare ca 99
• În repetiția for, se citește de
la tastatură valoarea fiecărui
element al vectorului (citirea
se face simultan cu
memorarea în vector)
• Afișarea se face în interiorul
structurii repetitive “for”, între
elementele vectorului fiind un
spațiu liber (cout<<vec[i]<<" “;)
Căutarea unui element
#include<iostream>
using namespace std; • Numărul “n” de elemente al
main() vectorului se citește de la tastatură;
{ int vec[999], i, n, este=0, k, poz; • În repetiția for, se citește de la
cout<<"\nNr. elemente = "; tastatură valoarea fiecărui element
cin>>n; al vectorului (citirea se face
for ( i=0;i<n;i++) simultan cu memorarea în vector);
{ cout<<"\nElementul = "; • Pentru căutarea elementului “k”
cin>>vec[i]; } se parcurge vectorul și fiecare
cout<<"Cautam elementul : "; element al său se compară dacă
cin>>k; este egal cu “k”.
for (i=0;i<n;i++) • Dacă se găsește o egalitate,
if (vec[i]==k) { poz=i; variabila “este” se modifică din 0 în
este=1; } 1 și variabila “poz” memorează
if (este == 1) valoarea lui “i” (unde a fost găsit
cout<<“Gasit pe pozitia "<<poz; elementul).
else cout<<k<<“ nu e in vector"; • Afișarea se face funcție de
} “este” .
Căutarea binară în vector
#include<iostream>
using namespace std; • Algoritmul presupune că vectorul
main() este sortat anterior;
{ int a[9]={3,5,6,7,8,9,19,99,101}, • Căutarea se execută prin
n=0, x, înjumătățiri repetate a intervalului de
este=0, st=0, dr, mi;
căutare rezultând doi subvectori x[st]
while (a[n+1]!=NULL)
{ cout<<a[n]<<" "; n++; } …x[mij-1] și x[mij+1]…x[dr] (st =
dr=n-1; indicele primului element din stânga,
cout<<"\nElementul cautat = "; dr = indice din dreapta, mij = indice
cin>>x; element central);
while (st<=dr && !este) • Algoritmul identifică subvectorul în
{ mi=(st+dr)/2; care poate fi elementul căutat
if(a[mi]==x) este=1; divizându-l succesiv dacă este cazul,
else if (x<a[mi]) dr=mi-1; până la găsirea elementului căutat
else st=mi+1; }
sau până când subvectorul nu mai
if (st>dr) cout<<"Element negasit !";
else cout<<“Gasit pe pozitia poate fi divizat (elementul nu a fost
"<<mi+1; găsit).
}
Sume în tablou
• Variabila “sum” este inițializată
#include<iostream> cu 0;
using namespace std; • În repetiția do-while, se citește
main() numărul de elemente “n” până
{ int vec[999], i, n, sum=0;
când acesea este mai mic ca
do { cout<<"\nNr. elemente = ";
cin>>n; } 99;
while (n>99); • Simultan cu citirea
for ( i=0;i<n;i++) elementelor vectorului (în
{ cout<<"\nElementul = "; repetiția “for”) suma se
cin>>vec[i]; incrementează cu valoarea
sum+=vec[i]; } elementului de vector citit adică
cout<<"\nSuma elementelor = " altfel scris : suma = suma +
<<sum; vec[i];
} • La terminarea repetiției, suma
elementelor citite este afișată.
Numărarea unor elemente
#include<iostream> • Variabila “par” este inițializată
using namespace std; cu 0. Ea va număra câte
main() elemente sunt pare;
{ int vec[999], i, n, par=0; • În repetiția do-while, se citește
do { cout<<"\n Nr. elemente = "; numărul de elemente “n” până
cin>>n; } când acesta este mai mic ca 99;
while (n>99); • După memorarea elementelor,
for ( i=0;i<n;i++) parcurgem vectorul (cu
{ cout<<"\n Elementul = "; repetiția“for”) și comparăm
cin>>vec[i]; } pentru fiecare element dacă
for (i=0;i<n;i++) restul împărțirii lui la 2 este 0.
if (vec[i]%2 == 0) par++; (vec[i] % 2 == 0).
cout<<"\n Elem. pare = "<<par; • Dacă da, (restul = 0) atunci
cout<<"Elem. impare = "<<n- înseamnă că elementul este par
par; și contorul “par” crește cu o
} unitate.
• Număr impare = total – par.
Determinare min, max
#include<iostream> • Variabilele “min” și “max” sunt
using namespace std; inițializate cu valoarea primului
main() element de vector “vec[0]”.
{ int vec[999], i, n, max, min; • După memorarea elementelor,
cout<<"\nNr. elemente = "; parcurgem vectorul (cu
cin>>n; } repetiția“for”);
for ( i=0;i<n;i++) • Comparăm pentru fiecare element
{ cout<<"\nElementul = "
dacă este mai mic ca “min”. Dacă
cin>>vec[i]; }
max = min = vec[0];
da, atunci acesta devine “min”
for (i=0;i<n;i++) min=vec[i]);
{ if (vec[i]>max) max = vec[i]; • Comparăm și dacă este mai mare
if (vec[i]<min) min = vec[i]; } ca “max”. Dacă dacă da, acestuia i
cout<<"\nElement max = "<<max; se atribuie valoarea lui “max”
cout<<"\nElement min = "<<min; (max=vec[i]).
} • La terminarea parcurgerii, valorile
“min” și “max” sunt afișate;
Adaugare element la capăt

• Vectorul este afișat folosind


#include<iostream> instrucțiunea “while” în mod
using namespace std;
main() repetat, atâta timp cât elementul
{ int vec[]={1,2,3,4,5,6,7,8,9}, i=0; de afișat este diferit de NULL;
while (vec[i]!=NULL) • Variabila “i” reține lungimea
{ cout<<vec[i]<<" "; vectorului, crescând cu o unitate
i++; }
cout<<"Element = ";
după fiecare afișare (“i++”);
cin>>vec[i]; i=1; • După ultima afișare, lungimea
do { cout<<vec[i-1]<<" "; vectorului crește cu o unitate,
i++; } astfel se crează o locație
while (vec[i] != NULL); suplimentară pentru adăugarea
}
unui element nou.
• Elementul ce se adaugă la
capăt se introduce așadar pe
poziția “i” (pe ultima poziție).
Adaugare element în poz. k
• Vectorul este afișat folosind
#include<iostream> instrucțiunea “while” în mod
using namespace std; repetat, atâta timp cât elementul
main()
de afișat este diferit de NULL;
{ int vec[11]={1,2,3,4,5}, i=0, capat,
• Variabila “capat” reține
k;
while (vec[i]!=NULL) lungimea vectorului inițial “i” mărit
{ cout<<vec[i]<<" "; i++; } cu o unitate, pentru a permite
capat=i+1; inserția;
cout<<"Pozitia unde memoram = • Noul element se adaugă pe
"; poziția k;
cin>>k; • Toate elementele, începând de
for (i=capat; i>=k; i--) vec[i]=vec[i- la capăt, descrescător până la
1]; k+1, sunt deplasate spre dreapta
cout<<"Elementul introdus = ";
cu o poziție ;
cin>>vec[k];
• Fiind creată o locație liberă
for (i=0;i<capat;i++) cout<<endl<<“
“; (indice k) aici se introduce noul
} element (vec[k]);
Ștergere element din poz. k
• Vectorul este afișat folosind
#include<iostream> instrucțiunea “while” în mod
using namespace std;
main()
repetat, atâta timp cât elementul
{ int vec[11]={1,2,3,4,5,6,7,8,9}, i=0, de afișat este diferit de NULL;
capat,k; • Variabila “capat” reține lungimea
while (vec[i]!=NULL) vectorului inițial, fiind “i”;
{ cout<<vec[i]<<" "; • Elementul se șterge de pe
i++; }
capat=i; poziția k;
cout<<"Pozitia din care stergem = "; • Fiecare element, începând de la
cin>>k; poziția k, până la “capat” ia
for (i=k;i<capat;i++) vec[i]=vec[i+1]; valoarea următorului element :
capat--;
for (i=0; i<capat; i++)
vec[i]=vec[i+1];
cout<<“ ”<<vec[i] ; • Prin suprascriere, elementele de
la capăt până pe poziția k sunt
} deplasate spre stânga;
• Lungimea vectorului scade cu 1
(capat--).
Sortări
A sorta un vector înseamnă a-l
• Sortare prin metoda bulelor
reordona după anumite criterii.
Criterii uzuale folosite în sortare :
• Sortare prin inserție o numeric crescător
o numeric descrescător
• Sortare prin inserție directă o alfabetic crescător (A ... Z)
o alfabetic descrescător (Z ... A)
• Sortare prin numărare
Exemplu
• Sortare prin inserție rapidă tablou nesortat = {2, 7, 9, 1, 0, 5,
4}
• Sortare prin selecție directă tablou sortat = {0, 1, 2, 4, 5, 7,
9}

Există mai multe metode de sortare


bazate pe algoritmi diferiți. În
continuare sunt prezentate câteva
metode utilizate în acest scop.

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