Pagina Modulului 4
Ora 21 - Modulul 4

Numărarea elementelor

Astăzi învățăm un algoritm esențial: numărarea elementelor dintr-un vector care respectă o condiție. Vei folosi contori, condiții simple și compuse, și vei înțelege clar diferența dintre numărarea valorilor și numărarea pozițiilor.

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

Ce vei învăța astăzi?

După această lecție vei putea să numeri corect elementele unui vector care respectă o condiție (pare, pozitive, multipli, într-un interval etc.) și vei ști să eviți cele mai frecvente greșeli.

Ce este un contor și cum se folosește
Model standard de numărare (for + if + cnt++)
Numărare pare/impare, pozitive/negative/zero
Condiții compuse (AND / OR)
Numărarea aparițiilor unei valori (x apare de câte ori?)
Capcane comune (resetare contor, condiție greșită, index vs valoare)

WARM-UP (2 minute) - „Spune repede!”

Ai vectorul: [3, 0, -2, 7, 8, 8, 10]

  • Câte elemente sunt pare?
  • Câte elemente sunt negative?
  • De câte ori apare valoarea 8?

Hint: astăzi înveți exact cum să rezolvi asta în C++ în 10 secunde 🙂

1) Ce înseamnă „numărarea elementelor”?

Definiție: Numărarea elementelor înseamnă să parcurgi vectorul și să crești un contor de fiecare dată când un element respectă o condiție.

Exemplu: „Numără câte elemente sunt pare” → pentru fiecare element, verifici v[i] % 2 == 0.

Analogie (super ușoară): „Număr elevii care au tricou albastru”

Vector elevii din clasă (în ordine)
Condiție tricou albastru / număr par / > 0 etc.
Contor câte „DA” am strâns până acum
Algoritm mă uit la fiecare elev → dacă e albastru → +1

Regula de aur: Contorul începe aproape mereu de la 0. Dacă pornești contorul cu altă valoare (ex: 1), vei greși rezultatul.

2) Modelul standard de numărare (șablonul de aur)

Contor vs frecvență: „câte elemente?” vs „de câte ori apare fiecare?”

În ora asta apar două idei care seamănă, dar nu sunt la fel:

  • Contor (cnt) = numărăm câte elemente respectă o condiție (pare, pozitive, în interval etc.).
  • Frecvență (freq) = numărăm de câte ori apare fiecare valoare (ex: câte note de 10, câte note de 9...).
Ce cere problema Ce folosești Exemplu
„Câte numere sunt pare?” un singur contor: cnt if (x % 2 == 0) cnt++;
„De câte ori apare 8?” un contor pentru valoare: cnt if (x == 8) cnt++;
„De câte ori apare fiecare valoare 0..100?” vector de frecvență: freq[101] freq[x]++;

Greșeală clasică: confunzi i cu v[i].

i este poziția (index), iar v[i] este valoarea. Când numeri valori pare, verifici v[i] % 2, nu i % 2.

Numărare „din mers” (nu e nevoie să păstrezi vectorul)
int n; cin >> n;

int cntEven = 0, cntOdd = 0, cntPos = 0, cntNeg = 0, cntZero = 0;

for (int i = 0; i < n; i++) {
    int x; cin >> x;

    if (x % 2 == 0) cntEven++;
    else cntOdd++;

    if (x > 0) cntPos++;
    else if (x < 0) cntNeg++;
    else cntZero++;
}

cout << cntEven << " " << cntOdd << " " << cntPos << " " << cntNeg << " " << cntZero;
Frecvență (când valorile sunt într-un interval mic, ex: 0..100)
int n; cin >> n;

int freq[101] = {0};     // toate 0 la început

for (int i = 0; i < n; i++) {
    int x; cin >> x;
    if (0 <= x && x <= 100) freq[x]++;  // număr aparițiile lui x
}

// exemplu: câte valori sunt 10?
cout << freq[10];

Frecvența e „superputerea” pentru probleme ca: „cel mai des întâlnit număr”, „câte apariții are fiecare”, „moda” etc.

Șablon pe care îl vei folosi în 90% din probleme:

// NUMĂRARE ELEMENTE CARE RESPECTĂ O CONDIȚIE int cnt = 0; // 1) contor for (int i = 0; i < n; i++) // 2) parcurgere { if (conditie(v[i])) // 3) verificare cnt++; // 4) creștem contorul } cout << cnt; // 5) afișăm rezultatul

În lecția asta condiția va fi: par / impar / pozitiv / în interval / multiplu etc. Dar structura rămâne aceeași.

Ce vrem să numărăm Condiție (if) Exemplu
Numere pare v[i] % 2 == 0 2, 4, 6, 8...
Numere impare v[i] % 2 != 0 1, 3, 5, 7...
Numere pozitive v[i] > 0 1, 2, 100...
Numere negative v[i] < 0 -1, -7, -100...
Zero v[i] == 0 0

3) Vizualizare: numărăm pas cu pas (click pe elemente!)

Mai jos ai un vector demo. Apasă pe elemente și vezi cum se schimbă contorul pentru: pare, pozitive și egal cu 8.

Scop: să înțelegi că numărarea înseamnă „+1 pentru fiecare element bun”.

Vector demo: [3, 0, -2, 7, 8, 8, 10]
Click pe celule pentru „marcare”
Contoare (se actualizează live):
pare = 0 pozitive = 0 valoare 8 = 0

Regulă: Dacă un element este selectat și îndeplinește condiția, contorul crește. Dacă îl deselectezi, contorul scade.

Observă: 0 este par, dar nu este pozitiv. Mulți elevi greșesc asta la început.

4) Numărare cu condiții compuse (AND / OR)

Uneori condiția are 2 (sau mai multe) cerințe:
AND (și): ambele trebuie să fie adevărate.
OR (sau): e suficientă una.

Exemplu: „Numără câte elemente sunt pozitive și pare.”

int cnt = 0;
for (int i = 0; i < n; i++) {
    if (v[i] > 0 && v[i] % 2 == 0)
        cnt++;
}
cout << cnt;

Dacă un element este negativ, nu contează că e par – condiția AND cere ambele adevărate.

Exemplu: „Numără câte elemente sunt negative sau zero.”

int cnt = 0;
for (int i = 0; i < n; i++) {
    if (v[i] < 0 || v[i] == 0)
        cnt++;
}
cout << cnt;

OR înseamnă „cel puțin una”. Dacă e 0, e bine; dacă e negativ, e bine; dacă e pozitiv, nu.

Exemplu: „Numără câte elemente sunt în intervalul [a, b].”

int a, b; cin >> a >> b;
int cnt = 0;
for (int i = 0; i < n; i++) {
    if (v[i] >= a && v[i] <= b)
        cnt++;
}
cout << cnt;

Observație: [a, b] include capetele (a și b). Dacă v[i] = a, se numără.

Exemplu: „Numără câte numere au ultima cifră 7.”

int cnt = 0;
for (int i = 0; i < n; i++) {
    int x = v[i];
    if (x < 0) x = -x;        // pentru negative
    if (x % 10 == 7)
        cnt++;
}
cout << cnt;

Pentru ultima cifră folosim x % 10. Pentru prima cifră e altă discuție (împărțiri repetate).

Mai jos ai traducerea clară: pseudocod (pașii) → C++ (cod). Observă că structura e mereu: cnt = 0, apoi for, apoi if, apoi cnt++.

ALGORITM Numarare_Pare citește n cnt ← 0 pentru i ← 0..n-1 execută citește x dacă x este par atunci cnt ← cnt + 1 scrie cnt SFÂRȘIT
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;
ALGORITM Numarare_In_Interval citește n citește v[0..n-1] citește a, b cnt ← 0 pentru i ← 0..n-1 execută dacă a ≤ v[i] ≤ b atunci cnt ← cnt + 1 scrie cnt SFÂRȘIT
int n; cin >> n;
int v[1000];
for (int i = 0; i < n; i++) cin >> v[i];

int a, b; cin >> a >> b;

int cnt = 0;
for (int i = 0; i < n; i++) {
    if (v[i] >= a && v[i] <= b) cnt++;
}

cout << cnt;
ALGORITM Numarare_Ultima_Cifra_7 citește n citește v[0..n-1] cnt ← 0 pentru i ← 0..n-1 execută x ← v[i] dacă x < 0 atunci x ← -x dacă ultima_cifră(x) = 7 atunci cnt ← cnt + 1 scrie cnt SFÂRȘIT
int cnt = 0;
for (int i = 0; i < n; i++) {
    int x = v[i];
    if (x < 0) x = -x;
    if (x % 10 == 7) cnt++;
}
cout << cnt;

„x este par” în pseudocod devine x % 2 == 0 în C++. Iar „a ≤ x ≤ b” devine x >= a && x <= b.

5) Numărarea aparițiilor unei valori (x apare de câte ori?)

Problemă clasică: se citește x. Să se numere de câte ori apare în vector.

int x; cin >> x;
int cnt = 0;
for (int i = 0; i < n; i++) {
    if (v[i] == x)
        cnt++;
}
cout << cnt;
Exemplu rapid:
v:[2, 7, 7, 1, 7]
x:7
cnt:3 (apare de 3 ori)

Atenție: asta numără valorile, nu pozițiile. Dacă problema cere „câte poziții pare au valoare > 0”, condiția e pe index și pe valoare.

6) Exercițiu de completare (Fill Blanks) - Numărăm elementele pare

Completează codul pentru a număra câte elemente pare sunt într-un vector:
#include <iostream>
using namespace ______;

______ main() {
  ______ n; cin >> n;
  int v[1000];
  for (______ i = ______; i < n; i++) {
    cin >> v______;
  }

  int cnt = ______;
  for (int i = 0; i < n; i++) {
    if (v[i] % ______ == ______)
      cnt______;
  }

  cout << cnt;
  return ______;
}
Bancă de cuvinte:
std int int 0 [i] 2 0 ++ 0

Dacă vrei să numeri impare, schimbi condiția: v[i] % 2 != 0.

7) Test de înțelegere (Quiz)

Ai vectorul: [3, 0, -2, 7, 8, 8, 10]

Întrebarea 1: Câte elemente sunt pare?

Întrebarea 2: De câte ori apare valoarea 8?

Întrebarea 3: Câte elemente sunt pozitive?

Hint: pozitive înseamnă strict > 0. Zero nu e pozitiv.

8) Sfaturi practice + capcane comune

Sfaturi practice

  • Nume sugestive pentru contori: cntEven, cntNeg, cntX.
  • Contorul pornește de la 0.
  • În if pune condiția clară (par, interval, multiplu etc.).
  • Pentru condiții compuse, folosește paranteze dacă e nevoie.

Capcane comune (cu exemple)

// ❌ GREȘIT: contorul nu pornește de la 0
int cnt = 1;

// ❌ GREȘIT: ai uitat să crești contorul
if (v[i] % 2 == 0) cnt;  // nu face nimic

// ✅ CORECT:
int cnt = 0;
if (v[i] % 2 == 0) cnt++;
// ❌ GREȘIT: confunzi indexul cu valoarea
// v[i] e valoarea, i e poziția
if (i % 2 == 0) cnt++;  // numără pozițiile pare, NU valorile pare

// ✅ CORECT: pentru valori pare
if (v[i] % 2 == 0) cnt++;
PROBLEME PBINFO - 15 minute

PbInfo - Numărul elementelor pare

Clasic: contor + condiție de paritate

Enunț:

Cerință: Se citește n și apoi n numere naturale. Să se afișeze câte dintre ele sunt pare.

Date de intrare:

n, apoi n numere naturale.

Date de ieșire:

Un singur număr: câte valori pare există în vector.

Exemplu:
Intrare:
6
1 2 3 4 5 6

Ieșire:
3
Cum gândim soluția:
  1. Citit n
  2. Inițializăm cnt = 0
  3. Citit fiecare x și dacă e par, cnt++
  4. Afișăm cnt
Execuție pentru: 1 2 3 4
x=1impar → cnt=0
x=2par → cnt=1
x=3impar → cnt=1
x=4par → cnt=2
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: pentru numărare nici nu e obligatoriu să stocăm vectorul. Putem număra „din mers”.

PbInfo - Numărul elementelor din interval

Condiție compusă: [a, b]

Enunț:

Cerință: Se citește n, apoi n numere întregi și două valori a, b. Afișează câte numere sunt în intervalul [a, b].

Exemplu:
Intrare:
7
3 0 -2 7 8 8 10
0 8

Ieșire:
5
Cum gândim soluția:
  1. Citim n și vectorul (sau din mers)
  2. Citim a și b
  3. Numărăm elementele cu x >= a && x <= b

Atenție: intervalul include capetele. Dacă x = a sau x = b, se numără.

Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;

int main() {
    int n; cin >> n;
    int v[1000];
    for (int i = 0; i < n; i++) cin >> v[i];

    int a, b; cin >> a >> b;

    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (v[i] >= a && v[i] <= b) cnt++;
    }

    cout << cnt;
    return 0;
}

Ce învățăm: condițiile compuse se scriu cu && (AND). Ambele trebuie adevărate.

EXERCIȚII PRACTICE - 10 minute

Exercițiul Practic: „Statistici simple pe vector”

Sarcini de lucru

Construiește un mini-program care numără mai multe lucruri dintr-o dată.

Sarcina 1: Analiză - numără corect

Ai vectorul: [3, 0, -2, 7, 8, 8, 10]

Completează cu valori:

  • cntPare = ?
  • cntPozitive = ?
  • cntNegative = ?
  • cntZero = ?
  • cntOpt = ? (de câte ori apare 8)
Soluție Sarcina 1:
  • cntPare = 5 (0, -2, 8, 8, 10)
  • cntPozitive = 5 (3, 7, 8, 8, 10) — 0 nu e pozitiv
  • cntNegative = 1 (-2)
  • cntZero = 1 (0)
  • cntOpt = 2 (8 apare de 2 ori)

Observație importantă: 0 este par, dar nu este pozitiv.

Sarcina 2: Program complet

Cerință: Citește n și apoi n numere întregi. Afișează pe rând:

  1. Câte sunt pare
  2. Câte sunt impare
  3. Câte sunt pozitive
  4. Câte sunt negative
  5. Câte sunt zero
Soluție Sarcina 2:
#include <iostream>
using namespace std;

int main() {
    int n; cin >> n;

    int cntEven = 0, cntOdd = 0, cntPos = 0, cntNeg = 0, cntZero = 0;

    for (int i = 0; i < n; i++) {
        int x; cin >> x;

        if (x % 2 == 0) cntEven++;
        else cntOdd++;

        if (x > 0) cntPos++;
        else if (x < 0) cntNeg++;
        else cntZero++;
    }

    cout << "Pare: " << cntEven << "\n";
    cout << "Impare: " << cntOdd << "\n";
    cout << "Pozitive: " << cntPos << "\n";
    cout << "Negative: " << cntNeg << "\n";
    cout << "Zero: " << cntZero << "\n";

    return 0;
}

Observă cum numărăm fără să stocăm vectorul. E foarte eficient pentru probleme doar de numărare.

Descarcă exercițiile și răspunsurile tale