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.
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”
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.
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;
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:
Î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”.
Contoare (se actualizează live):
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++.
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;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;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:
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:
Bancă de cuvinte:
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++;
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:
- Citit n
- Inițializăm
cnt = 0 - Citit fiecare x și dacă e par,
cnt++ - Afișăm cnt
Execuție pentru: 1 2 3 4
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:
- Citim n și vectorul (sau din mers)
- Citim a și b
- 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ț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:
- Câte sunt pare
- Câte sunt impare
- Câte sunt pozitive
- Câte sunt negative
- 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.