Teorie: Tablouri Unidimensionale (Vectori)
Declararea, inițializarea, citirea și afișarea unui vector. Indexarea de la zero și capcane frecvente.
Tablouri Unidimensionale (Vectori)
Un tablou unidimensional (cunoscut și sub numele de vector sau array) este o structură de date omogenă care ocupă un spațiu contiguu (continuu) în memorie. Asta înseamnă că poate stoca un număr fix de elemente de același tip (de exemplu, doar numere întregi, sau doar caractere).
Fiecare element din vector poate fi accesat direct (în timp constant O(1)) folosind un index (poziție).
1. Declararea și accesarea elementelor
Declararea unui vector
Trebuie specificat tipul de date, numele vectorului și capacitatea maximă între paranteze drepte [].
int v[100]; // Vector de max 100 de elemente de tip int
float temperaturi[30]; // Vector de max 30 de numere realeInițializarea la declarare
Putem oferi valorile inițiale între acolade {}. Elementele neprecizate devin 0.
int a[5] = {10, 20, 30, 40, 50};
int b[100] = {0}; // Toate cele 100 de elemente devin 0Indexarea de la ZERO
În limbajul C++, primul element dintr-un vector se află la indexul 0, NU la indexul 1. Ultimul element al unui vector de capacitate n se află la indexul n-1.
a[0] = 10; // Accesăm/modificăm primul element
cout << a[2]; // Afișează al treilea element (valoarea 30)2. Citirea și Afișarea (cu instrucțiunea FOR)
Deoarece știm exact câte elemente are un vector, cel mai potrivit mod de a-l parcurge este folosind ciclul for. În probleme, vom folosi adesea o variabilă n care reprezintă numărul efectiv de elemente pe care dorim să le stocăm, mai mic sau egal cu capacitatea maximă declarată.
Citirea vectorului (0-indexed)
int n, v[100];
cin >> n; // Citim nr de elemente
// Parcurgem de la 0 la n-1
for (int i = 0; i < n; i++) {
cin >> v[i];
}Afișarea vectorului
// Afișăm elementele separate prin spațiu
for (int i = 0; i < n; i++) {
cout << v[i] << " ";
}3. Exemple de probleme clasice
Exemplul 1: Suma elementelor pare dintr-un vector
int n, v[100], suma = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> v[i];
if (v[i] % 2 == 0) {
suma = suma + v[i];
}
}
cout << "Suma elementelor pare este: " << suma;Exemplul 2: Determinarea elementului maxim
int n, v[100];
cin >> n;
// Mai întâi citim toate elementele
for (int i = 0; i < n; i++) cin >> v[i];
// Presupunem că primul element este maximul
int maxim = v[0];
for (int i = 1; i < n; i++) {
if (v[i] > maxim) {
maxim = v[i];
}
}
cout << "Elementul maxim este: " << maxim;Capcane frecvente la Bacalaureat
- Depășirea limitelor (Out of Bounds): Declararea lui
v[10]înseamnă că poți accesa indicii0, 1, ..., 9. Dacă încerci să acceseziv[10], programul va citi o zonă de memorie interzisă și fie va crăpa ("Segmentation fault"), fie va returna o valoare "gunoi" (garbage value). - Indexarea de la 1: Mulți profesori și unele manuale preferă să ignore `v[0]` și să indexeze vectorii de la 1 la n (
for(i=1; i<=n; i++)). Acest lucru este perfect valid la Bacalaureat, dar trebuie să fii atent să declari vectorul cu o unitate mai mare (ex:v[101]pentru `n=100`) ca să nu iasă din memorie pe ultima poziție. - Declararea globală vs locală: La Bacalaureat este recomandat să declari vectorii mari (ex:
v[10000]) la nivel **global** (în afara oricărei funcții, inclusiv `main()`). Vectorii globali sunt automat inițializați cu 0 și alocați pe *Data Segment* în loc de *Stack*, evitând astfel eroarea de *Stack Overflow*.