11. Slučka s podmienkou na začiatku: WHILE
Na čo to je
Väčšina slučiek má jasné pravidlo, dokedy bežať: „kým je hodnota menšia ako tisíc“. WHILE ho zapíše priamo, bez IF a EXIT.
Ako sa to píše
WHILE podmienka
DO
príkazy
ODWHILE znamená „kým“. Pred každým prechodom slučkou sa podmienka vyhodnotí:
- platí → vykoná sa telo slučky a program sa vráti na
WHILE, - neplatí → slučka končí a program pokračuje za
OD.
Podmienka je taká istá ako pri IF (kapitola 9).
Je to skratka za:
DO
IF podmienka neplatí THEN EXIT FI
príkazy
ODCelý program
Súbor examples/while.act:
; WHILE: the condition is tested before each turn
PROC Main()
CARD value
BYTE count
value=1
count=0
WHILE value<1000
DO
PrintC(value) Put(' )
value==*2
count==+1
OD
PutE()
Print("Doubled ") PrintB(count) PrintE(" times.")
count=10
WHILE count>20
DO
PrintE("This line is never written.")
OD
PrintE("Done.")
RETURNPreklad a spustenie
action26 while.act --simČo uvidíš
1 2 4 8 16 32 64 128 256 512
Doubled 10 times.
Done.Ako to funguje
Prvá slučka zdvojnásobuje value, kým je menšie ako 1000. Vypíše 1, 2, 4 … 512. Po poslednom zdvojnásobení je value 1024, podmienka value<1000 prestane platiť a slučka skončí. Číslo 1024 sa už nevypíše – test je pred výpisom.
Druhá slučka sa nevykoná ani raz. count je 10, podmienka count>20 neplatí hneď na začiatku, a tak program telo preskočí. To je hlavná vlastnosť WHILE: telo sa nemusí vykonať vôbec.
V tele slučky sa musí meniť niečo, od čoho podmienka závisí. Keby v prvej slučke chýbalo value==*2, podmienka by platila navždy.
EXIT funguje aj vo WHILE – slučku ukončí predčasne.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
| v tele sa nemení premenná z podmienky | nekonečná slučka |
chýba DO za podmienkou | error ACT015: missing DO na prvom príkaze tela |
podmienka je opačne (> namiesto <) | slučka sa nevykoná ani raz, alebo nikdy neskončí |
Pozor na pretečenie (kapitola 7): keby value bolo BYTE, po 128 by nasledovalo 0 (256 sa do bajtu nezmestí), 0*2 je stále 0 a value<1000 platí vždy. Slučka by sa nikdy neskončila.
Vyskúšaj si
- Zmeň hranicu z 1000 na 50000. Koľkokrát sa hodnota zdvojnásobí?
- Napíš odpočítavanie: vypíš čísla od 10 po 1 a potom
Start!. (Premenná začína na 10 a v tele sa zmenšuje o 1.) - Načítaj číslo a vypíš, koľkokrát sa dá deliť dvoma, kým neklesne na 0.
Zhrnutie
WHILE podmienka DO … ODopakuje telo, kým podmienka platí.- Podmienka sa skúša pred každým prechodom – telo sa nemusí vykonať ani raz.
- V tele musí byť niečo, čo podmienku časom zmení.
Späť: 10. Slučka · Ďalej: 12. Slučka s podmienkou na konci