Appearance
Conversia din pentru in repeta ... pana cand
Regula
La fel ca la cat timp, facem manual cei 3 pasi (initializare, conditie, incrementare), dar cu doua diferente: conditia se inverseaza (pana cand se opreste cand devine adevarata) si adaugam un daca de protectie, fiindca repeta executa corpul cel putin o data.
// pentru: // repeta echivalent:
┌ pentru i ← a, b executa i ← a ← 1. initializam noi
│ <instructiuni> ┌ daca i ≤ b atunci ← protectie (interval gol)
└■ │ ┌ repeta
│ │ <instructiuni>
│ │ i ← i + 1 ← 3. incrementam noi, la final
│ └ pana cand i > b ← 2. opusul lui i ≤ b
└■Exemplu
Problema: Suma primelor n numere naturale.
// Cu pentru: // Cu repeta:
citeste n citeste n
S ← 0 S ← 0
┌ pentru i ← 1, n executa i ← 1
│ S ← S + i ┌ daca i ≤ n atunci
└■ │ ┌ repeta
scrie S │ │ S ← S + i
│ │ i ← i + 1
│ └ pana cand i > n
└■
scrie SDe ce functioneaza
- Conditia se inverseaza. La
cat timpcontinuam cat timpi ≤ n; larepetane oprim cand conditia devine adevarata, deci scriem opusul:pana cand i > n. - Incrementarea ramane ultima in corp, ca si la
cat timp. daca-ul de protectie rezolva o problema ascunsa:repetaexecuta corpul macar o data, darpentrucu interval gol (ex.n = 0) nu executa nimic.daca i ≤ nne asigura ca sarim bucla in acel caz.
Pas negativ
Pentru un pentru descrescator (pentru i ← n, 1, -1), conditia de continuare e i ≥ 1, deci opusul ei este pana cand i < 1, iar protectia devine daca i ≥ 1 atunci:
i ← n
┌ daca i ≥ 1 atunci
│ ┌ repeta
│ │ <instructiuni>
│ │ i ← i - 1
│ └ pana cand i < 1
└■