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", ¬a) != 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 unwhileobiș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ă.