Ciele
- Precvičiť si vetvenie toku programu na základe podmienok v programovacom jazyku C.
- Naučiť sa používať logické cykly v programovacom jazyku C.
- 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 -lcursesprič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:
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
-
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. -
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.
-
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). -
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.
-
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. -
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.
Ďalšie zdroje
- PDCurses - verzia knižnice curses pre operačný systém Windows (pdcurses.lib, pdcurses.dll)
- Knižnica Karel the Robot (Hlavičkový súbor, Windows, Linux 32b, Linux 64b)
- Rudolf Pecinovský: Základy algoritmizace - kapitola 10 (úvod), 10.2, 10.3, 11 (celá kapitola)
- Pavel Herout: Učebnice jazyka C (1. díl) - kapitoly 5.1, 5.4 a 5.5
Poznámka: