Documente Academic
Documente Profesional
Documente Cultură
tipDeBază denumire[Dimensiune];
de exemplu:
int X[10];
Ne putem imagina tabloul declarat mai sus astfel (valorile elementelor sunt aleatorii):
Spunem că fiecare element are un indice. Indicii unui tablou sunt între 0 și Dimensiune-1, deci
în exemplul nostru între 0 și 9.
Care sunt valorile inițiale ale elementelor tabloului? Regula este aceeași ca pentru alte variabile:
elementele unui tablou declarat global (în afara oricărei funcții) sunt inițializate cu 0;
elementele unui tablou declarat local (în interiorul unei funcții) sunt inițializate cu valori
aleatorii. Faptul că anumite implementări la compilatorului C++ inițializează și
variabilele local cu 0 nu este o regulă, ea nu este garantată de standardul C++.
Un element al tabloului, referit prin indice este tratat ca o variabilă oarecare de tipul stabilit la
declarare. Următoarele expresii/instrucțiuni sunt corecte:
int X[10];
cin >> X[0];
X[0] = 17;
cout << X[0];
cout << X[0] / 5;
Observație: C++ nu verifică dacă valoarea indicelui face parte din intervalul stabilit prin
declararea tabloului. Dacă indicele are o valoare în afara acestui interval, comportamentul
programului este impredictibil.
De cele mai multe ori, în program nu se folosesc toate elementele tabloului. De regulă, enunțul
unei probleme cu tablouri este:
int X[100], n;
//n = .... ;
for(int i = 0 ; i < n ; i ++)
X[i] = 1;
De fapt, în cele mai multe cazuri nu se poate face citirea unui tablou unidimensional (vector),
adică
cin >> X;
Instrucțiunea de mai sus duce de regulă la eroare de sintaxă. În schimb, se pot citi elementele
tabloului, în ordine, cu ajutorul parcurgerii:
cin >> n;
for(int i = 0 ; i < n ; i ++)
cin >> X[i];
La fel ca în cazul citirii, în cele mai multe cazuri nu se poate face nici afișarea unui vector, adică
cout << X;
Spre deosebire de citire, afișarea unui tablou cu ajutorul operatorului de inserție << nu duce la
eroare de sintaxă, însă nu se vor afișa elementele tabloului, ci o adresă (de
exemplu 0x7ffc9711bcd0), reprezentând adresa primului element al tabloului. Elementele
tabloului se pot afișa prin parcurgere, în ordinea dorită:
sau
Indexare de la 0 și indexare de la 1
Orice tablou C++ are fizic elementele indexate de la 0 la Dimensiune-1. De exemplu, dacă
avem nevoie de un tablou cu n≤100 elemente întregi, îl vom declara:
int V[100];
iar elementele vor avea indici între 0 și 99. Astfel, primul element al tabloului este V[0], al
doilea este V[1], …, ultimul este V[n-1].
Trebuie de asemenea să tratăm cu atenție declararea tabloului, dimensiunea fizică trebuind să fie
mai mare cu 1 decât valoarea precizată în problemă. Dacă de exemplu, n≤100, declararea va fi:
int V[101];
Atenție!!
int A[10];
A = {0};
Cum procedăm?
Rezolvare:
X[n] = val;
n ++;
n ++;
X[n] = val;
X[++n] = val;
Secvențe C++:
bool OK = true;
for(int i = 0 ; i < n && OK ; i ++)
if(X[i] - nu respectă regula)
OK = false;
sau
bool OK = true;
for(int i = 0 ; i < n ; i ++)
if(X[i] - nu respectă regula)
{
OK = false;
break;
}
sau
bool OK = true;
int i = 0;
while(i < n && OK)
{
if(X[i] - nu respectă regula)
OK = false;
else
i ++;
}
Secvențe C++:
bool OK = false;
for(int i = 0 ; i < n && !OK ; i ++)
if(X[i] - respectă regula)
OK = true;
sau
bool OK = false;
for(int i = 0 ; i < n ; i ++)
if(X[i] - respectă regula)
{
OK = true;
break;
}
sau
bool OK = false;
int i = 0;
while(i < n && !OK)
{
if(X[i] - respectă regula)
OK = true;
else
i ++;
}
Sortarea tablourilor
int n, v[100];
//citire v[] cu n elemente
bool sortat;
do
{
sortat = true;
for(int i = 0 ; i < n - 1 ; i ++)
if(v[i] > v[i+1])
{
int aux = v[i];
v[i] = v[i+1];
v[i+1] = aux;
sortat = false;
}
}
while(!sortat);
la prima parcurgere cel mai mare element al vectorului ajunge pe pozi ția sa final ă;
la a doua parcurgere următorul cel mai mare element ajunge pe poziția final ă;
Observăm că nu mai are rost să parcurgem aceste elemente, fixate. Astfel, putem parcurge vectorul numai
până la indicele unde s-a făcut ultima interschimbare la parcurgerea anterioară.
Exemplu:
Parcurgere 1 Parcurgere 2 Parcurgere 3
O secvență C++:
int n, v[100];
//citire v[] cu n elemente
bool sortat;
int m = n;
do
{
sortat = true;
int p = m;
for(int i = 0 ; i < p - 1 ; i ++)
if(v[i] > v[i+1])
{
int aux = v[i];
v[i] = v[i+1];
v[i+1] = aux;
sortat = false;
m = i + 1;
}
}
while(!sortat);
fie un vector X[] cu n elemente;
plasăm în X[0] cea mai mică valoare din vector;
plasăm în X[1] cea mai mică valoare rămasă;
etc.
Exemplu
i = 0 i = 1 i = 2 i = 3 La final
Secvență C++
int n, X[100];
//citire X[] cu n elemente
for(int i = 0 ; i < n - 1 ; i ++)
for(int j = i + 1 ; j < n ; j ++)
if(X[i] > X[j])
{
int aux = X[i];
X[i] = X[j];
X[j] = aux;
}
Algoritmul descris mai sus se mai numește sortare prin selecție generală, sau implicită. O altă variantă este
următoarea, în care pentru fiecare secvență i ... n-1 se determină explicit minimul și se interschimbă
cu X[i].
int n, X[100];
//citire X[] cu n elemente
for(int i = 0 ; i < n - 1 ; i ++)
{
int p = i;
for(int j = i + 1 ; j < n ; j ++)
if(X[j] < X[p])
p= j;
int aux = X[i];
X[i] = X[p];
X[p] = aux;
}
fie un vector X[] cu n elemente;
dacă secvența cu indici 0, 1, …, i-1 este ordonată, atunci putem insera elementul X[i] în această secvență
astfel încât să fie ordonată secvența cu indici 0, 1, …, i-1, i.
luăm pe rând fiecare element X[i] și îl inserăm în secvența din stânga sa
la final întreg vectorul va fi ordonat
Algoritm
O reprezentare a algoritmului este:
parcurgem vectorul cu indicele i
o inserăm pe X[i] în secvența din stânga sa; pentru inserare se mută unele elemente din secvență spre
dreapta
Exemplu
int n, X[100];
//citire X[] cu n elemente
for(int i = 1 ; i < n ; i ++)
{
int x = a[i];
int p = i - 1;
while(p >= 0 && a[p] > x)
a[p + 1] = a[p], p --;
a[p + 1] = x;
}
sau:
O soluție foarte eficientă este interclasarea:
Secvență C++:
int i = 0 , j = 0;
p = 0;
while(i < n && j < m)
if(a[i] < b[j])
c[p ++] = a[i ++];
else
c[p ++] = b[j ++];
while(i < n)
c[p ++] = a[i ++];
while(j < m)
c[p ++] = b[j ++];
Observație: Doar una dintre instrucțiunile while(i < n)... și while(j < m)... se va executa, deoarece exact
una dintre condițiile i < n și j < m este adevărată. În prima structură repetitivă, la fiecare pas, doar una
dintre variabilele i și j se mărește, deci la final una dintre condiții este adevărată și una este falsă.