Karel and his Sensors
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
V prvom kroku vytvoríte niekoľko jednoduchých funkcií, ktoré
môžete neskôr využiť v niektorých úlohách.
Ú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
V tomto kroku pomôžete robotovi Karlovi premeniť prázdny svet
na šachovnicu.
Úloha 2.1:
Úloha 2.2:
Upravte svoje riešenie tak, aby Karel vedel šachovnicu
spraviť aj v prípade, že sa na začiatku bude nachádzať
na ľubovoľnej pozícii.
Krok č. 3
Karlove prípravy na RobOlympiádu vrcholia. V tomto kroku
pomôžete Karlovi dotiahnuť prípravy a naučiť ho zdolať v rámci
prekážkového behu prekážky ľubovoľne od seba vzdialené aj ľubovoľne
vysoké prekážky. Na začiatku každého behu sa Karel vždy bude
nachádzať na pozícii [1,1]. Karlov beh sa opäť zastaví vtedy, keď
vo svojom behu nájde značku.
Úloha 3.1:
Otvorte si riešenie doplňujúcej úlohy č. 1 z minulého cvičenia
alebo si ho prevezmite a otvorte súbor
olympics1.c.
Úloha 3.2:
Upravte program tak, aby Karel zvládol prebehnúť ľubovoľný
počet prekážok, ktoré môžu byť od seba ľubovoľne vzdialené.
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 prekážkovej dráhe olympics1.kw a
olympics2.kw.
Úloha 3.3:
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:

Koncová situácia:

Úloha 3.4:
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:

Koncová situácia:

Doplňujúce úlohy
-
Upravte predchádzajúce dva 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.
-
Otvorte si riešenie kroku č. 2 z minulého cvičenia alebo si ho
prevezmite a otvorte súbor road1.c.
Upravte program tak, aby Karel vedel vyplniť vždy všetky diery
nezávisle na ich množstve až do konca cesty. Pôvodná cesta, ktorú
mal Karel vyplniť, sa nachádza v súbore road.kw.
Ďalšie súbory svetov: road2.kw,
road3.kw, road4.kw,
road5.kw a road6.kw.
Počiatočná situácia:Koncová situácia:
-
Vytvorte program pre robota Karla, pomocou ktorého Karel zozbiera
všetky značky, ktoré sa v ňom nachádzajú. Karel ich všetky umiestni
v juhovýchodnom rohu miestnosti a sám sa nakoniec presunie na juhozápadnú
pozíciu. Pre otestovanie tejto úlohy si môžete stiahnuť súbory svetov
collector1.kw a collector2.kw.
Počiatočná situácia:Koncová situácia:
-
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. Pre otestovanie tejto úlohy si môžete
stiahnuť súbory svetov maze1.kw,
maze2.kw a maze3.kw.
Počiatočná situácia:Koncová situácia:
-
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:Koncová situácia: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:Koncová situácia:
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:Koncová situácia: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).
Ď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
$Id$