De ce contează?
Când numeri pașii pe scări — „unu, doi, trei..." — repeți aceeași acțiune (urci o treaptă, crești numărătoarea) până ajungi sus. O buclă în program face exact asta: repetă un set de instrucțiuni până când o condiție îți spune să te oprești.
De ce avem nevoie de bucle
Imaginează-ți că vrei să aduni 1000 de numere. Fără bucle, ai scrie 1000 de linii. Cu o structură repetitivă, scrii instrucțiunea o dată și o repeți automat. Bucla e ce transformă un program scurt într-unul care prelucrează volume mari de date.
Bucla for — când știi de câte ori
Folosește for când cunoști numărul de repetări. Are trei părți:
for (int i = 0; i < n; i++) {
// corpul buclei
}int i = 0— inițializare (o singură dată, la început).i < n— condiția: cât timp e adevărată, bucla continuă.i++— pasul: creșteidupă fiecare repetare.
Suma primelor n numere naturale:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
long long suma = 0; // long long: suma poate fi mare
for (int i = 1; i <= n; i++) {
suma += i; // suma = suma + i
}
cout << suma << "\n";
return 0;
}Pentru n = 5: i ia pe rând 1, 2, 3, 4, 5, iar suma devine 1, 3, 6, 10, 15.
Cum „avansează" indicele printr-un vector
Cea mai frecventă folosire a lui for e parcurgerea unui vector. Indicele i mută
„reflectorul" peste celule, de la stânga la dreapta:
| v | 5 | 3 | 8 | 1 | 9 |
| i | 0 | 1 | 2 | 3 | 4 |
i |
int v[] = {5, 3, 8, 1, 9};
int n = 5;
for (int i = 0; i < n; i++) {
cout << v[i] << " "; // 5 3 8 1 9
}Indicii unui vector cu n elemente merg de la 0 la n−1. De aceea condiția corectă
e i < n, nu i <= n. Cu i <= n ai accesa v[n], o celulă care nu există.
Bucla while — când te oprești pe o condiție
Folosește while când nu știi numărul de pași, ci doar condiția de oprire. Numărul de
cifre ale unui număr:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int cifre = 0;
while (n > 0) {
n = n / 10; // taiem ultima cifra
cifre++;
}
cout << cifre << "\n";
return 0;
}Pentru n = 2024: n devine 202 → 20 → 2 → 0, iar cifre ajunge la 4. Nu știam
dinainte câți pași facem — depinde de număr.
Orice while are nevoie de un pas care apropie condiția de fals (aici n = n / 10).
Fără el, condiția rămâne adevărată la nesfârșit → buclă infinită.
Complexitate
| Structură | Repetări | Timp |
|---|---|---|
for (i=0; i<n; i++) | n | O(n) |
| două bucle imbricate | n · n | O(n²) |
while (n > 0) n /= 10 | ~log₁₀(n) | O(log n) |
Numărul de repetări dictează complexitatea. O buclă în alta peste n elemente dă
O(n²) — atenție la timp pentru n mare.
Greșeli reale cu buclele:
- Off-by-one:
i <= nîn loc dei < nacceseazăv[n], care nu există → rezultat greșit sau crash. - Buclă infinită: uiți
i++(lafor, în corpul unuiwhile) sau pasul nu schimbă condiția → programul nu se mai termină, depășești timpul. - Variabilă resetată în buclă: declari
int maxim = 0;înăuntrul buclei → se resetează la fiecare pas. Declar-o înainte. - Acumulare în
int: o sumă de multe valori se sparge; foloseștelong long.
De reținut
forcând știi numărul de pași;whilecând te oprești pe o condiție.- Indicii unui vector merg 0..n−1 → condiția corectă e
i < n. - Numărul de repetări fixează complexitatea; orice
whileare nevoie de un pas spre oprire.