Teoriechevron_rightTablouri Unidimensionale (Vectori)

Teorie: Tablouri Unidimensionale (Vectori)

Declararea, inițializarea, citirea și afișarea unui vector. Indexarea de la zero și capcane frecvente.

Nivel: Începătorschedule 30 min

data_arrayTablouri 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).

dns1. 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 reale

Iniț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 0

Indexarea 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.

Index 010
Index 120
Index 230
......
Index n-199
a[0] = 10; // Accesăm/modificăm primul element
cout << a[2]; // Afișează al treilea element (valoarea 30)

input2. 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] << " ";
}

code3. 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;

warningCapcane frecvente la Bacalaureat

  • Depășirea limitelor (Out of Bounds): Declararea lui v[10] înseamnă că poți accesa indicii 0, 1, ..., 9. Dacă încerci să accesezi v[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*.
syncSe încarcă statusul...