Structura repetitivă

Bază~15 min11 pași

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:

  1. Inițializare (int i = 1) — se execută o singură dată, la start
  2. Condiție (i <= n) — verificată la fiecare iterație; dacă e false, bucla se oprește
  3. 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;
Observația-cheie

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 pozitiv

Exemple 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șeli frecvente

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.

Întrebarea 1 / 3

Ce afișează: for(int i=1; i<=5; i++) cout<<i<<" "; ?