9. Podmienka: IF, THEN, ELSEIF, ELSE, FI

Na čo to je

Program sa rozhoduje: niektoré príkazy vykoná, len keď niečo platí. „Ak je skóre viac ako rekord, vypíš gratuláciu.“

Ako sa to píše

Najkratší tvar:

Action!
IF podmienka THEN
  príkazy            ; vykonajú sa, len keď podmienka platí
FI

Plný tvar:

Action!
IF podmienka THEN
  príkazy            ; keď platí prvá podmienka
ELSEIF iná podmienka THEN
  príkazy            ; keď prvá neplatí a druhá áno
ELSE
  príkazy            ; keď neplatí žiadna
FI
SlovoVýznam
IF„ak“ – začína podmienku
THEN„tak“ – za ním sú príkazy, ktoré sa vykonajú
ELSEIF„inak ak“ – ďalšia podmienka; môže ich byť koľkokoľvek
ELSE„inak“ – čo spraviť, keď neplatilo nič
FIkoniec celého príkazu (IF odzadu)

ELSEIF a ELSE sú nepovinné. FI je povinné vždy.

Porovnania

ZápisPlatí, keď
a=bsa rovnajú
a#b alebo a<>bsa nerovnajú
a<ba je menšie
a>ba je väčšie
a<=ba je menšie alebo rovné
a>=ba je väčšie alebo rovné

Znak = má v Action! dve úlohy. V príkaze x=5 je to priradenie, za IF je to porovnanie. Prekladač to spozná podľa miesta.

Spájanie podmienok

ZápisPlatí, keď
podm1 AND podm2platia obe
podm1 OR podm2platí aspoň jedna

Celý program

Súbor examples/if.act:

Action!
; Decisions

PROC Main()
  BYTE age

  Print("How old are you? ")
  age=InputB()
  PutE()

  IF age<6 THEN
    PrintE("You do not go to school yet.")
  ELSEIF age<15 THEN
    PrintE("You go to primary school.")
  ELSEIF age<19 THEN
    PrintE("You go to secondary school.")
  ELSE
    PrintE("You are grown up.")
  FI

  IF age>=13 AND age<=19 THEN
    PrintE("You are a teenager.")
  FI

  IF age=0 OR age>120 THEN
    PrintE("Is that really your age?")
  FI

  IF age#18 THEN
    PrintE("You are not 18.")
  FI
RETURN

Preklad a spustenie

action26 if.act --sim

Čo uvidíš

Po zadaní čísla 14:

How old are you? 14

You go to primary school.
You are a teenager.
You are not 18.

Spusti program viackrát s rôznym vekom (3, 14, 17, 18, 40, 200) a sleduj, ktoré riadky sa vypíšu.

Ako to funguje

Prvý IF je reťaz. Podmienky sa skúšajú zhora nadol a vykoná sa len prvá vetva, ktorá platí. Pri veku 14 neplatí age<6, platí age<15 – vypíše sa „primary school“ a ostatné vetvy sa preskočia, hoci aj age<19 by platilo. Preto v druhej vetve netreba písať age>=6 AND age<15: keby bol vek menší ako 6, program by sa sem nedostal.

Ďalšie tri IF sú samostatné. Každý sa vyhodnotí zvlášť, takže sa môžu vypísať aj všetky.

age>=13 AND age<=19 je spôsob, ako zapísať „medzi 13 a 19“. Matematický zápis 13<=age<=19 Action! nepozná.

Časté chyby

Čo sa staloČo povie prekladač
chýba THENerror ACT012: missing THEN
chýba FIerror ACT013: missing FI – často až na konci súboru
== namiesto = (zvyk z jazyka C)error ACT012: missing THEN: expected THEN, got '=='
reťaz porovnaní (1<a<3)error ACT023: illegal conditional expression

Dve veci, ktoré prekladač nehlási:

Vyskúšaj si

  1. Pridaj vetvu pre vek presne 18: „You have just come of age.“
  2. Načítaj dve čísla a vypíš väčšie z nich. Čo vypíšeš, keď sú rovnaké?
  3. Načítaj číslo a vypíš, či je párne alebo nepárne. (Pomôže MOD z kapitoly 7.)

Zhrnutie

Späť: 8. Vstup · Ďalej: 10. Slučka