Ce vei învăța astăzi?
După această lecție, vei ști să parcurgi un vector corect și să faci operații simple pe elemente.
Ce înseamnă „parcurgerea” unui vector?
Parcurgere = să vizitezi elementele vectorului pe rând (de obicei de la 0 la n-1) ca să le citești, afișezi sau modifici.
Regula: Dacă vectorul are n elemente, indicii sunt 0, 1, 2, ... , n-1.
Demo interactiv: parcurgere element cu element
Apasă Pas următor ca să vezi cum „merge” indexul i prin vector.
Foarte important: bucla standard este for (int i = 0; i < n; i++). Observă condiția i < n, nu i <= n.
For vs While: cum parcurgem corect?
De ce este bun for-ul?
i = 0 (primul element)
i < n (până la ultimul: n-1)
i++ (mergem la următorul element)
Capcană: Dacă uiți i++, bucla devine infinită!
| Ce vrem | Bucla corectă | Greșeală frecventă | De ce e greșit? |
|---|---|---|---|
| Include v[0] | i >= 0 |
i > 0 |
Se oprește la i=1, nu mai ajunge la 0 |
| Pornește de la ultimul | i = n-1 |
i = n |
v[n] nu există |
Observație: dacă vrei doar să afișezi, NU trebuie să modifici vectorul. Dacă vrei să schimbi valori, atunci atribui în v[i].
Mai jos ai aceeași idee scrisă în două moduri: întâi pașii (pseudocod), apoi cod C++ pe care îl poți copia și rula.
#include <iostream>
using namespace std;
int main() {
const int MAX = 1000;
int v[MAX];
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> v[i];
for (int i = 0; i < n; i++) cout << v[i] << " ";
return 0;
}
int i = 0;
while (i < n) {
cout << v[i] << " ";
i++;
}
int st = 0, dr = n - 1;
while (st < dr) {
int aux = v[st];
v[st] = v[dr];
v[dr] = aux;
st++;
dr--;
}
for (int i = 0; i < n; i++) {
v[i] = 2 * v[i];
}
Observă că „traducerea” e mereu aceeași:
intervalul 0..n-1 devine în C++ i = 0; i < n; i++.
Operații simple pe toți termenii
De multe ori parcurgem vectorul ca să calculăm ceva: suma, numărul de elemente pare, câte sunt pozitive etc.
// SUMA ELEMENTELOR
int suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
// NUMĂRĂM ELEMENTELE PARE
int cntPare = 0;
for (int i = 0; i < n; i++) {
if (v[i] % 2 == 0) cntPare++;
}
Regula: înainte de buclă, inițializezi variabilele (ex: suma = 0, cnt = 0). Apoi actualizezi în buclă.
Exercițiu de completare - Parcurgere cu for
Completează codul C++ pentru citire + sumă + afișare:
Bancă de cuvinte:
Test de înțelegere: bucle și indexare
Alege răspunsul corect:
1) Pentru un vector cu n elemente, care este ultima poziție validă?
2) Care buclă parcurge corect vectorul?
3) La parcurgere cu while, ce NU trebuie să uiți?
Capcane comune la parcurgere
Majoritatea erorilor vin din indexare greșită sau condiții greșite în buclă.
// ❌ GREȘIT: i <= n (ajunge la v[n] - inexistent)
for (int i = 0; i <= n; i++) {
cout << v[i];
}
// ✅ CORECT: i < n (ultimul este v[n-1])
for (int i = 0; i < n; i++) {
cout << v[i] << " ";
}
Best practice: gândește așa: „ultimul index = n-1”, deci bucla trebuie să se oprească înainte de n.
Încălzire (2 minute)
Verificare rapidă: bifează mental care bucle sunt corecte:
-
for (int i=0; i<n; i++)→ verifică -
for (int i=1; i<=n; i++)→ verifică -
int i=0; while(i<n){ /*...*/ i++; }→ verifică
Hint: caută dacă se ajunge la v[n] (care nu există).
PbInfo - Suma elementelor
Parcurgere completă + acumulare în variabilă
Enunț:
Cerință: Se citește n și apoi n numere întregi. Afișează suma lor.
Date de intrare:
n, apoi n numere.
Date de ieșire:
Un număr: suma elementelor.
Exemplu:
Intrare:
5 10 20 30 40 50
Ieșire:
150
Cum gândim soluția:
- Citim n
- Inițializăm
suma = 0 - Parcurgem cu
forde la 0 la n-1: citim și adunăm
Execuție pentru n=3 cu 7 8 9:
Ce trebuie verificat:
- Bucla să fie
i < n sumasă înceapă de la 0
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long suma = 0; // folosim long long pentru siguranță
for (int i = 0; i < n; i++) {
int x;
cin >> x;
suma += x;
}
cout << suma;
return 0;
}
Ce învățăm: parcurgere completă + acumulare într-o variabilă (suma).
PbInfo - Numărarea elementelor pare
Parcurgere + condiție + contor
Enunț:
Cerință: Se citește n și apoi n numere naturale. Afișează câte sunt pare.
Date de intrare:
n, apoi n numere.
Date de ieșire:
Un număr: câte elemente pare există.
Exemplu:
Intrare:
6 1 2 4 7 10 11
Ieșire:
3
Explicație: pare sunt 2, 4, 10
Cum gândim soluția:
- Inițializăm
cnt = 0 - Parcurgem elementele: dacă
x % 2 == 0atuncicnt++
Tip: Poți rezolva fără să stochezi vectorul (citești pe rând și numări).
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x % 2 == 0) cnt++;
}
cout << cnt;
return 0;
}
Ce învățăm: parcurgere + condiție + contor (cnt).
Exercițiul Practic: Parcurgeri utile
Sarcini de lucru
Consolidează parcurgerea cu for/while și atenția la indexare
Sarcina 1: Găsește greșelile
Analizează codul și notează greșelile:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int v[1000];
// Citire (GREȘIT)
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
// Afișare (GREȘIT)
for (int i = 0; i <= n; i++) {
cout << v[i] << " ";
}
return 0;
}
Soluție pentru Sarcina 1:
- 1) Citire de la 1: trebuie de la
0. Corect:for (int i=0; i<n; i++) - 2) Condiție <= n: ajunge la
v[n](inexistent). Corect:i < n - 3) Afișare <= n: aceeași problemă. Corect:
i < n
Cod corectat:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int v[1000];
for (int i = 0; i < n; i++) {
cin >> v[i];
}
for (int i = 0; i < n; i++) {
cout << v[i] << " ";
}
return 0;
}
Sarcina 2: Program complet
Cerință: Citește n și n numere. Afișează:
- Elementele în ordinea citirii
- Elementele în ordine inversă
- Suma elementelor
- Numărul elementelor pare
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
long long suma = 0;
int cntPare = 0;
// 1) Citire + calcule
for (int i = 0; i < n; i++) {
cin >> v[i];
suma += v[i];
if (v[i] % 2 == 0) cntPare++;
}
// 2) Afișare normală
cout << "Ordinea citirii: ";
for (int i = 0; i < n; i++) cout << v[i] << " ";
cout << endl;
// 3) Afișare inversă
cout << "Ordine inversa: ";
for (int i = n - 1; i >= 0; i--) cout << v[i] << " ";
cout << endl;
// 4) Sumă
cout << "Suma: " << suma << endl;
// 5) Număr pare
cout << "Pare: " << cntPare << endl;
return 0;
}
Observație: putem calcula suma și numărul de pare chiar în timpul citirii (eficient și simplu).