Ciele
- Osvojiť si správanie sa robota Karla pomocou základných príkazov.
- Naučiť sa riadiť robota Karla pomocou jednoduchých programov.
- Naučiť sa vytvárať nové funkcie v jazyku C.
- Naučiť sa preložiť a spustiť vytvorený program v prostredí operačného systému Linux.
Úvod
Na tomto cvičení spoznáte svet robota Karla a naučíte sa ho ovládať príkazmi, ktorým Karel rozumie od svojho výrobcu. Pomocou týchto príkazov budete vytvárať jednoduché programy a pomáhať Karlovi riešiť jednoduché úlohy. Okrem toho sa naučíte rozširovať slovník príkazov robota Karla o nové príkazy (vlastné funkcie), aby ste mohli písať svoje programy efektívnejšie.
Postup
Krok č. 1
V prvom kroku sa zoznámite s robotom Karlom a svetom, v ktorom sa nachádza. Vytvoríte pre Karla jednoduchý program, pomocou ktorého si osvojíte jeho základné funkcie. Následne sa naučíte, ako výsledný program preložiť a spustiť.
Úloha 1.1:
Prihláste sa na server omega.tuke.sk so svojimi
prihlasovacími údajmi.
Úloha 1.2:
Vo svojom domovskom priečinku si vytvorte priečinok s názvom
Karel, do ktorého budete ukladať svoje kódy
programov pre robota Karla.
Úloha 1.3:
Vytvorte súbor stairs.kw,
do ktorého Karla umiestníte, a v ktorom bude problém riešiť.
Úloha 1.4:
Vytvorte pre Karla program, pomocou ktorého mu pomôžete vyšplhať sa po schodoch nahor, až na najvyšší stupienok. Cestou pomôžte Karlovi pozbierať všetky značky, ktoré na schodoch nájde. Po vyšplhaní sa na najvyšší schod Karel všetky značky položí. Pre riešenie tejto úlohy použite vami vytvorený svet stairs.kw.
Počiatočná situácia:
0 CORNER FACING BEEP-BAG BEEP-CORNER (1, 1) EAST 0 0 ST.+-----------------------------------+ 9 | . . . . . . . . . | | | 8 | . . . . . . . . . | | | 7 | . . . . . . . . . | | | 6 | . . . . . . . . . | | | 5 | . . . . . . . . . | | +---+ | 4 | . . . . 1 | . | . . . | | +---+ | | 3 | . . . 1 | . . | . . . | | +---+ | | 2 | . . 1 | . . . | . . . | | +---+ | | 1 | > . | . . . . | . . . | +-----------------------------------+ 1 2 3 4 5 6 7 8 9 AVE.
Koncová situácia:
31 CORNER FACING BEEP-BAG BEEP-CORNER (6, 5) EAST 0 3 ST.+-----------------------------------+ 9 | . . . . . . . . . | | | 8 | . . . . . . . . . | | | 7 | . . . . . . . . . | | | 6 | . . . . . . . . . | | | 5 | . . . . . > . . . | | +---+ | 4 | . . . . . | . | . . . | | +---+ | | 3 | . . . . | . . | . . . | | +---+ | | 2 | . . . | . . . | . . . | | +---+ | | 1 | . . | . . . . | . . . | +-----------------------------------+ 1 2 3 4 5 6 7 8 9 AVE.
- movek() - Presunie Karla o jednu pozíciu vpred vzhľadom na smer, ktorým je Karel otočený. Pokiaľ sa Karel pokúsi pohnúť smerom, ktorým nemôže (v ceste stojí prekážka alebo sa nachádza na okraji sveta), program sa zastaví.
- pickBeeper() - Pokiaľ Karel stojí na pozícii, na ktorej sa nachádza značka, Karel ho zodvihne a vloží do svojho batohu.
- putBeeper() - Pokiaľ má Karel vo svojom batohu značku, položí ju na pozíciu, na ktorej sa aktuálne nachádza.
- turnLeft() - Po zadaní tohto príkazu sa Karel otočí na mieste o 90 stupňov vľavo.
-
turnOn() - Príkaz, ktorý Karla zapne.
Príkaz má jeden povinný parameter, ktorým je umiestnenie
sveta, v ktorom Karel bude riešiť svoju úlohu. Príklad
zapnutia Karla a jeho umiestnenia do sveta nachádzajúceho sa
v súbore stairs.kw môže teda vyzerať
nasledovne:
turnOn( "stairs.kw" );
- turnOff() - Po vykonaní všetkých úloh tento príkaz zabezpečí korektné ukončenie Karlovej úlohy.
Poznámka:
V programovacom jazyku C záleží na veľkosti písmen použitých v názvoch funkcií.
Poznámka:
Korektné ukončenie Karla zabezpečuje funkcia turnOff().
Ak sa Karel neukončí korektne, zadajte príkaz reset.
Úloha 1.5:
Preložte vytvorený program pomocou prekladača compile.
V prípade, že prekladač objaví chyby, opravte ich.
Program preložíte nasledovne:
$ compile stairs.cpričom súbor stairs.c predstavuje vami vytvorený program pre Karla.
Poznámka:
Znak '$' nie je súčasťou príkazu, ale symbolizuje
len použitie príkazového riadku. Pri zadávaní (alebo kopírovaní)
uvedeného príkazu ho preto vynechajte.
Úloha 1.6:
Spustite preložený program.
Pokiaľ preklad prebehol bez chýb, v priečinku, kde ste program preložili, vznikol súbor s názvom vášho zdrojového programu, ale s príponou .run. Tento program spustíte nasledovne:
$ ./nazov.run
Úloha 1.7:
Overte, ako sa Karel správa v prípadoch, keď chce prejsť cez stenu, alebo keď sa pokúsi položiť značku a v batohu už žiadnu nemá, alebo keď sa pokúsi vziať značku z rohu, na ktorom sa žiadna značka nenachádza.
Krok č. 2
V druhom kroku rozšírite slovník príkazov robota Karla o vlastné príkazy (funkcie). Upravíte riešenie príkladu z kroku 1 a zjednodušíte ho vytvorením dvoch nových príkazov.
Úloha 2.1:
Vytvorte funkciu turnRight(), ktorá zabezpečí otočenie robota Karla o 90 stupňov vpravo.
Úloha 2.2:
Vytvorte funkciu climbStair(), pomocou ktorej Karel vystúpi o jeden schod vyššie.
Úloha 2.3:
Upravte hlavnú funkciu programu main() tak, aby ste v nej využili vytvorené funkcie turnRight() a climbStair().
Úloha 2.4:
Overte správnosť upraveného riešenia jeho preložením a spustením.
Úloha 2.5:
Porovnajte počet riadkov výsledného programu pred použitím funkcií a po ich použití.
Doplňujúce úlohy
-
Robot Karel sa chce zúčastniť olympiády pre robotov (tzv. robolympiády). Jedna z disciplín, ktorej sa je možné v rámci olympiády zúčastniť, je prekážkový beh. Napíšte pre Karla program, pomocou ktorého zvládne zdolať rozcvičkovú prekážkovú trať nachádzajúcu sa v súbore sveta training.kw. Pre úspešné zvládnutie prekážkového behu vytvorte funkciu jumpOver(), pomocou ktorej Karel preskočí práve jednu prekážku. Na jej vytvorenie využite ľubovoľné už vytvorené funkcie z riešení predchádzajúcich úloh. Všetky prekážky sú rovnako vysoké a Karel potrebuje trať prebehnúť z počiatočnej pozície [1,1] do koncovej pozície [5,1].
Počiatočná situácia:
0 CORNER FACING BEEP-BAG BEEP-CORNER (1, 1) EAST 0 0 ST.+-------------------+ 2 | . . . . . | | | | | | | 1 | > | . | . | . | . | +-------------------+ 1 2 3 4 5 AVE.
Koncová situácia:44 CORNER FACING BEEP-BAG BEEP-CORNER (5, 1) EAST 0 0 ST.+-------------------+ 2 | . . . . . | | | | | | | 1 | . | . | . | . | > | +-------------------+ 1 2 3 4 5 AVE.
Poznámka:
Obsah súboru sveta nájdete v prílohe v zozname svetov. -
Cesta vedúca do areálu Technickej univerzity je za tie roky značne poškodená a vyznačuje sa väčším (občas aj menším) počtom dier v nej. Naprogramujte preto robota Karla tak, aby každú dieru, ktorú v ceste nájde, vyplnil značkou. Cesta, ktorú má Karel vyplniť, sa nachádza v súbore road.kw. Karel sa na začiatku nachádza na počiatočnej pozícii [1,2] a po zaplnení všetkých dier sa bude nachádzať na pozícii [5,2].
Počiatočná situácia:
0 CORNER FACING BEEP-BAG BEEP-CORNER (1, 2) EAST 2 0 ST.+-------------------+ 2 | > . . . . | |---+ +---+ +---| 1 | . | . | . | . | . | +-------------------+ 1 2 3 4 5 AVE.
Koncová situácia:26 CORNER FACING BEEP-BAG BEEP-CORNER (5, 2) EAST 0 0 ST.+-------------------+ 2 | . . . . > | |---+ +---+ +---| 1 | . | 1 | . | 1 | . | +-------------------+ 1 2 3 4 5 AVE.
Poznámka:
Obsah súboru sveta nájdete v prílohe v zozname svetov.
Ďalšie zdroje
- Robot Karel - stránka na wikipédii venovaná robotovi Karlovi
- Konfiguračný súbor pre editor Vim - .vimrc
- Rudolf Pecinovský: Základy algoritmizace - kapitola 6.1 a 11 (celá kapitola)
- Pavel Herout: Učebnice jazyka C (1. díl) - kapitoly 9.2 (úvod), 9.2.1, 9.2.2, 9.2.4, 9.2.5, kapitoly 5.1 a 5.4
Poznámka: