1. Continut
"Amesteca aluatul pana cand devine omogen" - nu stii daca dureaza 1 minut sau 5 minute!
"Alearga pana cand ajungi la perete" - nu stii daca sunt 10 metri sau 50 de metri!
"Cauta pana cand gasesti cheia" - poate o gasesti in primul sertar, poate in al zecelea!
In toate cazurile, nu numeri repetarile - te opresti cand conditia este indeplinita.
Componentele buclei "repeta pana cand":
| Component | Descriere | Exemplu |
|---|---|---|
| Conditia de oprire | Un test boolean care se verifica la fiecare iteratie | pana cand <atingi marginea> |
| Corpul buclei | Instructiunile care se repeta | mergi 10 pasi |
| Momentul iesirii | Cand conditia devine TRUE, bucla se opreste | Pisica a atins marginea → STOP |
2. Continut
| Criteriu | Repeta de N ori | Repeta pana cand |
|---|---|---|
| Numar iteratii | CUNOSCUT dinainte (ex: 10) | NECUNOSCUT (depinde de conditie) |
| Se opreste cand | Contorul ajunge la N | Conditia devine TRUE |
| Exemplu viata reala | "Fa 10 genuflexiuni" | "Alearga pana obosesti" |
| Exemplu Scratch | repeat (10): move 10 | repeat until <touching edge>: move 10 |
| Risc bucla infinita | NU (se opreste dupa N) | DA (daca conditia nu devine TRUE) |
| Bloc Scratch | repeat (N) | repeat until < > |
🎯 Exemplu: Aceeasi problema, doua abordari
Problema: Pisica trebuie sa ajunga la marginea ecranului.
Cu repeat N (nesigur):
move 10 steps
Problema: 50 e suficient?
Poate e prea mult/putin!
Cu repeat until (sigur):
move 10 steps
Perfect! Se opreste exact
cand atinge marginea!
3. Continut
📋 Exemplu complet: Diagrama pentru "Ghiceste numarul"
↓
[secret = numar aleatoriu 1-10]
↓
╔═══════════════════════════════╗
║ BUCLA: repeta pana cand ║
╠───────────────────────────────╣
║ [intraba "Ghiceste numarul!"] ║
║ ↓ ║
║ [raspuns = answer] ║
║ ↓ ║
║ ◇ raspuns = secret? ║
║ NU ↶ spune "Incearca iar!" ║
║ DA ↓ (iesi din bucla) ║
╚═══════════════════════════════╝
↓
[spune "Bravo! Ai ghicit!"]
↓
STOP
Explicatie: Bucla intreba utilizatorul sa ghiceasca un numar. Daca raspunsul NU este egal cu secretul, se repeta intrebarea. Cand raspunsul ESTE corect, conditia devine TRUE si programul iese din bucla. Nu stii dinainte daca va ghici din prima sau din a 20-a incercare!
4. Continut
Cum se foloseste in Scratch:
- Click pe categoria Control
- Trage blocul repeat until < > in zona de script
- Pune o conditie booleana in hexagonul gol (ex: touching edge, answer = 5, timer > 10)
- Trage blocurile care trebuie repetate inauntrul buclei
- Apasa green flag si urmareste executia!
Conditii comune pe care le poti folosi:
| Conditie | Categorie Scratch | Cand devine TRUE |
|---|---|---|
| touching [edge]? | Sensing (albastru deschis) | Cand sprite-ul atinge marginea ecranului |
| touching [Sprite2]? | Sensing | Cand sprite-ul atinge alt sprite |
| touching color [#ff0000]? | Sensing | Cand sprite-ul atinge o anumita culoare |
| key [space] pressed? | Sensing | Cand utilizatorul apasa o tasta |
| answer = "da" | Operators + Sensing | Cand raspunsul utilizatorului e "da" |
| timer > 10 | Operators + Sensing | Cand au trecut 10 secunde |
🎮 Exemplu complet: Pisica urmareste mouse-ul
Ce face: Pisica se indreapta spre cursorul mouse-ului si se misca 5 pasi la fiecare iteratie. Cand atinge cursorul, iese din bucla si spune "Te-am prins!". Nu stii cate iteratii va dura - depinde de cat de departe este mouse-ul!
🎮 Exemplu: Cronometru cu limita de timp
Ce face: Afiseaza cronometrul in timp real. Cand timer-ul depaseste 10 secunde, bucla se opreste si apare mesajul "Timpul a expirat!". Foarte util pentru jocuri cu limita de timp!
5. Continut
📊 Exemplu: Tabela pentru "numara pana la primul multiplu de 7 peste 100"
numar = 101
repeta pana cand (numar MOD 7 = 0):
numar = numar + 1
afiseaza numar
STOP
| Iteratie | numar | numar MOD 7 | Conditie (MOD 7 = 0)? | Actiune |
|---|---|---|---|---|
| - | 101 | - | - | Initializare |
| 1 | 101 | 101 MOD 7 = 3 | FALS (3 ≠ 0) | numar = 102 |
| 2 | 102 | 102 MOD 7 = 4 | FALS (4 ≠ 0) | numar = 103 |
| 3 | 103 | 103 MOD 7 = 5 | FALS (5 ≠ 0) | numar = 104 |
| 4 | 104 | 104 MOD 7 = 6 | FALS (6 ≠ 0) | numar = 105 |
| 5 | 105 | 105 MOD 7 = 0 | ADEVARAT! | IESI din bucla! |
Rezultat: numar = 105. Primul multiplu de 7 mai mare decat 100 este 105 (105 = 7 x 15). Bucla s-a executat de 5 ori - nu puteam sti dinainte acest numar!
6. Continut
Exemplu gresit: "repeta pana cand (x = 10)" dar in corpul buclei nu modifici niciodata x. Daca x ramane 5 tot timpul, conditia nu va fi niciodata adevarata si bucla ruleaza la infinit!
Solutie: Asigura-te ca in corpul buclei exista o instructiune care face conditia sa se apropie de TRUE (ex: "change x by 1").
"repeat until" se opreste cand conditia este TRUE. Daca vrei sa repeti "cat timp x < 10", NU pune "repeat until (x < 10)" - aceasta se opreste imediat daca x este deja mai mic decat 10! Pune "repeat until (x >= 10)" sau "repeat until (NOT (x < 10))".
Solutie: Gandeste-te: "Cand vreau sa ma OPRESC?" si pune acea conditie.
Exemplu: "repeta pana cand (x = 100)" si in bucla faci "x = x + 7". Valorile lui x vor fi: 7, 14, 21... 98, 105. Niciodata nu va fi exact 100! Bucla infinita!
Solutie: Foloseste "x >= 100" in loc de "x = 100" cand incrementezi cu pasi mai mari decat 1.
🔍 Exemplu: Conditie corecta vs. gresita
GRESIT:
repeat until (x = 100)
x = x + 7
x: 7, 14, 21... 98, 105
Nu ajunge la exact 100!
→ BUCLA INFINITA!
CORECT:
repeat until (x >= 100)
x = x + 7
x: 7, 14, 21... 98, 105
105 >= 100 → TRUE!
→ Se opreste corect!