Ciele

  1. Precvičiť si vetvenie toku programu na základe podmienok v programovacom jazyku C.
  2. Naučiť sa používať logické cykly v programovacom jazyku C.
  3. Osvojiť si príkazy break a continue pre riadenie behu cyklov.

Úvod

Na tomto cvičení si opäť precvičíte rozhodovanie v Karlových programoch na základe senzorov, ktoré obsahuje. Úlohou tohto cvičenia je naučiť sa vytvárať jednoduché cykly a s ich pomocou efektívne vyriešiť problém.

Postup

Krok č. 1

Úloha 1.1:

Vytvorte funkciu turnRight(), po vykonaní ktorej bude robot Karel otočený vpravo vzhľadom na jeho východziu pozíciu. Pri tvorbe funkcie použite niektorý z cyklov.

Úloha 1.2:

Vytvorte funkciu turnToNorth(), po vykonaní ktorej bude robot Karel otočený na sever.

Úloha 1.3:

Vytvorte funkciu pickAllBeepers(), po vykonaní ktorej robot Karel vezme všetky značky z aktuálnej pozície a vloží si ich do batohu.

Úloha 1.4:

Vytvorte funkciu plantBeepers(). Po jej zavolaní začne Karel "sadiť" značky postupne pred seba krok za krokom, pričom jednu značku zasadí v každom kroku. Ak cestou vpred Karel nájde na pozícii inú značku alebo sa dopredu už nebude môcť pohnúť, funkcia sa ukončí.

Úloha 1.5:

Vytvorte funkciu findExitOnLeft(). Po jej zavolaní sa Karel rozbehne vpred a zastaví sa vtedy, keď sa už nebude môcť pohnúť vpred. V prípade, ak sa po Karlovej ľavej ruke nachádza voľná pozícia, otočí sa vľavo a zastaví sa.

Krok č. 2

Úloha 2.1:

Vytvorte program marker.c, pomocou ktorého Karel označkuje všetky štyri rohy sveta. Karel sa na začiatku nachádza na pozícii [1,1] a je nasmerovaný na východ. Po označení všetkých rohov sa vráti na svoju východziu pozíciu. Vaše riešenie otestujte svete empty.kw, ktorý nájdete v prílohe v zozname svetov.
Počiatočná situácia:
 0
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       4         0
ST.+-----------------------+
 6 | .   .   .   .   .   . |
   |                       |
 5 | .   .   .   .   .   . |
   |                       |
 4 | .   .   .   .   .   . |
   |                       |
 3 | .   .   .   .   .   . |
   |                       |
 2 | .   .   .   .   .   . |
   |                       |
 1 | >   .   .   .   .   . |
   +-----------------------+
     1   2   3   4   5   6   AVE.
Koncová situácia:
 27
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   SOUTH      0         1
ST.+-----------------------+
 6 | 1   .   .   .   .   1 |
   |                       |
 5 | .   .   .   .   .   . |
   |                       |
 4 | .   .   .   .   .   . |
   |                       |
 3 | .   .   .   .   .   . |
   |                       |
 2 | .   .   .   .   .   . |
   |                       |
 1 | v   .   .   .   .   1 |
   +-----------------------+
     1   2   3   4   5   6   AVE.

Úloha 2.2:

Preložte vytvorený program pomocou prekladača gcc. V prípade, že prekladač objaví chyby, opravte ich.
Program preložíte nasledovne:
$ gcc marker.c -o karel -lkarel -lcurses
                    
pričom:
  • súbor marker.c predstavuje vami vytvorený program pre Karla,
  • prepínač -o zabezpečí, aby sa výsledný súbor, ktorý bude reprezentovať spustiteľný program, volal karel,
  • voľba -lkarel zabezpečí, aby bola pri preklade použitá knižnica pre prácu s robotom Karlom, a
  • voľba -lcurses zabezpečí, aby bola pri preklade použitá aj knižnica ncurses pre vykresľovanie sveta, v ktorom sa Karel bude nachádzať.
Poznámka:
Pokiaľ by ste pri preklade nepoužili prepínač -o, výsledný spustiteľný program by sa nachádzal v súbore a.out.
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.
Poznámka:
Ak chcete programovať na vlastnom počítači s nainštalovaným operačným systémom Linux, potrebujete mať nainštalovaný balíček libncurses5-dev.

Úloha 2.3:

Spustite preložený program.
Pokiaľ ste spustili prekladač s parametrom -o karel, program spustíte nasledovne:
$ ./karel

Úloha 2.4:

V programe marker.c vytvorte funkciu runMile(), po zavolaní ktorej sa Karel prejde o 5 krokov vpred a upravte hlavnú funkciu programu main() tak, aby ste v nej využili volanie vytvorenej funkcie runMile().

Úloha 2.5:

Upravte program tak, aby Karel počas značkovania rohov sveta neznačkoval aj tie rohy, ktoré už sú označené.
Svoje riešenie tejto úlohy môžete otestovať na svete empty1.kw.

Krok č. 3

Úloha 3.1:

Otvorte si riešenie olympics z minulého cvičenia.

Úloha 3.2:

Upravte program tak, aby Karel zvládol prebehnúť ľubovoľne vysoké prekážky. Karel svoj beh zastaví vtedy, keď vo svojej trati natrafí na značku, pričom značka sa bude v Karlovej ceste vždy nachádzať.
Svoje riešenie tejto úlohy si môžete otestovať na nasledujúcich mapách, ktoré predstavujú predkolá veľkého finále RobOlympiády: olympics3.kw, olympics4.kw.
Počiatočná situácia:
 0
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               |                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       |               |
 4 | .   .   .   . | .   . | .   .   .   . |
   |               |       |           |   |
 3 | .   .   .   . | .   . | .   .   . | . |
   |   |           |       |       |   |   |
 2 | . | .   .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | > | . | .   . | .   . | .   . | . | 1 |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.
Koncová situácia:
 91
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (10, 1)   EAST       0         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               |                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       |               |
 4 | .   .   .   . | .   . | .   .   .   . |
   |               |       |           |   |
 3 | .   .   .   . | .   . | .   .   . | . |
   |   |           |       |       |   |   |
 2 | . | .   .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | . | . | .   . | .   . | .   . | . | > |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Úloha 3.3:

Upravte program tak, aby robot Karel vedel preskočiť aj ľubovoľne široké prekážky. Karel svoj beh zastaví vtedy, keď vo svojej trati natrafí na značku, pričom značka sa bude v Karlovej ceste vždy nachádzať.
Svoje riešenie tejto úlohy si môžete otestovať na nasledujúcich mapách, ktoré predstavujú posledné kolá veľkého finále RobOlympiády: olympics5.kw, olympics6.kw.
Počiatočná situácia:
 0
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               |                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +-------+       |
 4 | .   .   .   . | .   . | .   . | .   . |
   |               |       |       |   |   |
 3 | .   .   .   . | .   . | .   . | . | . |
   |   +---+       |       |       |   |   |
 2 | . | . | .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | > | . | .   . | .   . | .   . | 1 | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.
Koncová situácia:
 54
 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (9, 1)   EAST       0         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               |                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +-------+       |
 4 | .   .   .   . | .   . | .   . | .   . |
   |               |       |       |   |   |
 3 | .   .   .   . | .   . | .   . | . | . |
   |   +---+       |       |       |   |   |
 2 | . | . | .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | . | . | .   . | .   . | .   . | > | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Doplňujúce úlohy

  1. Upravte predchádzajúce programy tak, aby robot Karel smeroval z východu na západ.
    Poznámka:
    Pre otestovanie týchto programov je potrebné modifikovať súbory svetov.
  2. Vytvorte program pre robota Karla, pomocou ktorého Karel prejde bludiskom. Koniec bludiska je označený značkou, pričom v bludisku je vždy iba jedna značka. Riešenie tejto úlohy si môžete overiť na mapách maze1.kw, maze2.kw a maze3.kw.
    Počiatočná situácia:
     0
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (1, 1)   EAST       0         0
    ST.+-----------------------+
     6 | .   .   .   .   . | 1 |
       |----   |   |   +---+   |
     5 | .   . | . | . | .   . |
       |   +---+   |   |   +---|
     4 | . | .   . | . | . | . |
       |   |   ----+---+   |   |
     3 | . | .   .   . | .   . |
       |   +---+----   +---+   |
     2 | .   . | .   .   . | . |
       |   +---+   ----+   |   |
     1 | > | .   .   . | .   . |
       +-----------------------+
         1   2   3   4   5   6   AVE.
    Koncová situácia:
     181
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (6, 6)   NORTH      0         1
    ST.+-----------------------+
     6 | .   .   .   .   . | ^ |
       |----   |   |   +---+   |
     5 | .   . | . | . | .   . |
       |   +---+   |   |   +---|
     4 | . | .   . | . | . | . |
       |   |   ----+---+   |   |
     3 | . | .   .   . | .   . |
       |   +---+----   +---+   |
     2 | .   . | .   .   . | . |
       |   +---+   ----+   |   |
     1 | . | .   .   . | .   . |
       +-----------------------+
         1   2   3   4   5   6   AVE.
  3. Robot Karel sa vydal hľadať poklad, pričom potrebuje sledovať špirálu smerom dovnútra, až kým nenájde poklad. Keď poklad nájde (značku), dá si ho do batohu. Karel vždy začína na pozícii [1,1] a nevie, aké dlhé sú steny. Riešenie tejto úlohy si môžete overiť na mape treasurehunt.kw.
    Počiatočná situácia:
     0
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (1, 1)   EAST       0         0
    ST.+-------------------------------+
     8 | .   .   .   .   .   .   .   . |
       |   +-----------------------+   |
     7 | . | .   .   .   .   .   . | . |
       |   |   +---------------+   |   |
     6 | . | . | .   .   .   . | . | . |
       |   |   |   +-------+   |   |   |
     5 | . | . | . | 1   . | . | . | . |
       |   |   |   +----   |   |   |   |
     4 | . | . | .   .   . | . | . | . |
       |   |   +-----------+   |   |   |
     3 | . | .   .   .   .   . | . | . |
       |   +-------------------+   |   |
     2 | .   .   .   .   .   .   . | . |
       |---------------------------+   |
     1 | >   .   .   .   .   .   .   . |
       +-------------------------------+
         1   2   3   4   5   6   7   8   AVE.
    Koncová situácia:
     78
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (4, 5)   WEST       1         0
    ST.+-------------------------------+
     8 | .   .   .   .   .   .   .   . |
       |   +-----------------------+   |
     7 | . | .   .   .   .   .   . | . |
       |   |   +---------------+   |   |
     6 | . | . | .   .   .   . | . | . |
       |   |   |   +-------+   |   |   |
     5 | . | . | . | <   . | . | . | . |
       |   |   |   +----   |   |   |   |
     4 | . | . | .   .   . | . | . | . |
       |   |   +-----------+   |   |   |
     3 | . | .   .   .   .   . | . | . |
       |   +-------------------+   |   |
     2 | .   .   .   .   .   .   . | . |
       |---------------------------+   |
     1 | .   .   .   .   .   .   .   . |
       +-------------------------------+
         1   2   3   4   5   6   7   8   AVE.
    Poznámka:
    Použite iné riešenie ako v predošlej úlohe (bludisko).
  4. Karel bol najatý, aby pomohol opraviť škody spôsobené za tie roky na Košickom hrade. Karel má teda opraviť sadu kamenných pilierov (samozrejme reprezentovaných značkami), v ktorých niektoré kamene chýbajú. Po skončení opráv budú všetky chýbajúce diery v stĺpoch opäť zaplnené. Riešenie tejto úlohy si môžete overiť na mapách stonemason1.kw a stonemason2.kw.
    Počiatočná situácia:
     0
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (1, 1)   EAST      99         0
    ST.+---------------------------------------------------+
     8 | .   .   .   .   .   .   .   .   .   .   .   .   . |
       |       +---+           +---+           +---+       |
     7 | .   . | . | .   .   . | . | .   .   . | . | .   . |
       |   +---+   +---+   +---+   +---+   +---+   +---+   |
     6 | . | .   .   . | . | .   .   . | . | .   .   . | . |
       |---+           +---+           +---+           +---|
     5 | 1   .   .   .   .   .   .   .   1   .   .   .   1 |
       |                                                   |
     4 | .   .   .   .   1   .   .   .   .   .   .   .   . |
       |                                                   |
     3 | .   .   .   .   .   .   .   .   1   .   .   .   1 |
       |                                                   |
     2 | .   .   .   .   1   .   .   .   .   .   .   .   . |
       |                                                   |
     1 | >   .   .   .   1   .   .   .   .   .   .   .   1 |
       +---------------------------------------------------+
         1   2   3   4   5   6   7   8   9   10  11  12  13  AVE.
    Koncová situácia:
     71
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (13, 1)   EAST      88         1
    ST.+---------------------------------------------------+
     8 | .   .   .   .   .   .   .   .   .   .   .   .   . |
       |       +---+           +---+           +---+       |
     7 | .   . | . | .   .   . | . | .   .   . | . | .   . |
       |   +---+   +---+   +---+   +---+   +---+   +---+   |
     6 | . | .   .   . | . | .   .   . | . | .   .   . | . |
       |---+           +---+           +---+           +---|
     5 | 1   .   .   .   1   .   .   .   1   .   .   .   1 |
       |                                                   |
     4 | 1   .   .   .   1   .   .   .   1   .   .   .   1 |
       |                                                   |
     3 | 1   .   .   .   1   .   .   .   1   .   .   .   1 |
       |                                                   |
     2 | 1   .   .   .   1   .   .   .   1   .   .   .   1 |
       |                                                   |
     1 | 1   .   .   .   1   .   .   .   1   .   .   .   > |
       +---------------------------------------------------+
         1   2   3   4   5   6   7   8   9   10  11  12  13  AVE.

    Karel sa pri riešení tejto úlohy môže spoliehať na nasledujúce podmienky:

    • Karel začína na pozícii [1,1] a má v batohu dostatočné množstvo značiek.
    • Stĺpy sú od seba vzdialené vždy 4 stĺpce, teda stĺpy sa postupne nachádzajú na 1, 5, 9 a na nasledujúcich Streets vo svete.
    • Za všetkými stĺpmi sa na konci okamžite nachádza stena (v tomto príklade sa jedná o stĺpec č. 13).
    • Na vrchu stĺpu je hneď stena, ale nemôžete si byť istí, že stĺpy sú rovnako vysoké.
    • Niektoré stĺpy môžu obsahovať pôvodné kamene. Ak je to tak, váš program nesmie položiť značku na miesto, na ktorom sa už iná značka nachádza.
  5. Vytvorte program, v ktorom bude robot Karel neustále prechádzať medzi dvoma protiľahlými stenami, pričom nezáleží na veľkosti sveta ani na polohe a orientácii robota. Úlohu riešte prostredníctvom nekonečného cyklu. Riešenie si môžete overiť na mapách walls1.kw a walls2.kw.
    Poznámka:
    Je bežné, že občas program uviazne. Pre ukončenie bežiaceho procesu v operačnom systéme Linux zvoľte CTRL+C.
  6. Vytvorte pre robota Karla program, pomocou ktorého bude vedieť nájsť stred sveta, v ktorom sa nachádza. Karel sa na začiatku môže nachádzať na ľubovoľnej pozícii a môže byť taktiež otočený ľubovoľným smerom. Vo svete sa nenachádzajú žiadne steny ani žiadne značky a počet ulíc, ako aj počet avenues je nepárny. Riešenie úlohy si môžete overiť na mapách middleearth1.kw a middleearth2.kw.
    Počiatočná situácia:
     0
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (2, 3)   NORTH     99         0
    ST.+-------------------+
     5 | .   .   .   .   . |
       |                   |
     4 | .   .   .   .   . |
       |                   |
     3 | .   ^   .   .   . |
       |                   |
     2 | .   .   .   .   . |
       |                   |
     1 | .   .   .   .   . |
       +-------------------+
         1   2   3   4   5   AVE.
    Koncová situácia:
     12
     CORNER  FACING  BEEP-BAG  BEEP-CORNER
     (3, 3)    WEST      99         0
    ST.+-------------------+
     5 | .   .   .   .   . |
       |                   |
     4 | .   .   .   .   . |
       |                   |
     3 | .   .   <   .   . |
       |                   |
     2 | .   .   .   .   . |
       |                   |
     1 | .   .   .   .   . |
       +-------------------+
         1   2   3   4   5   AVE.
    Poznámka:
    Podstatou tejto úlohy je precvičiť si algoritmické myslenie. Daný problém by ste preto nemali riešiť pomocou premenných (ak premenné už poznáte).
    Poznámka:
    Koncová situácia Vášho riešenia by nemala byť totožná so situáciou uvedenou na obrázku.