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.