De ce contează?
Vrei să afișezi toate numerele de la 1 la 1000. Fără bucle, ai scrie 1000 de linii de cout. Cu o buclă for, scrii trei linii și lași calculatorul să numere. Structura repetitivă nu e un truc — e instrumentul care face posibilă prelucrarea unui volum mare de date cu cod compact.
Bucla for
Ideală când știi dinainte de câte ori se repetă:
for (initializare; conditie; actualizare) {
// corpul buclei
}// Afiseaza numerele de la 1 la n
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << i << " ";
}Cei trei pași:
- Inițializare (
int i = 1) — se execută o singură dată, la start - Condiție (
i <= n) — verificată la fiecare iterație; dacă efalse, bucla se oprește - Actualizare (
i++) — se execută după fiecare iterație
Bucla while
Ideală când numărul de iterații nu e cunoscut dinainte:
while (conditie) {
// corpul buclei
}// Citeste numere pana citesti 0
int x;
cin >> x;
int suma = 0;
while (x != 0) {
suma += x;
cin >> x;
}
cout << suma << endl;Orice for se poate rescrie ca while și invers — sunt echivalente ca putere. Convenția: for când știi din start de câte ori se repetă (1..n, parcurgerea unui vector), while când numărul de iterații depinde de datele citite sau de un calcul care converge spre o condiție.
Bucla do-while
Corpul se execută cel puțin o dată, condiția e verificată după:
int x;
do {
cin >> x;
} while (x < 0); // repeta pana x este pozitivExemple practice
Suma cifrelor unui număr:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int suma = 0;
while (n > 0) {
suma += n % 10; // adauga ultima cifra
n /= 10; // elimina ultima cifra
}
cout << suma << endl;
return 0;
}Tabla înmulțirii:
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
cout << i * j << "\t";
}
cout << "\n";
}Complexitate
O buclă simplă de n iterații costă O(n). Două bucle imbricate de n iterații fiecare costă O(n²).
Greșeala 1: Confunzi i <= n cu i < n și bucla face cu o iterație mai mult sau mai puțin (eroarea off-by-one). Testează mereu cu n=0 și n=1 — cazurile limită le prind pe toate.
Greșeala 2: Modifici variabila de control i în interiorul corpului buclei for. for(int i=0; i<n; i++) { ... i++; ... } incrementează i de două ori per iterație — bucla face n/2 pași, nu n.
Greșeala 3: Uiți să modifici condiția într-un while și obții buclă infinită. Verifică că cel puțin o instrucțiune din corp avansează spre starea în care condiția devine false.