while și do-while în C

Repetă un bloc cât timp o condiție este adevărată; do-while rulează blocul cel puțin o dată, apoi verifică.

Sintaxă
while (conditie) {
    ...
}

do {
    ...
} while (conditie);

Ce face while și do-while

while verifică condiția înainte de fiecare repetare. Dacă este falsă de la început, corpul nu rulează deloc. Îl folosești când nu știi dinainte de câte ori se repetă bucla: citești până la finalul datelor, aștepți o valoare anume.

do { ... } while (conditie); verifică la final, deci corpul rulează cel puțin o dată. Este potrivit pentru meniuri și pentru citiri pe care le repeți până primești o valoare corectă. Atenție la punctul și virgula de după while (...).

Condiția trebuie să devină falsă la un moment dat; altfel bucla nu se oprește. Verifică dacă variabila din condiție se modifică în corp.

Exemple

Exemplul 1: Cifrele unui număr

La fiecare pas, % 10 dă ultima cifră, iar /= 10 o elimină.

#include <stdio.h>

int main(void) {
    int numar = 2026;
    int suma = 0, cifre = 0;
    while (numar > 0) {
        suma += numar % 10;
        numar /= 10;
        cifre++;
    }
    printf("%d cifre, suma cifrelor %d\n", cifre, suma);
    return 0;
}

Rezultat

4 cifre, suma cifrelor 10

Exemplul 2: Citește până la 0

Bucla citește sume până primește 0 sau până când citirea eșuează.

#include <stdio.h>

int main(void) {
    int suma, total = 0, n = 0;
    while (scanf("%d", &suma) == 1 && suma != 0) {
        total += suma;
        n++;
    }
    printf("%d cheltuieli, total %d lei\n", n, total);
    return 0;
}

Ce scrie utilizatorul (intrare)

120
45
80
0

Rezultat

3 cheltuieli, total 245 lei

Exemplul 3: do-while: cere din nou până e corect

Primele două valori sunt în afara intervalului 1–10, deci programul cere din nou. Corpul rulează cel puțin o dată.

#include <stdio.h>

int main(void) {
    int nota;
    int incercari = 0;
    do {
        printf("Nota (1-10): ");
        if (scanf("%d", &nota) != 1) {
            return 0;
        }
        incercari++;
    } while (nota < 1 || nota > 10);
    printf("\nNota %d acceptată după %d încercări\n", nota, incercari);
    return 0;
}

Ce scrie utilizatorul (intrare)

0
12
9

Rezultat

Nota (1-10): Nota (1-10): Nota (1-10): 
Nota 9 acceptată după 3 încercări

Greșeli frecvente

  • Uiți să modifici variabila din condiție: while (i < 10) { printf(...); } fără i++ nu se oprește.
  • Pui punct și virgulă după while (conditie); la un while obișnuit. Bucla are corp gol și, dacă condiția e adevărată, nu se oprește.
  • Folosești while (!feof(f)) ca să citești un fișier. Ultima citire este procesată de două ori; verifică direct rezultatul funcției de citire.

Comenzi înrudite

  • for: Bucla cu contor: inițializare, condiție verificată înainte de fiecare pas și actualizare, toate pe un singur rând.
  • break, continue și goto: break iese din buclă, continue trece la repetarea următoare, iar goto sare la o etichetă, folosit în C mai ales pentru curățenie la erori.
  • scanf: Citește valori de la tastatură după un șablon (%d, %lf, %s) și le scrie la adresele primite; returnează câte valori a citit.
  • fgets: Citește un rând întreg (cu tot cu spații) într-un tablou de caractere, fără să depășească dimensiunea dată.