8. Podmienka: IF, THEN, AND, OR, NOT
Na čo to je
Program, ktorý robí vždy to isté, je nudný. IF mu dáva možnosť rozhodnúť sa: niečo vykoná, len keď platí podmienka.
Ako sa to píše
IF podmienka THEN príkazy
IF podmienka THEN číslo riadka| Slovo | Význam |
|---|---|
IF | „ak“ |
podmienka | otázka, na ktorú sa dá odpovedať áno alebo nie: AGE<18 |
THEN | „tak“ |
príkazy | čo sa má vykonať, keď podmienka platí – všetko až do konca riadka |
číslo riadka | skratka: THEN 100 je to isté ako THEN GOTO 100 (kapitola 9) |
Keď podmienka neplatí, program pokračuje ďalším riadkom.
Porovnania:
| Znak | Význam |
|---|---|
= | rovná sa |
<> | nerovná sa |
< > | menšie, väčšie |
<= >= | menšie alebo rovné, väčšie alebo rovné |
Podmienky sa dajú spájať:
| Slovo | Platí, keď |
|---|---|
A AND B | platí A a zároveň B |
A OR B | platí aspoň jedno z nich |
NOT A | A neplatí |
Celý program
Súbor examples/if.abas:
10 REM IF: deciding
20 DIM ANSWER$(10)
30 PRINT "How old are you";
40 INPUT AGE
50 IF AGE<0 THEN PRINT "That cannot be":END
60 IF AGE<18 THEN PRINT "You are a child"
70 IF AGE>=18 THEN PRINT "You are an adult"
80 IF AGE>=13 AND AGE<=19 THEN PRINT "You are a teenager"
90 IF AGE=7 OR AGE=77 THEN PRINT "A lucky number!"
100 IF NOT (AGE=100) THEN PRINT "Not a hundred yet"
110 PRINT "Do you like BASIC";
120 INPUT ANSWER$
130 IF ANSWER$="YES" THEN PRINT "So do I"
140 IF ANSWER$<>"YES" THEN PRINT "You will"
150 PRINT "13<18 is ";13<18;", 13>18 is ";13>18Preklad a spustenie
V emulátore, s vlastnými odpoveďami:
Basic26 if.abas --runV simulátore s odpoveďami zo súboru examples/if.in (15 a YES):
Basic26 if.abas --sim --sim-input if.inČo uvidíš
How old are you?15
You are a child
You are a teenager
Not a hundred yet
Do you like BASIC?YES
So do I
13<18 is 1, 13>18 is 0Ako to funguje
- Riadok 50: za
THENsú dva príkazy oddelené dvojbodkou. Oba patria k podmienke – keď vek nie je záporný, nevykoná sa aniPRINT, aniEND. To je dôležité pravidlo:IFrozhoduje o celom zvyšku riadka. - Riadky 60 a 70: Atari BASIC nemá „inak“ (
ELSE). Opačný prípad sa napíše ako druhýIFs opačnou podmienkou. (Turbo-BASIC XLELSEmá, kapitola 27.) - Riadok 80:
AND– musia platiť obe podmienky. Pozor: nedá sa napísať13<=AGE<=19ako v matematike, každé porovnanie musí byť celé. - Riadok 90:
OR– stačí jedna. - Riadok 100:
NOTobráti odpoveď. Porovnanie za ním daj do zátvorky: v Atari BASICu saNOTviaže len na to, čo stojí tesne za ním, takžeNOT AGE=100by znamenalo(NOT AGE)=100. - Riadky 130 a 140: reťazce sa porovnávajú rovnako ako čísla. Rovnajú sa, len keď sú rovnaké znak po znaku –
"YES"a"yes"sú rôzne. - Riadok 150: podmienka je pre BASIC tiež číslo: 1, keď platí, a 0, keď neplatí. A naopak,
IFberie každé nenulové číslo ako „platí“ –IF A THEN …znamená „ak A nie je nula“.
Reťazce sa dajú porovnávať aj na menší a väčší; rozhoduje poradie znakov v tabuľke Atari, kde sú veľké písmená pred malými. "B"<"C" platí a "abc">"ABC" tiež.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
chýba THEN | error B26043: expected THEN |
porovnanie reťazca s číslom (IF A$=5) | error B26042: cannot compare a string with a number |
| príkaz za dvojbodkou mal platiť vždy | nevykoná sa, keď podmienka neplatí – daj ho na ďalší riadok |
NOT A=B bez zátvorky | počíta sa (NOT A)=B |
IF A=1 OR 2 | platí vždy: číta sa „A je 1, alebo 2“ a dvojka je nenulová. Píš A=1 OR A=2 |
| porovnanie vypočítaných čísel na rovnosť | 1/3*3 je 0.999999999, nie 1, takže IF X=1 neplatí; porovnávaj ABS(X-1)<0.0001 |
Vyskúšaj si
- Spýtaj sa na číslo a vypíš, či je kladné, záporné alebo nula.
- Spýtaj sa na číslo a vypíš, či je párne. (Zvyšok po delení dvoma je v kapitole 5.)
- Spýtaj sa na heslo a vypíš
Welcome, len keď sedí.
Zhrnutie
IF podmienka THEN príkazyvykoná zvyšok riadka, len keď podmienka platí.- Porovnania:
= <> < > <= >=, pre čísla aj reťazce. AND– obe,OR– aspoň jedna,NOT– naopak (so zátvorkou).- Platí je 1, neplatí je 0.
- „Inak“ sa v Atari BASICu píše druhým
IFs opačnou podmienkou.