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

Action!
WHILE podmienka
DO
  príkazy
OD

WHILE znamená „kým“. Pred každým prechodom slučkou sa podmienka vyhodnotí:

Podmienka je taká istá ako pri IF (kapitola 9).

Je to skratka za:

Action!
DO
  IF podmienka neplatí THEN EXIT FI
  príkazy
OD

Celý program

Súbor examples/while.act:

Action!
; 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.")
RETURN

Preklad 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 podmienkynekonečná slučka
chýba DO za podmienkouerror 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

  1. Zmeň hranicu z 1000 na 50000. Koľkokrát sa hodnota zdvojnásobí?
  2. 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.)
  3. Načítaj číslo a vypíš, koľkokrát sa dá deliť dvoma, kým neklesne na 0.

Zhrnutie

Späť: 10. Slučka · Ďalej: 12. Slučka s podmienkou na konci