9. Skok: GOTO
Na čo to je
Program beží po riadkoch zhora nadol. GOTO (anglicky go to, „choď na“) toto poradie poruší: prikáže pokračovať na inom riadku. Skokom dozadu vznikne opakovanie, skokom dopredu sa kus programu preskočí.
Ako sa to píše
GOTO číslo riadkaDá sa písať aj oddelene, GO TO 100. Spolu s IF je to všetko, čo treba na ľubovoľne zložitý program:
IF podmienka THEN GOTO 100
IF podmienka THEN 100Druhý tvar je skratka prvého.
Celý program
Súbor examples/goto.abas vypisuje mocniny dvojky, kým neprekročia tisíc:
10 REM GOTO: jumping to another line
20 N=1
30 PRINT N;" ";
40 N=N*2
50 IF N>1000 THEN GOTO 70
60 GOTO 30
70 PRINT
80 PRINT "Done, N is ";NPreklad a spustenie
Basic26 goto.abas --simČo uvidíš
1 2 4 8 16 32 64 128 256 512
Done, N is 1024Ako to funguje
- Riadky 30 až 60 sa opakujú. Riadok 60 posiela program späť na riadok 30 – to je slučka.
- Riadok 50 je východ zo slučky: keď
Nprekročí tisíc, skočí sa dopredu na riadok 70, za slučku. - Keby riadok 50 chýbal, program by sa točil donekonečna. Na Atari sa taký program zastaví klávesom BREAK; simulátor sa po desiatich miliónoch krokov vzdá sám.
Druhý program: hádaj číslo
S INPUT, IF a GOTO sa už dá napísať hra. Súbor examples/guess.abas:
10 REM A guessing game with IF and GOTO
20 SECRET=37:TRIES=0
30 PRINT "Guess my number (1-100)";
40 INPUT G
50 TRIES=TRIES+1
60 IF G<SECRET THEN PRINT "Too small":GOTO 30
70 IF G>SECRET THEN PRINT "Too big":GOTO 30
80 PRINT "Yes! It took you ";TRIES;" tries"Basic26 guess.abas --runalebo s odpoveďami zo súboru examples/guess.in:
Basic26 guess.abas --sim --sim-input guess.inGuess my number (1-100)?50
Too big
Guess my number (1-100)?25
Too small
Guess my number (1-100)?37
Yes! It took you 3 triesRiadky 60 a 70 sú typický tvar: „ak niečo nesedí, povedz to a choď späť“. Na riadok 80 sa program dostane, len keď neplatí ani jedno – číslo je uhádnuté. Tajné číslo je zatiaľ vždy 37; náhodné príde v kapitole 16.
Prečo s GOTO šetriť
GOTO je silný a ľahko sa ním spraví neporiadok. Program, v ktorom sa skáče krížom-krážom, sa nedá čítať – hovorí sa mu „špagetový“. Niekoľko zvykov, ktoré pomáhajú:
- Na opakovanie so známym počtom použi
FOR(kapitola 10). - Skákaj dozadu len na začiatok slučky a dopredu len za jej koniec.
- Cieľ skoku označ komentárom:
500 REM Game over.
V Turbo-BASICu XL sa dá väčšina GOTO nahradiť slučkami WHILE, REPEAT a DO (kapitoly 28 a 29).
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
| skok na riadok, ktorý nie je | error B26012: line 50 does not exist |
| slučka bez východu | program neskončí; simulátor to po desiatich miliónoch krokov vzdá: error B26213: instruction limit reached |
GOTO na vlastný riadok (30 GOTO 30) | program stojí na mieste – niekedy sa to robí naschvál, aby obrazovka ostala |
po prečíslovaní riadkov ukazuje GOTO inam | pri vsúvaní riadkov nemeň čísla tých, na ktoré sa skáče |
Interpreter na Atari by skok na neexistujúci riadok ohlásil až počas behu (chyba 12), a len keby naň program naozaj prišiel. Prekladač to vidí hneď.
Vyskúšaj si
- Vypíš čísla od 10 do 1 pomocou
IFaGOTO. - Uprav
guess.abas, aby po šiestich pokusoch prezradil číslo a skončil. - Spýtaj sa na číslo; kým nie je medzi 1 a 10, pýtaj sa znova.
Zhrnutie
GOTO npokračuje riadkomn.- Skok dozadu je slučka; potrebuje
IF, ktorým sa z nej dá vyjsť. IF … THEN 100je skratka zaIF … THEN GOTO 100.- Riadok, na ktorý sa skáče, musí existovať.
Späť: 8. Podmienka · Ďalej: 10. Slučka s počítadlom