Trpaslík a cykly

Předchozí: o proměnných typu pole.

Pokud jste vstoupili přímo na tuto stránku, vysvětlení analogie s trpaslíkem najdete zde.

Co to znamená

Cyklus je, když se něco opakuje; když chceme, aby trpaslík dělal něco stejného nebo velmi podobného víckrát za sebou, použijeme cyklus.

Když víme, kolikrát se má postup opakovat

Úplně jednoduchý příklad: chceme 4x napsat slovo "ahoj". Můžeme to trpaslíčkovi říct čtyřikrát:

Trpaslíčku, napiš "ahoj."
Trpaslíčku, napiš "ahoj."
Trpaslíčku, napiš "ahoj."
Trpaslíčku, napiš "ahoj."

Takhle to ještě jde, ale když to budeme chtít napsat třeba stokrát, začne to být strašne neefektivní. Takže to spíš zkusíme takhle:

Trpaslíčku,
čtyřikrát udělej tohle:
*****
napiš "ahoj"
*****

Dala jsem to trpaslíčkovi radši mezi hvězdičky, aby věděl, co všechno má opakovat. Tady je to jen jeden povel, ale mohlo by jich být víc.

Překlad do PHP

Zápis cyklu v PHP až tak úplně neodpovídá češtině, takže se na to podíváme trošku podrobněji. Protože jsme si už řekli, že trpaslík si sám nic nezapamatuje, bude si ty počty opakování muset nějak evidovat a kontrolovat, kolikrát už to zopakoval a kolikrát to má udělat celkem. Takže si udělá počítadlo a tím se bude při opakování řídit.

Český ekvivalent zápisu v PHP by vypadal asi takhle:

trpaslíčku,
(1) předem si vynuluj si počitadlo;
(2) před každým opakováním si zkontroluj, kolik už máš posunutých kuliček, a pokud už budeš mít posunuté čtyři, tak už to znova neopakuj;
(3) za každé opakování následujících povelů si na počitadle posuň jednu kuličku.

(Možná se vám to zdá zbytečně podrobný popis, ale podmínky pro opakování mohou být mnohem složitější, a pak je takový postup nezbytný.)

Počítadlo bude zase jen něco jako šuplík, dejme tomu proměnná $i. Přeložíme si jednotlivé části výše uvedených povelů:


(1) $i=0; // vynuluj si počítadlo
(2) $i<4; // budeš opakovat, dokud budeš mít posunuto míň kuliček, než 4
(3) $i++; // po každém opakování přidej na počitadlu jedna

A teď to použijeme správně sestavené v cyklu pro opakování:

for ($i=0; $i<4; $i++) {
   echo "ahoj";
}

Pro každou hodnotu $i, kterou začneš počítat od nuly, a která je menší než čtyři, opakuj povel "napiš ahoj"; za každé opakování zvyš hodnotu $i o jedničku.

Hodnotu, která je při tom kterém opakování uložená v proměnné $i, tj. která je právě na počitadle, můžeme také v cyklu použít:

for ($i=1; $i<5; $i++) {
   echo $i.". ahoj<br />";
}

Pro každou hodnotu $i, kterou začneš počítat od jedničky, a která je menší než pět, opakuj povel "napiš počet kuliček a slovo ahoj"; za každé opakování zvyš hodnotu $i o jedničku.

Tady je výsledek a tady zase PHP kód.

V tomhle případě jsem malinko změnila podmínky pro opakování. Cyklus také proběhne čtyřikrát, ale protože trpaslík vždycky posunuje kuličky na počitadle až PO provedení sady povelů, je při prvním opakování na počítadle (tj. také v proměnné $i) hodnota 0 a při posledním hodnota 3.

S tím musíme počítat; a pokud chceme během cyklu použít hodnotu z počítadla pro očíslování probíhajícího opakování, můžeme (jako v tomto případě) nastavit opakování od 1 do 5, resp. dokud na počítadle není 5.

Když si to představíte v praxi; je zadáno $i=1;$i<5;$i++:

Stejně tak by se místo podmínky $i<5 mohlo použít třeba $i<=4; opakovalo by se, pokud by na počitadle byly méně než čtyři nebo rovné čtyři kuličky. Začínali bychom s jednou, po prvním cyklu by se posunula druhá, po druhém třetí, po třetím čtvrtá (takže podmínka pro opakování by byla stále ještě splněná), opakovalo by se počtvrté, přibyla by pátá kulička - a to už by podmínku nesplnilo, takže cyklus by rovněž proběhl 4x.

Pozor na nežádoucí změnu na "počitadle"

Když použijeme pro čtvero opakování cyklus od nuly do tří, a přesto chceme použít hodnotu na počitadle pro zobrazení čísla konkrétního opakování, někoho by možná napadlo, že přece jen stačilo vždycky k hodnotě $i přičíst jedničku; ale POZOR na to, abychom nenutili trpaslíka posunovat kuličky na počítadle i v případě, že je to nežádoucí!

Tohle není dobře:

for ($i=0; $i<4; $i++) {
   $i = $i+1;
   echo $i.". ahoj<br />";
}

Podívejme se, co se bude dít:

cyklus $i před vstupem do cyklu $i+1 (příkaz v cyklu) vypíše se $i po navýšení po cyklu
první 0 (dle zadání) 1 1. ahoj 2
druhý 2 3 3. ahoj !!! 4
třetí 4 neproběhne, neplatí podmínka !!!

Pokud ale přesto chceme použít cyklus zadaný takhle (počáteční hodnota 0, podmínka $i<4), není to neřešitelné:

Abychom nezměnili hodnotu $i, tj. počet kuliček na počítadle:

for ($i=0; $i<4; $i++) {
   $pocet_opakovani = $i+1;
   echo $pocet_opakovani.". ahoj<br />";
}

Pokud opravdu chceme to číslo jen vypsat, ani nemusíme žádnou další proměnnou používat:

for ($i=0; $i<4; $i++) {
   echo ($i+1).". nazdar<br />";
}

Na obě tahle řešení se zase můžete podívat, včetně kódu.

Zadání cyklu

Ukázali jsme si, že můžeme měnit počáteční hodnotu, podmínku která musí být splněna - a i poslední parametr, tj. JAK má trpaslík posunovat kuličky, můžeme měnit:

for ($i=70;$i>0;$i-7) {
   $nasobek = $i/7;
   echo $i." je ".$nasobek." krát 7<br />";
}

Víte, co to bude dělat? Podívejte se na to, a také na skutečný kód toho souboru. Před prvním cyklem je na počitadle 70 kuliček, po každém zopakování se jich 7 odebere, a cyklus probíhá vždy, když je na počitadle víc než žádná kulička.


Firefox: Znovuzrozený prohlížeč
píše -dis- bb(zavináč)choltice.eu