</>
InfoPrep

Lecție

Instrucțiunea while

Repetă instrucțiuni cât timp condiția verificată la început este adevărată.

Instrucțiunea while

Instrucțiunea while repetă o instrucțiune sau un bloc de instrucțiuni cât timp o condiție este adevărată.

Forma generală este:

while (conditie) {
    instructiuni;
}

O putem citi simplu:

CÂT TIMP condiția este adevărată
    execută instrucțiunile

Cum funcționează?

Exemplu:

int x = 1;

while (x <= 5) {
    cout << x << " ";
    x++;
}

Să urmărim execuția:

x = 1 → true  → afișează 1 → x devine 2
x = 2 → true  → afișează 2 → x devine 3
x = 3 → true  → afișează 3 → x devine 4
x = 4 → true  → afișează 4 → x devine 5
x = 5 → true  → afișează 5 → x devine 6
x = 6 → false → STOP

Se afișează:

1 2 3 4 5

Logica unui while este:

verifică condiția
       ↓
     true ─────→ execută instrucțiunile
       ↑                    ↓
       └──────── verifică din nou

     false
       ↓
      STOP

De reținut: după fiecare repetare, programul se întoarce și verifică din nou condiția.


while se poate executa de 0 ori

Condiția este verificată înainte de executarea instrucțiunilor.

De exemplu:

int x = 10;

while (x < 5) {
    cout << x;
    x++;
}

Prima verificare:

10 < 5 → false

Condiția este falsă de la început, deci corpul buclei nu se execută deloc.

Un while se poate executa:

0, 1, 2, 3, ... ori

Atenție la bucla infinită

În interiorul unui while trebuie, de obicei, să se modifice ceva care influențează condiția.

Corect:

int x = 1;

while (x <= 5) {
    cout << x << " ";
    x++;
}

x crește, iar la un moment dat condiția devine falsă.

Dacă uităm:

x++;

obținem:

int x = 1;

while (x <= 5) {
    cout << x << " ";
}

Atunci:

x rămâne 1

1 <= 5 → true
1 <= 5 → true
1 <= 5 → true
...

Bucla nu se mai termină.

Aceasta se numește buclă infinită.

Când scrii un while, întreabă-te: ce se modifică astfel încât condiția să devină la un moment dat falsă?


if vs. while

Cele două folosesc o condiție, dar au roluri diferite.

if    → verifică și decide o dată

while → verifică și repetă cât timp condiția este adevărată

De exemplu:

if (x < 5)
    x++;

poate executa x++ o singură dată.

În schimb:

while (x < 5)
    x++;

repetă x++ până când condiția devine falsă.


for vs. while

Ambele instrucțiuni pot repeta operații.

De exemplu:

for (int i = 1; i <= 5; i++)
    cout << i << " ";

poate fi scris și:

int i = 1;

while (i <= 5) {
    cout << i << " ";
    i++;
}

Ambele afișează:

1 2 3 4 5

Ca idee generală:

for   → foarte potrivit pentru parcurgeri cu un contor

while → foarte potrivit când repetăm cât timp o condiție este adevărată

O utilizare importantă: cifrele unui număr

while este foarte util atunci când vrem să prelucrăm cifrele unui număr.

Să avem:

n = 538

Știm deja că:

n % 10

obține ultima cifră:

538 % 10 = 8

iar:

n / 10

elimină ultima cifră:

538 / 10 = 53

Putem repeta aceste operații cât timp mai avem cifre:

while (n != 0) {
    int cifra = n % 10;

    // prelucrăm cifra

    n /= 10;
}

Pentru n = 538:

n = 538 → cifra = 8 → n devine 53
n = 53  → cifra = 3 → n devine 5
n = 5   → cifra = 5 → n devine 0
n = 0   → STOP

Observă că cifrele sunt obținute:

8 → 3 → 5

adică de la dreapta la stânga.

Acesta este un tipar foarte important:

cât timp mai avem cifre
        ↓
extragem ultima cifră
        ↓
o prelucrăm
        ↓
eliminăm ultima cifră

Algoritmii pentru suma cifrelor, numărul cifrelor, cifra maximă și alte prelucrări îi vom construi separat. Pentru moment este important să înțelegi mecanismul buclei.


Cum construim un while?

Gândește-te la trei întrebări:

1. Care este starea inițială?

2. CÂT TIMP trebuie să repet?

3. Ce se modifică la fiecare pas?

De exemplu:

int x = 1;

while (x <= 5) {
    cout << x << " ";
    x++;
}

avem:

START      → x = 1

CONDIȚIE   → x <= 5

MODIFICARE → x++

Dacă aceste trei lucruri sunt clare, bucla este mult mai ușor de construit și urmărit.


Recapitulare

Forma generală:

while (conditie) {
    instructiuni;
}

Logica este:

condiție?
   ↓
 true → execută → modifică → verifică din nou
   ↓
 false
   ↓
 STOP

Reține:

while → repetă CÂT TIMP condiția este adevărată

Condiția este verificată înainte de fiecare repetare, deci bucla se poate executa și de 0 ori.

Ai grijă ca ceva să se modifice astfel încât condiția să poată deveni falsă:

altfel → buclă infinită

Iar pentru cifrele unui număr, tiparul de bază este:

while (n != 0) {
    int cifra = n % 10;

    // prelucrăm cifra

    n /= 10;
}

Ideea esențială: while = repetă cât timp condiția este adevărată.