Invatare Atomica

Repeta pana cand - Bucla cu Conditie

Progres lectie:
0%
🎯

Obiectivul lectiei

Nu stii de cate ori trebuie sa repeti... Pisica merge 10 pasi dar nu stii cand ajunge la perete... Pui un numar la intamplare si ori se opreste prea devreme, ori depaseste ecranul... Este frustrant!

Dupa aceasta lectie vei putea:

  • Sa descrii structura 'REPETA...PANA CAND' (bucla cu conditie) in pseudocod
  • Sa diferentiezi intre 'REPETA de N ori' si 'REPETA PANA CAND'
  • Sa reprezentezi bucla cu conditie folosind schema logica
  • Sa scrii algoritmi care se repeta pana la indeplinirea unei conditii
  • Sa alegi tipul corect de bucla in functie de problema data

Incearca singur!

🎮 Incearca tu!

Provocare: Pisica merge pana la perete!

Inainte sa invatam teoria, sa vedem de ce avem nevoie de o bucla cu conditie. Incearca sa faci pisica Scratch sa mearga inainte pana cand atinge marginea ecranului, apoi sa ricoseteze inapoi.

  1. Deschide Scratch (scratch.mit.edu)
  2. Gandeste-te: stii de cati pasi are nevoie pisica pana la marginea ecranului? (NU stii!)
  3. Incearca cu "repeat (100)" si pune "move 10 steps" - ce se intampla? (depaseste ecranul sau se opreste prea devreme!)
  4. Acum cauta in Control blocul "repeat until < >"
  5. Pune conditia: "touching edge?" (din Sensing, albastru deschis)
  6. In interiorul buclei pune: "move 10 steps"
  7. Dupa bucla adauga: "turn 180 degrees" si alta bucla "repeat until touching edge" cu "move 10 steps"
VARIANTA GRESITA (cu repeat N):
START
  repeta de 50 ori:       (de ce 50? poate e prea mult sau prea putin!)
    mergi 10 pasi
STOP

VARIANTA CORECTA (cu repeat until):
START
  repeta PANA CAND <atingi marginea>:
    mergi 10 pasi
  intoarce-te 180 grade
  repeta PANA CAND <atingi marginea>:
    mergi 10 pasi
STOP
Observa diferenta! Cu "repeat until" nu trebuie sa ghicesti numarul de pasi. Programul se opreste EXACT cand conditia devine adevarata - indiferent daca sunt 10 iteratii sau 100!
💡 Indiciu #1: Unde gasesc blocul "repeat until"?
In Scratch: mergi la categoria Control (portocaliu). Blocul "repeat until < >" arata ca o bucla cu un hexagon gol in care pui o conditie booleana. Conditia se pune in spatiul hexagonal!
💡 Indiciu #2: Ce conditie pun in hexagon?
Mergi la Sensing (albastru deschis) si gaseste "touching [edge]?". Trage acest bloc in hexagonul de la "repeat until". Acum bucla va repeta PANA CAND pisica atinge marginea ecranului!
💡 Indiciu #3: Cum fac ricoseu (bounce)?
Dupa prima bucla "repeat until", adauga "turn 180 degrees" din Motion. Apoi pune a doua bucla "repeat until touching edge" cu "move 10 steps" inauntru. Pisica va merge inapoi pana atinge cealalta margine!

🌟 Provocare Bonus (optional)

Modifica programul astfel incat:

  • Pisica sa se miste continuu intre cele doua margini (hint: pune totul intr-un bloc "forever")
  • Pisica sa spuna "Am ajuns!" de fiecare data cand atinge marginea
  • Pisica sa isi schimbe culoarea la fiecare ricoseu
1

1. Continut

🎯
Ce este bucla "Repeta pana cand"?
Definitie: Bucla "repeta pana cand" (repeat until) este o structura de control care executa un bloc de instructiuni in mod repetat PANA CAND o conditie devine ADEVARATA. Spre deosebire de "repeta de N ori", aici NU stii dinainte de cate ori se va repeta bucla - ea se opreste doar cand conditia de iesire este indeplinita.
Analogii din viata ta:

"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
Gandeste-te asa: "repeat N" = stii CATE ori repeti. "repeat until" = stii CAND sa te opresti, dar nu stii cate repetari va dura.
Daca conditia nu devine niciodata adevarata, bucla ruleaza LA INFINIT! De exemplu: "repeta pana cand x = 5" dar x nu se schimba niciodata in corpul buclei = bucla infinita!
2

2. Continut

⚖️
Repeat N vs. Repeat Until - Comparatie
Regula de aur: Foloseste "repeta de N ori" cand STII dinainte numarul de repetari. Foloseste "repeta pana cand" cand NU STII numarul, dar STII conditia de oprire.
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):

repeat (50)
  move 10 steps

Problema: 50 e suficient?
Poate e prea mult/putin!

Cu repeat until (sigur):

repeat until <touching edge>
  move 10 steps

Perfect! Se opreste exact
cand atinge marginea!
In Scratch, gasesti ambele blocuri in categoria Control (portocaliu). "repeat (N)" este prima varianta, iar "repeat until < >" este a doua. Ele se folosesc in situatii diferite!
3

3. Continut

📊
Diagrama de flux cu "Repeta pana cand"
Reprezentare: In diagramele de flux, bucla "repeta pana cand" se reprezinta cu un simbol ROMB (diamond) pentru conditia de decizie. Rombul are doua iesiri: DA (conditia e adevarata - iesi din bucla) si NU (conditia e falsa - continua repetarea).
START
BUCLA REPEAT UNTIL
mergi 10 pasi
◇ Atingi marginea?
NU ↶ (repeta) DA ↓ (iesi)
STOP

📋 Exemplu complet: Diagrama pentru "Ghiceste numarul"

START
  ↓
[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!

Simbolul ROMB (◇) este cheia! In "repeat N" nu ai nevoie de decizie - contorul decide automat. In "repeat until" ai NEVOIE de un test (romb) care verifica conditia la fiecare iteratie.
4

4. Continut

🐱
Blocul "repeat until" in Scratch
Implementare: In Scratch, blocul "repeat until < >" se gaseste in categoria Control (portocaliu). In spatiul hexagonal pui o conditie booleana (din Sensing, Operators, sau Variables). Blocurile din interior se executa pana cand conditia devine adevarata.

Cum se foloseste in Scratch:

  1. Click pe categoria Control
  2. Trage blocul repeat until < > in zona de script
  3. Pune o conditie booleana in hexagonul gol (ex: touching edge, answer = 5, timer > 10)
  4. Trage blocurile care trebuie repetate inauntrul buclei
  5. 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

when [green flag ▼] clicked
repeat until <touching [mouse-pointer ▼]?>
point towards [mouse-pointer ▼]
move (5) steps
say [Te-am prins!] for (2) seconds

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

when [green flag ▼] clicked
reset timer
repeat until <timer > 10>
say (join [Timp: ] (round (timer)))
say [Timpul a expirat!] for (2) seconds

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!

In Scratch, conditiile booleane au forma de HEXAGON. Doar blocurile hexagonale pot fi puse in spatiul conditie al blocului "repeat until". Cauta-le in Sensing (albastru deschis) si Operators (verde)!
5

5. Continut

📝
Tabela de urmarire pentru "Repeta pana cand"
Diferenta fata de repeat N: La "repeat N", tabelul are exact N randuri (stii dinainte). La "repeat until", tabelul creste pana cand conditia devine TRUE - nu stii dinainte cate randuri vei avea!

📊 Exemplu: Tabela pentru "numara pana la primul multiplu de 7 peste 100"

START
  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!

Observa ca la "repeat until", randul final al tabelei este intotdeauna cel in care conditia devine TRUE. Acesta este momentul in care bucla se opreste. Coloreaza-l diferit pentru a-l evidentia!
6

6. Continut

🚨
Greseli frecvente si cum sa le eviti
Bucla infinita - conditia nu devine niciodata TRUE!
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").
Conditia inversata!
"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.
Conditia care sare peste valoarea tinta!
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:

x = 0
repeat until (x = 100)
  x = x + 7

x: 7, 14, 21... 98, 105
Nu ajunge la exact 100!
→ BUCLA INFINITA!

CORECT:

x = 0
repeat until (x >= 100)
  x = x + 7

x: 7, 14, 21... 98, 105
105 >= 100 → TRUE!
→ Se opreste corect!
Inainte de a rula programul, gandeste-te: "Exista vreo situatie in care conditia nu devine niciodata TRUE?" Daca raspunsul e DA, ai o problema de bucla infinita! In Scratch, apasa butonul rosu (STOP) pentru a opri un program blocat.

Exercitii practice

Exercitiul 1 (Nivel minim) -

Exercitiu Analitic
Urmareste executia buclei "repeat until"

Analizeaza urmatorul pseudocod si completeaza tabela de urmarire:

suma = 0
contor = 1
repeta pana cand (suma > 50):
    suma = suma + contor
    contor = contor + 2
afiseaza suma
afiseaza contor

Sarcina: Creeaza o tabela cu coloanele: Iteratie, suma (inainte), contor (inainte), Operatii, suma (dupa), contor (dupa), Conditie (suma > 50). Gaseste valorile finale.

Exercitiul 2 (Nivel standard) -

Exercitiu Aplicativ
Jocul "Ghiceste numarul" in Scratch

Creeaza in Scratch un joc in care calculatorul alege un numar secret intre 1 si 20, iar jucatorul trebuie sa il ghiceasca. Programul da indicii: "Prea mic!" sau "Prea mare!".

Cerinte:

  • Seteaza o variabila "secret" la un numar aleatoriu intre 1 si 20
  • Seteaza o variabila "incercari" la 0
  • Foloseste "repeat until (answer = secret)"
  • In bucla: intraba "Ghiceste numarul (1-20)!", creste incercari cu 1
  • Daca answer < secret, spune "Prea mic!" 1 secunda
  • Daca answer > secret, spune "Prea mare!" 1 secunda
  • Dupa bucla, spune "Bravo! Ai ghicit din [incercari] incercari!"

Exercitiul 3 (Nivel performanta) -

Exercitiu Creativ
Proiect: Jocul de pescuit

Creeaza un joc in Scratch in care un pescar arunca undita si asteapta pana cand prinde un peste!

Idee de design:

  1. Sprite 1: Pescar (sta pe loc, are undita aruncata in apa)
  2. Sprite 2: Peste (se misca aleatoriu sub apa, stanga-dreapta)
  3. Pestele se misca aleatoriu: "repeat until <touching [Pescar]?>": glide to random position
  4. Cand pestele atinge undita/pescarul, bucla se opreste
  5. Dupa prindere: pescarul spune "Am prins un peste!", se aude un sunet, scorul creste
  6. Bonus: adauga mai multi pesti cu viteze diferite si un cronometru!

Exercitiul 4 (Nivel performanta) -

Exercitiu Matematic
Gaseste primul numar din sir

Scrie un algoritm in pseudocod care gaseste primul numar mai mare decat 100 care este simultan:

  • Divizibil cu 7 (adica numar MOD 7 = 0)
  • SI impar (adica numar MOD 2 = 1)

Cerinte: Foloseste "repeat until" cu conditia combinata. Porneste de la 101 si creste cu 1 la fiecare pas.

Ce ai invatat astazi

  • Conceptul:Bucla "repeat until" - repeta pana cand conditia devine TRUE
  • Diferenta:Repeat N = stii CATE ori, Repeat until = stii CAND sa te opresti
  • Conditie:Un test boolean care se verifica la fiecare iteratie
  • Scratch:Blocul "repeat until < >" din Control + conditii din Sensing/Operators
  • Diagrama:Simbolul romb (diamond) pentru decizia de oprire
  • Greseli:Bucla infinita cand conditia nu devine TRUE, conditie inversata, valoare care sare peste tinta
  • Aplicatii:Jocuri (ghiceste numarul), animatii (mergi pana la perete), cautari (gaseste primul numar)

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →