Invatare Atomica

Structura WHILE

Progres lectie:
0%
🎯

Obiectivul lectiei

Dupa aceasta lectie, vei sti sa repeti instructiuni cat timp o conditie este adevarata.

Dupa aceasta lectie vei putea:

  • Sa analizezi structura repetitiva conditionata anterior
  • Sa utilizezi sintaxa while
  • Sa utilizezi exemplu: suma numerelor de la 1 la n
  • Sa aplici ⚠ atentie: bucla infinita

Incearca singur!

🎯 INCEARCA

Numara de la 1 la 5!

#include <iostream> using namespace std; int main() { int i = 1; // incepem de la 1 while (i <= 5) { // cat timp i <= 5 cout << i << " "; i = i + 1; // sau: i++ } cout << endl << "Gata!"; return 0; }
🚀 Ruleaza pe OnlineGDB

Output: 1 2 3 4 5
Gata!

1

Structura repetitiva conditionata anterior

🎵 Analogie: bucla = refren

Gandeste-te la un cantec cu refren. Dupa fiecare strofa verifici: „Mai are cantecul strofe?" Daca DA, canti refrénul si continui; daca NU, te opresti. Exact asa functioneaza o bucla: cat timp conditia e adevarata, repeti blocul de instructiuni. Cand conditia devine falsa, bucla se opreste — la fel ca un cantec care se termina.

Structura repetitiva conditionata anterior
WHILE verifica conditia inainte de a executa blocul. Daca conditia e falsa de la inceput, blocul nu se executa deloc!
START
Conditie?
DA →
Executa bloc
↑ (revine)
NU →
Continua
2

Sintaxa WHILE

Sintaxa WHILE
while (conditie) { // instructiuni care se repeta // IMPORTANT: modifica conditia pentru a iesi din bucla! }
3

Exemplu: Suma numerelor de la 1 la n

Exemplu: Suma numerelor de la 1 la n
int n, suma = 0, i = 1; cout << "n = "; cin >> n; while (i <= n) { suma = suma + i; // adaugam i la suma i++; // trecem la urmatorul } cout << "Suma: " << suma;

Pentru n=5: 1+2+3+4+5 = 15

4

⚠ Atentie: Bucla infinita!

⚠ Atentie: Bucla infinita!
Daca uiti sa modifici conditia, programul ruleaza la infinit!
// GRESIT - bucla infinita! int i = 1; while (i <= 5) { cout << i; // Lipseste: i++; }

Exercitii practice

Exercitiul 1 (Nivel minim) - Programare

Cerinta: Citeste un numar n si afiseaza numerele de la n la 1, despartite prin spatii.

Vezi rezolvarea

Folosim while cu un contor care scade, exact ca in exemplul sumei 1..n, doar ca in loc sa adunam, afisam si scadem.

  1. int n; cin >> n;
  2. int i = n;
  3. while (i >= 1) { cout << i << " "; i--; }

Pentru n=5 se afiseaza: 5 4 3 2 1. Atentie la capcana din lectie: fara i--, bucla ar fi infinita.

Exercitiul 2 (Nivel standard) - Programare

Cerinta: Citeste numere de la tastatura pana cand se introduce 0. Afiseaza suma tuturor numerelor citite (fara 0).

Vezi rezolvarea

Adaptam direct exemplul "Suma numerelor de la 1 la n": in loc sa ne oprim la n, ne oprim cand se citeste 0.

  1. int x, suma = 0;
  2. cin >> x; (citim prima valoare inainte de bucla)
  3. while (x != 0) { suma = suma + x; cin >> x; }
  4. cout << "Suma: " << suma;

Conditia de oprire a buclei este chiar valoarea citita (x != 0), verificata inainte de fiecare repetare, exact ca in sintaxa WHILE predata.

Exercitiul 3 (Nivel performanta) - Programare

Cerinta: Citeste un numar intreg pozitiv n si afiseaza prima cifra (cea mai semnificativa).

Vezi rezolvarea

Nota: extragerea cifrelor cu % si / intr-o bucla nu apare explicit in aceasta lectie, dar foloseste doar operatori deja cunoscuti (impartirea intreaga si restul) combinati cu WHILE.

Schita:

  1. Citeste n.
  2. while (n >= 10) n = n / 10; - imparte repetat la 10 pana ramane o singura cifra.
  3. cout << n; - ce ramane e prima cifra (cea mai semnificativa).

Exemplu: n=352 -> 35 -> 3, se opreste (3<10), afiseaza 3.

Exercitiul 4 (Nivel performanta) - Programare

Cerinta: Citeste un numar intreg pozitiv n si afiseaza cate cifre are.

Vezi rezolvarea

Nota: numararea cifrelor cu o bucla WHILE si impartire repetata la 10 nu e demonstrata explicit in lectie, dar reia acelasi tipar WHILE + impartire intreaga ca la exercitiul anterior.

  1. int n; cin >> n;
  2. int cifre = 0;
  3. while (n >= 1) { cifre++; n = n / 10; }
  4. cout << cifre;

Exemplu: n=352 -> 352,35,3 se numara de 3 ori pana n devine 0, deci cifre=3. Capcana: daca n pornea de la 0, bucla nu s-ar executa deloc (WHILE verifica inainte), asa ca enuntul cere explicit n pozitiv.

Exercitiul 5 (Nivel performanta) - Programare

Cerinta: Creeaza un joc in care calculatorul alege un numar secret iar utilizatorul trebuie sa-l ghiceasca. Urmeaza pasii:

  1. Declara un numar secret fix (de exemplu int secret = 42;) si o variabila int ghicit;.
  2. Foloseste o bucla while cu conditia ghicit != secret.
  3. In interiorul buclei: citeste ghicit de la tastatura.
  4. Dupa citire, afiseaza un indiciu: daca ghicit < secret afiseaza "Prea mic!", daca ghicit > secret afiseaza "Prea mare!".
  5. Cand utilizatorul ghiceste corect, bucla se opreste si afiseaza "Felicitari! Ai ghicit in X incercari." (numara incercarile cu un contor).
Vezi rezolvarea

Schita pas cu pas (foloseste doar WHILE si comparatiile din lectie):

  1. int secret = 42, ghicit; int incercari = 0;
  2. ghicit = secret + 1; - o valoare initiala diferita de secret, ca sa poata intra in bucla (necesar la WHILE, spre deosebire de DO-WHILE)
  3. while (ghicit != secret) { cin >> ghicit; incercari++; if (ghicit < secret) cout << "Prea mic!"; else if (ghicit > secret) cout << "Prea mare!"; }
  4. cout << "Felicitari! Ai ghicit in " << incercari << " incercari.";

Se puncteaza: initializarea corecta a lui ghicit pentru a intra in bucla, cele doua indicii, contorul de incercari.

Ce ai invatat astazi

  • Ai invatat structura repetitiva conditionata anterior
  • Acum stii sintaxa while
  • Ai descoperit exemplu: suma numerelor de la 1 la n
  • Ai explorat ⚠ atentie: bucla infinita

Vrei mai mult?

Stii suma 1..n si capcana buclei infinite. Ia un caz mai putin previzibil.

  • Provocare: Scrie un program care citeste numere pana cand utilizatorul introduce un numar NEGATIV (nu neaparat 0). La final afiseaza cate numere pozitive a introdus si media lor. Testeaza cu secventa 4, 8, 6, -1 - trebuie sa iasa 3 numere, media 6.
  • De ce? Conditia buclei WHILE trebuie sa depinda de o variabila care se schimba IN INTERIORUL buclei. Ce s-ar intampla daca ai verifica o conditie fara nicio legatura cu ce se intampla in corpul buclei?
  • Mai departe: Orice joc video ruleaza intr-o bucla while(jocul_continua) care verifica la fiecare cadru daca jucatorul a pierdut - exact mecanismul din aceasta lectie, doar rulat de 60 de ori pe secunda.

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →