1. Cand ai nevoie de WHILE?
- FOR = numar de repetari cunoscut. Ex: "afiseaza tabla inmultirii cu 7" (exact 10 pasi).
- WHILE = numar de repetari necunoscut, dar exista o conditie de oprire. Ex: "citeste numere pana cand utilizatorul introduce 0", "imparte numarul la 10 pana ramane 0".
Cand citesti o carte, repeti actiunea "intoarce pagina" cat timp mai sunt pagini necitite. Nu numeri paginile la inceput - te opresti cand ajungi la coperta din spate. Asta este o bucla while: conditia de oprire ("mai sunt pagini?"), nu un numar fix.
2. Anatomia unei bucle while (Python)
while corecta are trei parti. Daca lipseste oricare, bucla fie nu porneste, fie nu se opreste niciodata.
# 1. INITIALIZARE - inainte de bucla n = 5 # 2. CONDITIA - se verifica INAINTE de fiecare repetare while n > 0: print(n) # 3. ACTUALIZARE - apropie conditia de oprire n = n - 1 print("Start!")
5 4 3 2 1 Start!
n > 0 este verificata inainte de fiecare intrare in corp. Cand n ajunge la 0, conditia devine falsa si bucla se opreste - de aceea ultima valoare afisata este 1, nu 0.
3. Aplicatie clasica: suma cifrelor unui numar
while din programa (Prelucrari ale numerelor). Nu stim cate cifre are numarul, dar stim conditia de oprire: cat timp numarul mai are cifre (n > 0).
# Suma cifrelor lui 4729 = 4 + 7 + 2 + 9 n = 4729 suma = 0 while n > 0: cifra = n % 10 # ultima cifra suma = suma + cifra n = n // 10 # elimina ultima cifra print("Suma cifrelor:", suma)
Suma cifrelor: 22
n, numarul de cifre este aproximativ log10(n), deci complexitatea este O(log n) (logaritmica - foarte rapida).
4. Bucla infinita: cea mai frecventa greseala
# GRESIT - bucla infinita! (NU rula asa ceva) n = 5 while n > 0: print(n) # lipseste n = n - 1, deci n ramane mereu 5
- Verifica mereu ca exista o instructiune care modifica variabila din conditie.
- Asigura-te ca modificarea apropie conditia de a deveni falsa (daca
n > 0, scade n; nu il creste). - In timpul rularii, daca programul "ingheata" si nu se mai opreste, ai foarte probabil o bucla infinita - apasa Ctrl+C pentru a-l opri.
while True:), dar atunci ai nevoie de o instructiune break in interior care sa iasa din bucla cand se indeplineste o conditie - vezi atomul urmator.
5. while True + break: oprire la cerere
while True combinat cu break. Bucla ar fi infinita, dar break o opreste exact cand conditia este indeplinita.
incercari = 0 intrari = ["1111", "2468", "1234"] # simulam ce introduce utilizatorul while True: incercari = incercari + 1 parola = intrari[incercari - 1] print("Incercarea", incercari, "->", parola) if parola == "1234": break # conditia de oprire - iesim din bucla print("Acces permis dupa", incercari, "incercari")
Incercarea 1 -> 1111 Incercarea 2 -> 2468 Incercarea 3 -> 1234 Acces permis dupa 3 incercari
intrari ai folosi input() pentru a citi parola de la tastatura la fiecare repetare. Am folosit o lista fixa aici doar ca exemplul sa poata fi rulat automat si sa dea mereu acelasi rezultat.
6. while si do-while in C++ (EXCLUSIV intensiv)
while in C++ este similara cu Python, dar foloseste acolade { } si paranteze la conditie. In plus, C++ ofera structura do-while, care nu exista in Python.
#include <iostream> using namespace std; int main() { // while: verifica conditia INAINTE de prima executie int n = 5; while (n > 0) { cout << n << " "; n--; } cout << endl; // do-while: executa corpul cel putin O DATA, apoi verifica int x = 10; do { cout << "x = " << x << endl; x++; } while (x < 10); return 0; }
5 4 3 2 1 x = 10
x = 10, conditia x < 10 este falsa de la inceput. Un while obisnuit nu ar fi afisat nimic. Dar do-while executa corpul o data inainte de a verifica, de aceea apare x = 10. Foloseste do-while cand vrei ca actiunea sa se intample garantat cel putin o data (ex: afisarea unui meniu inainte de a citi optiunea).