Cykly podruhé

Teď, když už víš, co je to proměnná, si můžeme ukázat druhý typ cyklu, a to cyklus pocitej. Ten ti umožní takové věci, jako například kreslit při každém průchodu tělem cyklu čáru jiné velikosti.

Příkaz pocitej má podobnou funkci jako příkaz opakuj, také provádí své tělo několikrát za sebou. Příkazu pocitej však předáváme více parametrů. Jedním z nich je jméno proměnné (budeme jí říkat řídící proměnná). Příkaz pocitej při každém vykonání těla hodnotu této proměnné změní. Musíme mu říct tři věci: Za prvé, jakou hodnotu má mít proměnná, když se tělo vykonává porprvé. Za druhé, o kolik se má hodnota proměnné zvýšit/snížit po vykonání těla. Za třetí, jaké nejvyšší hodnoty může proměnná dosáhnout (kdyby měla tuto hodnotu přesáhnout, cyklus skončí). Podívejme se na jednoduchý příklad.

at $a je cele;
pocitej $a od 0 do 10 po 2:
    hodnota $a;
konec;

Vytvoř proceduru s výše uvedeným kódem a spusť ji. Zobrazí se ti šest oken a v nich budou postupně vypsány hodnoty 0, 2, 4, 6, 8 a 10. Procedura funguje takto: Nejprve se vytvoří proměnná $a. Příkaz pocitej do ní na začátku přiřadí hodnotu 0, a vykoná tělo cyklu poprvé. Proto se uživateli zobrazí okénko s číslem 0. Jakmile je tělo cyklu vykonáno, hodnota proměnné $a se zvýší o dva a tělo cyklu se vykoná podruhé. Proto se uživateli zobrazí okénko s dvojkou. Celé se to opakuje do doby, než hodnota proměnné $a dosáhne 10. V tu chvíli se zobrazí okno s desítkou, ale hodnota proměnné se již dále nezvyšuje a cyklus končí.

Syntax cyklu byla záměrně zvolena tak, aby připomínala běžnou českou větu. Za slovem od následuje počáteční hodnota proměnné, říkáme tím tedy, od kolika chceme počítat. Za slovem do následuje maximální hodnota proměnné, tedy do kolika chceme počítat. Nakonec za slovem po následuje, o kolik se má zvýšit proměnná, neboli po kolika chceme počítat, po jak velké hodnotě.

Část po může scházet. V tom případě se v každém průchodu cyklem zvýší hodnota proměnné o jedna. Zápisy pocitej $a od 1 do 5 po 1: a pocitej $a od 1 do 5: mají tedy naprosto shodný efekt.

Nic nám samozřejmě nebrání počítat pozpátku. V tom případě stačí za slovo po napsat záporné číslo

at $a je cele;
pocitej $a od 10 do 1 po -1:
    hodnota $a;
konec;

Na závěr si ukážeme, k čemu se dá takový cyklus použít. První úlohou je nakreslení bludište. Budeme postupovat takto: nakreslíme úsečku o určité délce, pak k ní přikreslíme kolmici o trochu větší, ke kolmici přikreslíme opět kolmici, zase o něco větší, a tak dále, přičemž kolmice kreslíme tak, že se želvička otáčí o devadesát stupňů stále stejným směrem (v našem případě po směru hodinových ručiček).

Procedura kreslící bludiště je jednoduchá -- použijeme cyklus pocitej, neboť potřebujeme v každém kroku zvýšit délku úsečky. Vytvoříme si tedy proměnnou $delka typu celé číslo, vytvoříme cyklus pocitej, počáteční délku úsečky zvolíme kupříkladu 5, v každém kroku ji necháme zvětšit třeba o 3 a cyklus skončí, jakmile délka dosáhne 200. Tělo cyklu vykreslí úsečku o délce $delka a otočí želvičku o pravý úhel doprava. Zde je kód procedury rozepsaný:

at $delka je cele;
pocitej $delka od 5 do 200 po 3:
    vpred o $delka;
    otoc o 90;
konec;

Druhá ukázka použití cyklu pocitej je výpočet faktoriálu. Faktoriál čísla n je definován vzorcem
n·(n - 1)·(n - 2)·...·2·1.
Tedy například faktoriál čísla 5 je roven 5·4·3·2·1 = 120.

Procedura pro výpočet faktoriálu pracuje na velmi jednoduchém principu. Vytvoří si celočíselnou proměnnou $vysledek, které na začátku přiřadí hodnotu 1. Pak probíhá cyklus pocitej s řídící proměnnou i od n do 1 po -1 a v každém průchodu cyklem se $vysledek vynásobí aktuální hodnotou řídící proměnné. Nakonec se hodnota proměnné $vysledek zobrazí uživateli.

at cele $n = cticele ("Zadej cislo, z nejz chces pocitat faktorial.");
at cele $vysledek = 1; {počáteční hodnota}

at $i je cele;
pocitej $i od $n do 1 po -1:
    at $vysledek = $vysledek * $i; {násobí se postupně n, n-1, ..., 1}
konec;
hodnota $vysledek;

Zde je na místě uvést ještě dvě poznámky. Za prvé, symbol pro násobení je hvězdička (*). O aritmetických výrazech bude ještě řeč. Za druhé, je třeba správně chápat zápis at $vysledek = $vysledek * $i;, který znamená "vyhodnoť výraz po pravé straně rovnítka a výsledek ulož do proměnné $vysledek". Nelze jej interpretovat matematicky, vztah uvedený za klíčovým slovem at by pak byl totiž pravdivý pouze tehdy, když by $vysledek měl hodnotu nula.

Úloha: vytvoř proceduru, která se uživatele zeptá, z kolika čísel chce vypočítat aritmetický průměr, pak jej nechá tato čísla zadat a průměr vypíše.