Invatare Atomica

Bucla WHILE (cat timp)

Progres lectie:
0%
🎯

Obiectivul lectiei

Vei invata sa repeti instructiuni cat timp o conditie ramane adevarata, atunci cand NU stii dinainte de cate ori se va repeta. Vei stapani conditia de oprire, vei evita buclele infinite si vei intelege diferenta dintre while si do-while.

Dupa aceasta lectie vei putea:

  • Sa scrii o bucla while in Python si sa identifici cele 3 parti: initializare, conditie, actualizare
  • Sa alegi corect intre for (repetari cunoscute) si while (repetari necunoscute)
  • Sa formulezi o conditie de oprire corecta si sa explici de ce apar buclele infinite
  • Sa trasezi pas cu pas executia unei bucle (tabel de trasare) - exercitiu tip Bac
  • Sa scrii bucle while si do-while in C++ si sa explici diferenta dintre ele (nivel intensiv)

Incearca singur!

Provocare:

Ai numarul 4729. Vrei sa aduni cifrele lui: 4 + 7 + 2 + 9. Problema: nu stii dinainte cate cifre are un numar oarecare. Cum ai descrie in cuvinte un procedeu care merge pentru ORICE numar, repetand cat timp mai exista cifre?

💡 Ai nevoie de un indiciu?

Ultima cifra a unui numar este restul impartirii la 10 (n % 10). Ca sa scapi de ea, imparti numarul la 10 (impartire intreaga: n // 10).

Repeti cat timp numarul mai are cifre, adica cat timp n > 0. Aceasta este o bucla while: nu stii numarul de pasi dinainte, dar stii conditia de oprire.

1

1. Cand ai nevoie de WHILE?

Bucla while (in romana: cat timp) repeta un bloc de instructiuni atat timp cat o conditie este adevarata. O folosesti cand nu stii dinainte de cate ori se va repeta, dar stii cand trebuie sa te opresti.
FOR vs WHILE - cum alegi:
  • 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".
Analogie sigura:

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

2. Anatomia unei bucle while (Python)

O bucla 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!")
Rezultat real (rulat cu python):
5
4
3
2
1
Start!
Observa ordinea: conditia 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

3. Aplicatie clasica: suma cifrelor unui numar

Aceasta este una dintre cele mai importante aplicatii ale buclei 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)
Rezultat real (rulat cu python):
Suma cifrelor: 22
Verificare: 4 + 7 + 2 + 9 = 22. ✓ Complexitate: bucla face un pas pentru fiecare cifra, deci numarul de pasi este proportional cu numarul de cifre. Pentru un numar n, numarul de cifre este aproximativ log10(n), deci complexitatea este O(log n) (logaritmica - foarte rapida).
4

4. Bucla infinita: cea mai frecventa greseala

O bucla infinita apare cand conditia nu devine niciodata falsa. Cea mai des intalnita cauza: ai uitat sa actualizezi variabila de control in interiorul buclei.
# GRESIT - bucla infinita! (NU rula asa ceva)
n = 5
while n > 0:
    print(n)
    # lipseste n = n - 1, deci n ramane mereu 5
Cum eviti buclele infinite:
  • 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.
Exista si bucle infinite intentionate (ex: 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

5. while True + break: oprire la cerere

Cand vrei sa repeti pana se intampla ceva (ex: pana se introduce parola corecta), un tipar foarte util este 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")
Rezultat real (rulat cu python):
Incercarea 1 -> 1111
Incercarea 2 -> 2468
Incercarea 3 -> 1234
Acces permis dupa 3 incercari
In programe reale, in loc de lista 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

6. while si do-while in C++ (EXCLUSIV intensiv)

Aceasta sectiune este EXCLUSIV pentru specializarea intensiv informatica (C++ ca al doilea limbaj). Sintaxa 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;
}
Rezultat real (compilat cu g++ -std=c++17, apoi rulat):
5 4 3 2 1
x = 10
Momentul cheie: pentru 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).

Exercitii practice

Exercitiul 1 (Nivel minim) - Numaratoare inversa

Scrie o bucla while in Python care afiseaza numerele de la 10 la 1 (descrescator), fiecare pe o linie, apoi afiseaza "Decolare!". Indica clar care este initializarea, conditia si actualizarea.

Exercitiul 2 (Nivel standard) - Numarul de cifre

Scrie un program care, pentru numarul n = 100500, afiseaza cate cifre are, folosind o bucla while (impartiri repetate la 10). Indiciu: porneste un contor de la 0 si numara cate impartiri la 10 sunt nevoie pana n devine 0.

Verificare: rezultatul corect este 6 (rulat cu python: 100500 are cifrele 1, 0, 0, 5, 0, 0).

Exercitiul 3 (Nivel performanta) - Sirul lui Collatz

Pornind de la n = 27, aplica regula: daca n este par, n = n // 2; daca este impar, n = 3 * n + 1. Repeta cat timp n != 1 si numara cati pasi sunt necesari pana ajungi la 1. (Pentru intensiv: rezolva si in C++.)

Verificare: pentru n = 27, raspunsul corect este 111 pasi (rulat cu python). Acesta este un exemplu perfect de problema unde NU poti folosi for: nu stii dinainte cati pasi vor fi - de aceea ai nevoie de while.

Ce ai invatat astazi

  • Bucla while repeta cat timp o conditie este adevarata - pentru repetari cu numar necunoscut
  • Cele 3 parti obligatorii: initializare (inainte), conditie (verificata la inceput), actualizare (in interior)
  • Cum se face suma cifrelor / numararea cifrelor cu % 10 si // 10 - complexitate O(log n)
  • Bucla infinita apare cand uiti sa actualizezi variabila de control; while True + break pentru oprire la cerere
  • (Intensiv) In C++: while cu acolade si diferenta fata de do-while (executat cel putin o data)

Urmatoarea lectie

Continua cu Algoritmi simpli cu bucle: vei combina for si while pentru a rezolva probleme complete - verificarea numerelor prime, inversul unui numar si alte aplicatii tip Bac.

Continua →