Lekce 1.13
Cykly (FOR, REPEAT, UNTIL)


p°edchozφ lekce (1.12) obsah kurzu nßsledujφcφ lekce (1.14)

A₧ doposud provßd∞ly naÜe programy pouze zadan² sled povel∙ bez mo₧nosti opakovßnφ po₧adovan²ch akcφ. Pokud by jsme pot°ebovali nap°φklad vykonat n∞jakou Φßst programu stokrßt, museli by jsme uvedenou Φßst programu zapsat stokrßt. To by vÜak bylo, jak sami jist∞ uznßte znaΦn∞ nevhodnΘ a nepohodlnΘ. V tΘto lekci si proto probereme, jak je mo₧nΘ na zßklad∞ vyhodnocenφ podmφnek opakovat zadanou Φßst programu.

Pokud budete pot°ebovat v programu provΘst n∞jakou akci s p°edem znßm²m poΦtem opakovßnφ, bude nejvhodn∞jÜφ pou₧φt cyklus typu For..Next. Jednß se o cyklus, ve kterΘm je definovßn tzv. ΦφtaΦ, kter² udßvß kolikrßt se mß cyklus jeÜt∞ provΘst. ╚φtaΦ je automaticky systΘmem zvyÜovßn o jedniΦku. Sm∞r naΦφtßnφ m∙₧e b²t p°itom nahoru, nebo dol∙:


Sub Main()
    ConsoleClear      'vyma₧e obsah textovΘho v²stupu
    ConsoleShow       'zobrazφ textovΘ v²stupnφ okno

    'cyklus sm∞rem nahoru
    For x = 1 to 10
        Writeln(x) 
    Next

    'cyklus sm∞rem dol∙
    For x = 10 to 1 Step -1
        Writeln(x) 
    Next
End Sub
V uvedenΘm p°φklad∞ jsou v programu dva cykly For. Prvnφ z nich zvyÜuje stav ΦφtaΦe x sm∞rem nahoru, druh² sm∞rem dol∙. VÜimn∞te si, ₧e ΦφtaΦ musφ b²t sice deklarovßn jako prom∞nnß, ale p°i°azenφ poΦßteΦnφ hodnoty se provßdφ a₧ v definici cyklu. KoneΦnß hodnota ΦφtaΦe se pro sm∞r naΦφtßnφ nahoru zadßvß za klφΦov²m slovem 'to'. Pro sm∞r naΦφtßnφ dol∙ musφ b²t uvedena poΦßteΦnφ hodnota v∞tÜi ne₧ koneΦnß hodnota. Navφc se musφ uvΘst pomocφ Step krok cyklu se zßpornou hodnotou. Step udßvß krok v jednom cyklu a m∙₧e b²t uvedena libovolnß Φφselnß nenulovß hodnota. Pokud se uvede nap°φklad hodnota Step ve velikosti 10, bude se °φdφcφ prom∞nnß cyklu zv∞tÜovat o 10.

Pokud budete chtφt ve svΘm programu pou₧φt cyklus, jeho₧ ukonΦenφ bude zßviset na spln∞nφ zadanΘ podmφnky, mßte mo₧nost pou₧φt cyklus typu Do..Loop. Podmφnku pro opakovßnφ cyklu m∙₧ete p°itom uvΘst bu∩ na zaΦßtku cyklu, nebo na jeho konci. Podle toho budou takΘ vykonßvßny p°φkazy obsa₧enΘ v cyklu. Pokud uvedete podmφnky cyklu na jeho konci, provede se cyklus v₧dy minimßln∞ jednou, co₧ m∙₧e b²t v n∞kter²ch programech v²hodnΘ.


Sub Main()
    x = 0
    Do                   'zaΦßtek cyklu
       Writeln(x)        'v²pis hodnoty ΦφtaΦe
       x = x+1           'zv²Üenφ hodnoty ΦφtaΦe
    Loop While x < 10    'dokud je v²raz pravdiv²

    x = 0
    Do                   'zaΦßtek cyklu
       Writeln(x)        'v²pis hodnoty ΦφtaΦe
       x = x+1           'zv²Üenφ hodnoty ΦφtaΦe
    Loop Until x = 10    'dokud nenφ v²raz pravdiv²
End Sub
VÜimn∞te si, ₧e v t∞le cyklu musφ b²t v₧dy uveden p°φkaz, kter² mß za nßsledek mo₧nou zm∞nu vyhodnocenφ cyklu. Jinak by byl cyklus stßle opakovßn a nedoÜlo by k jeho ukonΦenφ.

P°φkazy jsou vykonßvßny opakovan∞, dokud nenφ spln∞na (nespln∞na) zadanß podmφnka uvedenß na konci cyklu. Pokud je v cyklu zadßno While, provßdφ se p°φkazy opakovan∞ tak dlouho, dokud je podmφnka cyklu pravdivß. P°i zadßnφ Until v podmφnce se budou p°φkazy vykonßvat opakovan∞ tak dlouho, dokud nenφ podmφnka cyklu spln∞na. Obdobn²m zp∙sobem lze zadat cyklus, kde je platnost podmφnky vyhodnocovßna na zaΦßtku cyklu. V takovΘm p°φpad∞ vÜak nemusφ b²t podle zadanΘ podmφnky a poΦßteΦnφch hodnot cyklus proveden ani jednou.


Sub Main()
    x = 0
    Do While x < 10    'dokud je v²raz pravdiv²
       Writeln(x)      'v²pis hodnoty ΦφtaΦe
       x = x+1         'zv²Üenφ hodnoty ΦφtaΦe
    Loop 

    x = 0
    Do Until x = 10    'dokud nenφ v²raz pravdiv²
       Writeln(x)      'v²pis hodnoty ΦφtaΦe
       x = x+1         'zv²Üenφ hodnoty ΦφtaΦe
    Loop 
End Sub
P°φkazy uvedenΘ mezi klφΦov²mi slovy Repeat a Until se provßdφ tak dlouho, dokud nenφ v²raz definovan² na konci podmφnky pravdiv². Nesmφte p°itom zapomenout na zv²Üenφ hodnoty ΦφtaΦe, p°φpadn∞ provΘst jinou akci, kterß m∙₧e mφt za nßsledek ukonΦenφ cyklu.

Jako dalÜφ cyklus m∙₧ete pou₧φt cyklus While, kter² vyhodnocuje podmφnku opakovßnφ cyklu v₧dy na jeho poΦßtku. To umo₧≥uje, ₧e pokud nenφ podmφnka spln∞na, neprovedou se p°φkazy uvedenΘ v bloku nßsledujφcφm za definicφ cyklu ani jednou. To m∙₧e b²t v n∞kter²ch p°φpadech v²hodnΘ a je proto nutnΘ se p°i vlastnφm programovßnφ rozhodnout, kter² druh cyklu mß b²t pou₧it.


X = 1
While x < 5        'dokud je v²raz pravdiv²
   Writeln(x * 1.22);
   x = x + 1       'zv²Üenφ hodnoty ΦφtaΦe
Wend
Pro zßpis podmφnek p°i pou₧φvßnφ cykl∙ platφ vÜe co bylo uvedeno u popisu v∞tvenφ programu p°φkazem If. Stejn∞ tak je velmi v²hodnΘ a hlavn∞ p°ehlednΘ v textu programu odsadit °ßdky programu uvnit° cykl∙ o t°i prßzdnΘ znaky doprava. Viz v²Üe uvedenΘ p°φklady. Programy tφm zφskajφ na p°ehlednosti. SouΦasn∞ doporuΦujeme uvßd∞t v programu poznßmky ve form∞ komentß°e. Jak jste si ji₧ mohli vÜimnout, poznßmky se uvßd∞jφ ve slo₧en²ch zßvorkßch. Pokud byste na zaΦßtku °ßdku uvedli dv∞ lomφtka, byl by text a₧ do konce °ßdku v programu ignorovßn.

P°i programovßnφ cykl∙ si musφte dßt pozor na to, aby byly v t∞le cyklu p°φkazy umo₧≥ujφcφ jeho ukonΦenφ. Pokud byste m∞li nap°φklad cyklus s definovanou podmφnkou, kterß nebude nikdy spln∞na, b∞₧el by program stßle v tomto cyklu a museli byste jej ukonΦit restartem.

V tΘto lekci jsme se zab²vali n∞kolika p°φkazy, kterΘ vÜak provßd∞ly podobnou Φinnost. P°φkazy cyklu jsou v programech velmi Φasto pou₧φvanΘ. Je vÜak nutnΘ si podle po₧adovan²ch akcφ vybrat nevhodn∞jÜφ p°φkaz pro cyklus.


p°edchozφ lekce (1.12) obsah kurzu nßsledujφcφ lekce (1.14)

OZOGAN, 1 Mßje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz