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

Atari BASIC
GOTO číslo riadka

Dá sa písať aj oddelene, GO TO 100. Spolu s IF je to všetko, čo treba na ľubovoľne zložitý program:

Atari BASIC
IF podmienka THEN GOTO 100
IF podmienka THEN 100

Druhý tvar je skratka prvého.

Celý program

Súbor examples/goto.abas vypisuje mocniny dvojky, kým neprekročia tisíc:

Atari BASIC
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 ";N

Preklad a spustenie

Basic26 goto.abas --sim

Čo uvidíš

1 2 4 8 16 32 64 128 256 512 
Done, N is 1024

Ako to funguje

Druhý program: hádaj číslo

S INPUT, IF a GOTO sa už dá napísať hra. Súbor examples/guess.abas:

Atari BASIC
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 --run

alebo s odpoveďami zo súboru examples/guess.in:

Basic26 guess.abas --sim --sim-input guess.in
Guess 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 tries

Riadky 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ú:

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 jeerror B26012: line 50 does not exist
slučka bez východuprogram 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 inampri 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

  1. Vypíš čísla od 10 do 1 pomocou IF a GOTO.
  2. Uprav guess.abas, aby po šiestich pokusoch prezradil číslo a skončil.
  3. Spýtaj sa na číslo; kým nie je medzi 1 a 10, pýtaj sa znova.

Zhrnutie

Späť: 8. Podmienka · Ďalej: 10. Slučka s počítadlom