Doposud jsme se zabývali cykly, u nichž byl přesně dán počet opakování. Rozměry nebo rozsahy pro ně bývají dobře známy. Existují ale případy cyklů, kdy nevíme, kolik opakování budeme muset projít, abychom se dobrali cíle. O těch je tento díl seriálu.
Řekněme, že děláme program pro pračku. V jedné fázi programu budeme čekat na to, až se ohřeje voda na určitou teplotu, a toto čekání budeme provádět v cyklu. Možná někoho napadne, že bychom mohli čekat daný počet vteřin (daný čas). To bohužel nejde, protože jednak nevíme, jak studená voda bude na začátku, a také nevíme, jak rychle se bude voda ohřívat, takže se nedá určit, jak dlouhou dobu to bude trvat. Jediný opravdový konec čekacího cyklu může nastat ve chvíli, kdy teplota vody dosáhne požadované nebo vyšší hodnoty.
Možná vám to připadá jako podmínka, protože ona to podmínka je. Cykly, které si dnes ukážeme, se řídí takovou podmínkou a platí pro ni stejná pravidla jako pro „normální" podmínku.
Cykly, které se řídí podmínkou, jsou dva, a to s podmínkou na začátku a s podmínkou na konci. Obě varianty mají společné, ale i odlišné vlastnosti, které je předurčují k různým oblastem použití. Oproti cyklu s daným počtem opakování nemají index, který by automaticky měnil svou hodnotu.
Fragment vývojového diagramu pro první typ vidíte na obrázku. Jak je již patrné z názvu „cyklus s podmínku na začátku", tak vyhodnocovací podmínka je před samotným tělem. Cyklus má tyto vlastnosti:
- nejprve se vyhodnocuje podmínka a až pak se provádí tělo,
- tělo se vykonává, dokud je podmínka splněna,
- tělo se nemusí vykonat ani jednou (pokud není podmínka splněna hned při prvním vstupu),
- počet opakování je omezen pouze podmínkou a může jich být 0 až nekonečno.
Druhý typ (s podmínkou na konci) má dvě varianty. V některých programovacích jazycích se tělo vykonává, dokud není podmínka splněna (např. Pascal), a v jiných, dokud splněna je (např. C). Vzhledem k tomu, že pro výuku programování je vhodný více Pascal než C, tak budeme používat první variantu.
Fragment vývojového diagramu pro tento cyklus vidíte na obrázku, a protože existují dvě varianty, tak budeme důsledně označovat větve, tj. kdy cyklus končí a kdy pokračuje (a to i pro cyklus s podmínkou na začátku). Z názvu „cyklus s podmínkou na konci" jasně plyne, že vyhodnocovací podmínka je až za tělem. Cyklus má tyto vlastnosti:
- nejprve se provede tělo a až pak se vyhodnocuje podmínka,
- tělo se vykonává, dokud není podmínka splněna,
- tělo se vykoná minimálně jednou,
- počet opakování je omezen pouze podmínkou a může jich být v rozmezí 1 až nekonečno.
Možná někoho napadne: a co v případě, že podmínka je neustále splněná (pro cykus s podmínkou na začátku) nebo nebude nikdy splněná (pro cyklus s podmínkou na konci)? Odpověď je jednoduchá – jedná se o nekonečný cyklus. Jedná se o speciální typ algoritmu, který se používá pouze ve výjimečných případech (např. program v jednočipovém procesoru pro nějaké řízení, který běží neustále). Jinak musí platit, že výsledek algoritmu musí být znám v konečném počtu kroků.
Konečnost – výsledek algortimu musí být znám v konečném počtu kroků.
Než přejdeme na praktické ukázky, tak je potřeba zmínit, že jakákoliv úloha na cykly je řešitelná jakýmkoliv z těchto cyklů. Vždy je možné úlohu řešit jak s podmínkou na začátku, tak s podmínkou na konci. Dokonce mohou tyto cykly nahradit i předchozí typ, tj. s daným počtem opakování – jeden takový příklad si ukážeme. A i další příklady budeme nejprve řešit pro oba typy cyklů.
Možná se ptáte, proč jsou dva typy, když jsou v podstatě záměnitelné. Odpověď už tu byla naznačena – každý cyklus je vhodný na jiný typ úloh. Někdy je výhodnější použít podmínku na začátku, někdy na konci a v některých případech je to jedno. Uvedené příklady by to měly demonstrovat.
Login
Jediný dnešní příklad bude všem důvěrně známý, protože přihlašování (login) do nějakého systému (e-mail, Facebook, IM a mnoho dalších) je na denním pořádku (ač se často děje již automaticky). Zadání úlohy by mohlo být následující: vytvořte algoritmus pro přihlášení uživatele do systému. Přihlašování se děje zadáním jména a hesla. Vstupem algoritmu tedy bude jméno a heslo, které zadá uživatel. Výstupem bude hlášení, že jsou nebo nejsou zadané údaje správně a že již případně došlo k úspěšnému přihlášení.
Jak jsem slíbil, úlohu budeme řešit oběma typy cyklů. Nejprve je nutné zadat přihlašovací údaje a pak je teprve možné rozhodnout, jestli jsou správně a povolit další přístup. V tomto případě má výhodu cyklus s podmínkou na konci, neboť se nejprve vykoná tělo cyklu, kde uživatel zadá jméno a heslo, a pak dojde k vyhodnocení. Výsledný algoritmus je na obrázku. Cyklus s podmínkou na konci je pro tento typ úloh ten vhodnější.
Naproti tomu cyklus s podmínkou na začátku je na tento typ úloh méně vhodný. Před prvním vyhodnocením je nutné zadat přihlašovací údaje, ale následně v těle cyklu také (pro případ, že by je uživatel nezadal správně). V algoritmu tak dochází k opakování části diagramu (programu) a výsledný vývojový diagram není již tak přehledný. Volbou nevhodného typu cyklu si zbytečně přiděláváme práci a algoritmus se stává složitějším.
Všimněte si také rozdílnosti podmínek. Cyklus s podmínkou na začátku končí, pokud není podmínka splněna, takže se musíme ptát, jestli není jméno a heslo platné. V případě, že je podmínka splněna (tedy nejsou platné), tak je potřeba, aby je uživatel zadal znovu. V případě, že není splněna (neboli údaje jsou platné), tak se uživatel úspěšně přihlásil. U druhého cyklu je to vyhodnocení podmínky obráceně, takže se ptáme tak, jak bychom očekávali.
Jedinou výhodou cyklu s podmínkou na začátku je to, že se u něj přirozeně rozlišuje první zadání a následná zadání. To umožňuje vypsat hlášení o tom, že se přihlášení nezdařilo. U cyklu s podmínkou na konci bychom tohoto dosáhli přidáním podmínky na počet pokusů, které bychom si museli počítat. V případě, že by se nejednalo o první pokus, tak by se vypsalo hlášení o chybném přihlášení.
Možná to teď vypadá jako velká výhoda, ale pokud bychom dělali algoritmus pro login nejenom pro ukázkové účely, ale pro praktické použití, tak bychom v něm počítadlo pokusů stejně měli. Při nějakém počtu neúspěšných přihlášení se další přihlášení znemožní nebo se zařízení zablokuje (např. mobil po třech špatně zadaných PINech). Komplexnější vývojový diagram pro zadávání PINu s maximálním počtem opakování (i s podmínkou na hlášení) si ukážeme příště.
To je pro tentokráte vše. V příštím díle budeme s cykly pokračovat. Ukážeme si na jednom příkladu řešení pomocí všech tří cyklů a také si ukážeme příklad, ve kterém bude výhodnější použít cyklus s podmínkou na začátku.