KAREL 98

Základy programování pro malé i větší bez potřeby znalostí matematiky

Tomáš Holubec
Ústí u Vsetína 116
755 01


Karel je robot uzavřený ve městě 10x10 polí. V jeho světě existují pouze zdi, značky a čtyři světové strany. Sám umí pouze udělat krok, otočit se vlevo a položit nebo zvednout značku. Také umí rozpoznat zda na poli, kde stojí, je nějaká značka, zda stojí před zdí a na jakou světovou stranu je natočen.
Robot Karel je však velmi učenlivý a má schopnost naučit se vykonávat i značně složité činnosti. Cílem Vaší práce bude vytvořit pro Karla návod k vykonání zadaného úkolu.

Karlovo město

Karlovo město je zobrazeno v pravém horním rohu. Je tvořeno poli 10x10, z vnějšku je ohraničeno vnějšími zdmi, které jsou znázorněny růžovou barvou. Karel je ve výchozí poloze v levém dolním rohu natočen vpravo - je doma.
Vedle města je malé okno obsahující nástroje na úpravu města. Umožňuje hýbat s Karlem, pokládat značky a vytvářet vnitřní zdi.
Další nástroje pro úpravu města jsou v horním menu pod položkou Město. Světové strany jsou ve městě rozloženy jako na mapě - sever nahoře, jih dole, východ vlevo, západ vpravo.

Přímý režim

Karel ihned provede Vámi zadaný příkaz. Klikněte myší na okno Ovládání Karla a do spodního řádku napište VLEVO VBOK a stiskněte ENTER. Karel (jeho šipka) se otočí vlevo. Stejným způsobem můžete napsat POLOZ nebo ZVEDNI a Karel na poli, kde stojí, položí nebo zvedne značku. Napíšete-li KROK, Karel se posune o jedno políčko ve směru šipky.
Obecně platí, že můžete napsat Karlovi jakýkoli příkaz, který je uveden v okně Známé příkazy. Na začátku zná Karel pouze čtyři základní výkonné příkazy. Jejich pomocí se dá vytvořit jakýkoliv program.

Režim učení Karla

Chceme-li naučit Karla rozumět novému příkazu musíme mu říci, že se jedná o nový příkaz, který si má zapamatovat.
Pokud jste chtěli Karla otočit čelem vzad, museli jste dvakrát za sebou napsat VLEVO VBOK. Karel příkaz CELEM VZAD ještě nezná, musíme mu nový příkaz vysvětlit.
Napíšeme POCHOP CELEM VZAD a stiskneme ENTER. V okně nad vstupním řádkem se objeví náš nový příkaz. Karel nyní čeká, co tento příkaz znamená. Napíšeme VLEVO VBOK. V horním okně se pod CELEM VZAD objeví VLEVO VBOK, všimněme si, že VLEVO VBOK je odskočeno od začátku řádky. Napíšeme ještě jednou VLEVO VBOK. Napíšeme KONEC. Karel nyní zná nový příkaz CELEM VZAD. Nový příkaz můžete ihned vyzkoušet.


Základy programování v Karlovi

Karel od narození zná pouze 4 přímé příkazy:
KROK Karel otočí šipku o 90° vlevo
VLEVO VBOK Karel se posune o jedno pole ve směru šipky
POLOZ Karel na pole, kde stojí,položí jednu značku (max.9)
ZVEDNI Karel zvedne jednu značku

Dále rozumí slovům: OPAKUJ, DOKUD, KDYZ, JE/NENI, ZEĎ, ZNACKA, SEVER, JIH, VYCHOD, ZAPAD, KONEC, POCHOP, CHYBA

Učíme Karla novým příkazům

Každý nový příkaz si nejprve pište do tzv. kopenogramu. Kdo se naučí myslet v kopenogramech, bude umět v budoucnu rychleji pracovat i se složitějšími programovacími systémy.


1.úkol: Naučíme Karla otočit se čelem vzad a vpravo vbok.

kopenogram POCHOP CELEM VZAD
VLEVO VBOK
VLEVO VBOK
KONEC
kopenogram POCHOP VPRAVO VBOK
VLEVO VBOK
VLEVO VBOK
VLEVO VBOK
KONEC
POCHOP VPRAVO VBOK
CELEM VZAD
VLEVO VBOK
KONEC

Tip: Příkazy můžete zkracovat.
Např. VLEVO VBOK stačí napsat jako VL., KROK stačí napsat jako K. atd.
Při přepisu kopenogramu do počítače nesmíme zapomenout na zásadu: "Každé opuštění rámečku musíme vyjádřit slovem KONEC."


2.úkol: Karel na pole, kde stojí, položí 5 značek (SLOUP), při jižní zdi postaví na 8 polích CHODNÍK (na každém poli jedna značka).

kopenogram POCHOP SLOUP
OPAKUJ 5
POLOZ
KONEC
KONEC
kopenogram POCHOP CHODNIK
OPAKUJ 8
POLOZ
KROK
KONEC
KONEC
kopenogram POCHOP STENA
OPAKUJ 9
KROK
SLOUP
KONEC
SLOUP
KONEC

Co udělá Karel příkazem STĚNA?
Proč je příkaz SLOUP použit i mimo opakovací blok?
Ověřte si své domněnky.

Cyklus OPAKUJ můžeme vložit dvěma způsoby:
1. OPAKUJ + počet opakování - ENTER
2. OPAKUJ - ENTER ; objeví se okno, ve kterém zvolíme počet opakování


3.úkol: Naučíme Karla dojít ke zdi, jejíž vzdálenost od robota není známa (KE ZDI), Karel postaví ke zdi neznámé vzdálenosti CHODNÍK 1, Karel postaví CHODNÍK 2 kolem města neznámých rozměrů.

kopenogram POCHOP KE ZDI
DOKUD NENI ZED
KROK
KONEC
KONEC
kopenogram POCHOP CHODNIK 1
DOKUD NENI ZED
KROK
POLOZ
KONEC
KONEC
kopenogram POCHOP CHODNIK 2
OPAKUJ 4
CHODNIK 1
VLEVO VBOK
KONEC
KONEC

Z kopenogramů vidíte, že dříve naučený příkaz lze v novém kopenogramu použít stejně jako některý ze čtyř příkazů, které Karel zná na začátku.

Cyklus DOKUD můžeme vložit dvěma způsoby:
1. DOKUD + celá podmínka - ENTER
2. DOKUD - ENTER ; objeví se okno, ve kterém zvolíme podmínku

Při přepisování kopenogramu můžete příkazem CHYBA vymazat poslední vložený příkaz. Pokud zrovna Karlovi nevysvětlujete nový příkaz, dojde k odstranění posledního naučeného příkazu.


4.úkol:
a) Karel provede VÝMĚNU. Je-li na poli značka, zvedne ji, jinak značku položí.
b) Karel se rozhodne mezi těmito činnostmi: když bude mít pod sebou značku, sebere ji, bude-li pole prázdné, udělá krok vpřed (ROZHODNI) - Kopenogram si doplňte sami.

kopenogram POCHOP VYMENA
KDYZ JE ZNACKA
ZVEDNI
KONEC JINAK
POLOZ
KONEC
KONEC
kopenogram POCHOP ROZHODNI
KDYZ JE ZNACKA
???
KONEC JINAK
???
KONEC
KONEC

KDYZ můžeme vložit dvěma způsoby:
1. KDYZ + celá podmínka - ENTER
2. KDYZ - ENTER ; objeví se okno, ve kterém myší zvolíme podmínku

KONEC můžeme vložit pouhým zmáčknutím klávesy ENTER.
KONEC JINAK nemusíme vkládat celé, Karel sám rozhodne, na který řádek JINAK patří. JINAK je vloženo v okamžiku, kdy při přepisování přecházíme z levé větve podmínky do pravé.


5.úkol:
a) Naučíme Karla točit PIRUETU.
b) Vybrat všechny značky na poli,kde stojí.

kopenogram POCHOP PIRUETA
VLEVO VBOK
PIRUETA
KONEC

kopenogram POCHOP VYBER 1
KDYZ JE ZNACKA
ZVEDNI
VYBER 1
KONEC JINAK
KONEC
KONEC
kopenogram POCHOP VYBER 2
DOKUD JE ZNACKA
ZVEDNI
KONEC
KONEC

Volání názvu právě učeného příkazu nazýváme rekurze, program se ocitá na začátku a opět vykoná příkaz VLEVO VBOK, znovu je rekurzí vrácen na začátek programu a Karel se opět otočí vlevo, točí se tak dlouho, dokud ho nezastavíme tlačítkem s přeškrtnutým vykřičníkem, které se objeví na ovládacím panelu vedle města.

Rekurzi lze použít také v bloku s příkazem KDYZ (VYBER 1), v tomto případě se Karel v okamžiku, kdy na políčku už nebude žádná značka, zastaví. VYBER 2 má stejnou funkci jako VYBER 1.

Při rekurzi si Karel pamatuje odkud byl na začátek programu odhozen - vytahuje si kartičky a vše si na ně zapisuje (Ve skutečnosti se tomu říká zásobník a ukládá se do něj adresa místa, odkud má program odskočit do podprogramu.
Po ukončení podprogramu pak bude program pokračovat od adresy, ze které do podprogramu odskočil.
). Kartiček má však omezený počet a jakmile mu dojdou, tak se s chybou zastaví.

Pokus: Zadejte příkaz PIRUETA, kliknutím na tlačítko se sanitkou přepněte Karla na nejvyšší možný rychlostní stupeň a čekejte co se po nějaké chvíli stane.


6.úkol: S využitím rekurze naučte Karla chodit kolem budovy 4X4 zdi (HLÍDAČ), tzn. Karel udělá 5 kroků a otočí se vlevo a tuto činnost vykonává tak dlouho dokud ho sami nezastavíme.

kopenogram
Ověřte si, co vykoná Karel příkazy TOČ1,TOČ2. Pozor, nejprve ho musíte naučit příkaz OTOČ- Karel se jednou na místě otočí o 360°.
kopenogram
kopenogram

Rekurzi v kombinaci s příkazem KDYZ využíváme ve všech složitějších úlohách Karla.


7.úkol: Naučíme Karla dojít do poloviny neznámé vzdálenosti od zdi.

Karel nejprve půjde dvojkroky ke zdi, pak se otočí a zpět půjde po krocích - tzn. kolik dvojkroků šel ke zdi, tolik kroků půjde zpět a dostane se právě do poloviny vzdálenosti.

kopenogram
? krok = opatrný krok, doplňte kopenogram:
(Zabezpečte, aby Karel udělal krok jen pokud nestojí před zdí.)
kopenogram

Proč druhý krok musí být opatrný?
Musíme totiž počítat s tím, že Karel má před sebou ke zdi lichý počet polí.
? KROK zajistí, že Karel nenarazí na zeď a program se nezastaví.

Rekurzí je Karel vždy odhozen na začátek programu. Při každém odhození si ze svého batůžku vytáhne kartičku a na ni si poznačí, odkud byl odhozen na začátek příkazu.
Když se dostane do levého bloku rozhodování a vykoná i poslední příkaz CELEM VZAD, měl by se vlastně zastavit, má ale v ruce kartičky, které mu říkají, že se má vrátit na místo, odkud byl rekurzí odhozen a dodělat příkazy, které jsou za rekurzí.
To znamená, že vykoná tolikrát příkazy, které zde následují, kolik v ruce drží kartiček. Udělá přesně tolik kroků zpátky od zdi, kolik udělal dvojkroků cestou ke zdi.

Při řešení některých složitějších úloh je zapotřebí užít několik takových rekurzí.


V hlavním menu programu naleznete sbírku úloh. Jedná se o úlohy během let sesbírané na soutěžích v programování. K některým z nich jsem přidal i vzorové řešení.

Tomáš Holubec
Ústí u Vsetína 116
755 01

tomas@holubec.cz