28. Slučky s podmienkou: REPEAT, UNTIL, WHILE, WEND
Na čo to je
FOR sa hodí, keď vieš, koľkokrát opakovať. Často to však nevieš: „opakuj, kým hráč neuhádne“, „čítaj, kým nie je koniec“. V Atari BASICu na to bol IF a GOTO (kapitola 9). Turbo-BASIC XL má dve slučky, ktoré to povedia priamo.
Ako sa to píše
REPEAT
príkazy
UNTIL podmienka„Opakuj …, až kým podmienka nezačne platiť.“ Podmienka sa skúša na konci, takže telo sa vykoná aspoň raz.
WHILE podmienka
príkazy
WEND
„Kým podmienka platí, opakuj …“ Podmienka sa skúša na začiatku, takže telo sa nemusí vykonať ani raz. WEND je skratka z while end.
REPEAT … UNTIL | WHILE … WEND | |
|---|---|---|
| kedy sa skúša podmienka | po tele | pred telom |
| telo sa vykoná | najmenej raz | možno ani raz |
| slučka končí, keď podmienka | platí | neplatí |
Celý program
Súbor examples/loops.tbas:
10 REM REPEAT ... UNTIL and WHILE ... WEND
20 N=1
30 REPEAT
40 PRINT N;" ";
50 N=N*2
60 UNTIL N>1000
70 PRINT
80 REM The greatest common divisor of two numbers
90 A=84:B=36
100 WHILE A<>B
110 IF A>B
120 A=A-B
130 ELSE
140 B=B-A
150 ENDIF
160 WEND
170 PRINT "The divisor is ";A
180 REM WHILE may not run at all, REPEAT runs at least once
190 K=10
200 WHILE K<5:PRINT "WHILE ran":WEND
210 REPEAT:PRINT "REPEAT ran":UNTIL K>5Preklad a spustenie
Basic26 loops.tbas --simČo uvidíš
1 2 4 8 16 32 64 128 256 512
The divisor is 12
REPEAT ranAko to funguje
- Riadky 30 až 60: ten istý výpočet ako
goto.abasv kapitole 9, ale bez čísel riadkov, na ktoré sa skáče. Slučku je vidieť: začínaREPEAT, končíUNTILa podmienka konca stojí hneď pri ňom. - Riadky 100 až 160: najväčší spoločný deliteľ starým Euklidovým postupom – od väčšieho čísla odčítaj menšie, kým nie sú rovnaké.
WHILEsa hodí, lebo keby boli čísla rovnaké hneď, netreba robiť nič. - Riadok 200:
K<5neplatí už na začiatku, telo sa nevykoná. - Riadok 210:
REPEATtelo najprv vykoná a až potom skúša. Obe slučky sa dajú napísať na jeden riadok.
Ktorú použiť
- Treba telo vykonať aspoň raz (spýtaj sa, potom skontroluj odpoveď)?
REPEAT. - Môže sa stať, že netreba robiť nič?
WHILE. - Vieš počet?
FOR.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
chýba WEND | error B26024: WHILE without WEND |
chýba UNTIL | error B26024: REPEAT without UNTIL |
UNTIL alebo WEND bez začiatku | error B26023: there is nothing for this to close |
| podmienka sa v tele nikdy nezmení | nekonečná slučka |
podmienka UNTIL napísaná ako pre WHILE | UNTIL N<1000 skončí hneď po prvom prechode – UNTIL hovorí, kedy prestať |
slučky sa krížia (WHILE … REPEAT … WEND … UNTIL) | error B26023: WEND without WHILE – vnútorná musí skončiť skôr |
Vyskúšaj si
- Prepíš hru
guess.abasso slučkouREPEAT … UNTIL G=SECRET. - Spýtaj sa na heslo; pýtaj sa znova, kým nie je správne.
- Zisti, koľkokrát treba zdvojnásobiť číslo 1, aby prekročilo milión. (
WHILEa počítadlo.)
Zhrnutie
REPEAT … UNTIL podmienkaopakuje, kým podmienka nezačne platiť; telo beží aspoň raz.WHILE podmienka … WENDopakuje, kým podmienka platí; telo nemusí bežať vôbec.- Slučky sa vnárajú do seba aj do
IF … ENDIF.
Späť: 27. Podmienka na viac riadkov · Ďalej: 29. Slučka bez konca