Pagina Modulului 4
Ora 18 - Modulul 4

Parcurgerea vectorilor

For, while și operații de bază pe elemente (citire, afișare, modificare)

40min teorie + 15min probleme PbInfo
Competența 4.1
Săptămâna 1
Sigla liceului
TEORIE - 40 minute

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.

Parcurgere cu for (standard)
Parcurgere cu while
Parcurgere inversă (n-1 → 0)
Modificarea elementelor (ex: dublare)
Operații pe toate elementele (sumă, numărare)

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.

v[0]
4
v[1]
1
v[2]
7
v[3]
3
v[4]
9
i = 0 (pregătit)

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?

// PARCURGERE STANDARD (CRESCĂTOR) for (int i = 0; i < n; i++) { // aici lucrăm cu v[i] } // EXEMPLU: afișare for (int i = 0; i < n; i++) { cout << v[i] << " "; }
De ce este bun for-ul?
Inițializare: i = 0 (primul element)
Condiție: i < n (până la ultimul: n-1)
Pas: i++ (mergem la următorul element)
// PARCURGERE CU WHILE (echivalentă) int i = 0; while (i < n) { // lucrăm cu v[i] i++; } // EXEMPLU: citire int i = 0; while (i < n) { cin >> v[i]; i++; }

Capcană: Dacă uiți i++, bucla devine infinită!

// PARCURGERE INVERSĂ (DESCRESCĂTOR) for (int i = n - 1; i >= 0; i--) { cout << v[i] << " "; } // ATENȚIE: i >= 0 (nu i > 0), altfel nu afișezi v[0]!
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ă
// MODIFICARE ELEMENTE (ex: dublăm fiecare element) for (int i = 0; i < n; i++) { v[i] = v[i] * 2; } // EXEMPLU: transformăm toate valorile în pozitive for (int i = 0; i < n; i++) { if (v[i] < 0) v[i] = -v[i]; }

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.

ALGORITM Afisare_Vector citește n pentru i ← 0..n-1 execută citește v[i] pentru i ← 0..n-1 execută scrie v[i] SFÂRȘIT
C++ (echivalent)
#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;
}
ALGORITM Parcurgere_While citește n citește v[0..n-1] i ← 0 cât timp i < n execută scrie v[i] i ← i + 1 SFÂRȘIT
C++ (echivalent)
int i = 0;
while (i < n) {
    cout << v[i] << " ";
    i++;
}
ALGORITM Inversare_Vector citește n citește v[0..n-1] st ← 0 dr ← n-1 cât timp st < dr execută interschimbă v[st] cu v[dr] st ← st + 1 dr ← dr - 1 scrie v SFÂRȘIT
C++ (echivalent)
int st = 0, dr = n - 1;
while (st < dr) {
    int aux = v[st];
    v[st] = v[dr];
    v[dr] = aux;
    st++;
    dr--;
}
ALGORITM Dublare_Elemente citește n citește v[0..n-1] pentru i ← 0..n-1 execută v[i] ← 2 * v[i] scrie v SFÂRȘIT
C++ (echivalent)
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:
#include <iostream>
using namespace ______;
______ main() {
    ______ n;
    cin >> n;
    const int MAX = 1000;
    ______ v[MAX];
    ______ suma = ______;
    for (______ i = ______; i < n; i++) {
        cin >> v______;
        suma ______ v[i];
    }
    cout << ______ << endl;
    return ______;
}
Bancă de cuvinte:
std int 0 [i] += suma

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

PROBLEME PBINFO - 15 minute

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:
  1. Citim n
  2. Inițializăm suma = 0
  3. Parcurgem cu for de la 0 la n-1: citim și adunăm
Execuție pentru n=3 cu 7 8 9:
i=0suma=0+7=7
i=1suma=7+8=15
i=2suma=15+9=24
Rezultat24 ✓
Ce trebuie verificat:
  • Bucla să fie i < n
  • suma să î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:
  1. Inițializăm cnt = 0
  2. Parcurgem elementele: dacă x % 2 == 0 atunci cnt++

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ȚII PRACTICE - 10 minute

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ă:

  1. Elementele în ordinea citirii
  2. Elementele în ordine inversă
  3. Suma elementelor
  4. 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).

Descarcă toate exercițiile și soluțiile