Ciele

  1. Osvojiť si správanie sa robota Karla pomocou základných príkazov.
  2. Naučiť sa riadiť robota Karla pomocou jednoduchých programov.
  3. Naučiť sa vytvárať nové funkcie v jazyku C.
  4. 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.
Poznámka:
Program napíšte v niektorom z dostupných textových editorov (napr. Vim, mcedit, nano alebo joe). Názov súboru, do ktorého napíšete váš program, odvoďte od názvu súboru s mapou zmenou prípony na .c (napr. ak sa mapa nachádza v súbore stairs.kw, tak program uložte do súboru s názvom stairs.c). Do programu vložte tieto riadky, ktoré budú predstavovať jeho kostru:
#include <karel.h>

    int main(){

    return 0;
}
                        
Váš program sa bude nachádzať medzi riadkami 3 a 5.
Pri riešení tejto úlohy využite tieto Karlove príkazy:
  • 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.c
                    
prič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

  1. 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.
  2. 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.