O čom je lab
Zoznámite sa s robotom Karlom a svetom, v ktorom sa nachádza. Vytvoríte pre Karla jednoduché programy, pomocou ktorých si osvojíte jeho základné príkazy.
Ciele
- Osvojiť si možnosti riadenia robota Karla prostredníctvom základných príkazov a senzorov.
- Naučiť sa vytvárať vlastné funkcie (vlastné inštrukcie).
- Osvojiť si spôsoby dvojcestného vetvenia programu (podmienka
if
,if-else
). - Naučiť sa vytvárať jednoduché logické cykly (
while
,do-while
). - Rutinne editovať textové súbory pomocou editora ViM.
Postup
Krok 1: Setup
Udržujte si poriadok vo Vašich adresároch. Súbory vytvorené na tomto cvičení uložte do adresára ~/labs/lab02
, kde ~
je špeciálne meno pre Váš domovský adresár.
Úloha 1.1
Prihláste sa na server zap.fei.tuke.sk
alebo si spustite virtuálny stroj.
Zopakujte si, ako sa pracuje so súbormi a adresármi. Pomocou príkazu history
si pozrite, čo ste robili minulé cvičenie a skúste si spomenúť, čo robia jednotlivé príkazy.
Úloha 1.2
Vytvorte adresár ~/labs/lab02
, do ktorého budete ukladať prácu na tomto cvičení a prejdite do tohto adresára.
Môžete použiť nasledujúce príkazy:
ls
listuje obsah adresáramkdir nazov
vytvorí nový adresárnazov
cd nazov
zmení aktuálny adresár na iný (v tomto prípade podadresárnazov
)
Úloha 1.3
Stiahnite si súbor Makefile
pre Karla. Ten je potrebný, aby bolo možné úspešne preložiť a zostaviť program.
Na stiahnutie použite nástroj wget
:
wget http://kurzy.kpi.fei.tuke.sk/zap/resources/lib/Makefile
Poznámka
V prípade, že príkaz wget
nebol rozpoznaný, je potrebné ho doinštalovať:
sudo apt install wget
Na VM Write Code môžete použiť heslo developer
.
Krok 2: Stairs
V tomto kroku vytvoríte pre Karla program, pomocou ktorého mu pomôžete vyšplhať sa po schodoch nahor, až na najvyšší stupienok. Cestou pomôžete 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 svet stairs.kw
.
Úloha 2.1
Stiahnite si súbor sveta stairs.kw.
Na stiahnutie použite nástroj wget
:
wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs.kw
Overte si pomocou ls
, či sú všetky potrebné súbory dostupné:
stairs.kw
: súbor s počiatočným stavom robota KarlaMakefile
: súbor s pravidlami na preklad programu
Úloha 2.2
Vytvorte súbor stairs.c
s kostrou programu pre robota Karla.
Použite textový editor ViM:
vim stairs.c
- Do vkladacieho módu sa prepnete pomocou
i
aleboA
. - Program uložíte pomocou
:w
, program uložíte a skončíte pomocou :wq
aleboShift+Z+Z
. - Príkazy za
:
môžete dopĺňať pomocouTAB
a vyvolávať históriu pomocou šípok.
Poznámka
Text odporúčame ručne prepísať, nie kopírovať, aby ste sa naučili pracovať s textovým editorom a naučili polohu špeciálnych znakov.
Poznámka
Overte si, či používate anglickú klávesnicu. Písanie špeciálnych znakov je veľmi zložité na slovenskej klávesnici.
Kostra programu:
#include <karel.h>
int main() {
turn_on("stairs.kw");
// your code goes here
turn_off();
return 0;
}
#include <headerfile.h>
Pripojenie hlavičkového súboru (musí byť v každom programe)int main()
Hlavná funkcia programu (v každom programe je práve jedna)return 0
Ukončenie funkcie s danou hodnotou (v tomto prípade ukončenie programu)turn_on("world.kw")
Príkaz, ktorý Karla zapne. Príkaz má jeden povinný parameter, ktorým je cesta k súboru s opisom sveta, v ktorom Karel bude riešiť svoju úlohu (musí byť na začiatku každého programu robota Karla)turn_off()
Po vykonaní všetkých krokov programu tento príkaz zabezpečí korektné vypnutie robota Karla
Poznámka
Váš program sa bude nachádzať medzi riadkami 4-8.
Poznámka
V programovacom jazyku C, tak ako vo väčšine programovacích jazykov, záleží na veľkosti používaných písmen. Preto je dôležité, aby názov každej funkcie presne zodpovedal príkladu, napr. funkcia turn_on()
.
Úloha 2.3
Napíšte program pre robota tak, aby sa robot vyšplhal na najvyšší schod a cestou pozbieral všetky značky. Na poslednom schode robot vyloží všetky značky z batoha. Použite vlastné funkcie (inštrukcie).
Počiatočná situácia
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
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.
Použiť môžete nasledujúce inštrukcie robota Karla:
step()
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 kraji sveta), program sa zastavípick_beeper()
Pokiaľ Karel stojí na pozícii, na ktorej sa nachádza značka, Karel ju zodvihne a vloží do svojho batohuput_beeper()
Pokiaľ má Karel vo svojom batohu značku, položí ju na pozíciu, na ktorej sa aktuálne nachádzaturn_left()
Po zadaní tohto príkazu sa Karel otočí na svojom mieste o 90 stupňov smerom doľava
Poznámka
V editore ViM platí pravidlo, že tú istú vec nemusíte písať dvakrát. Kusy kódu sa dajú efektívne kopírovať pomocou kopírovacieho registra (schránky) editora ViM.
Stlačením i
prejdite do vkladacieho módu a napíšte napr.
step();
pick_beeper();
Pomocou ESC
prejdite do príkazového módu a môžete kopírovať:
- Presuňte kurzor na
step()
. Pre presun na konkrétny riadok môžete použiť príkaz:4
(skočí na 4. riadok). - Príkazom
dd
vymažete celý riadok. Riadok sa teraz nachádza v kopírovacom registri, ktorý môžete použiť pomocoup
aleboP
. - Podľa potreby si nakopírujte kroky robota Karla.
Upozornenie
Schránka editora ViM nie je totožná so schránkou lokálneho systému.
Úloha 2.4
Preložte program prostredníctvom nástroja make
a spustite program.
Keďže máte k dispozícii súbor Makefile
, program preložíte pomocou príkazu:
make stairs
V prípade úspešného prekladu sa v pracovnom adresári objaví spustiteľný súbor stairs
. V prípade neúspešného prekladu si prečítajte chybové hlásenia a opravte Váš program.
Program spustíte pomocou príkazu:
./stairs
Poznámka
V prípade, že prekladač hlási chybu karel.h: No such file or directory, stiahnite si hlavičkový súbor karel.h a zmeňte prvý riadok programu:
#include "karel.h"
Takto bude prekladač hľadať hlavičkový súbor okrem štandardných adresárov aj v pracovnom adresári (kde sa program nachádza).
Poznámka
Preklad môžete ľahko vykonávať z prostredia textového editora ViM prikazom:
:make stairs
a spúšťať:
:!./stairs
Za výkričníkom môže ísť ľubovoľný príkaz shellu. Funguje história aj dopĺňanie.
Úloha 2.5
Upravte program tak, aby Karel vyšiel na najvyšší z ľubovoľného počtu schodov a značky zbieral iba tam, kde sa nachádzajú. Použite mapu stairs2.kw. Vaše riešenie overte.
Stiahnite si súbor sveta:
wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs2.kw
Počiatočná situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(1, 1) EAST 0 0
ST.+-----------------------------------+
9 | . . . . . . . . . |
| |
8 | . . . . . . . . . |
| |
7 | . . . . . . . . . |
| |
6 | . . . . . . . . . |
| +---+ |
5 | . . . . . . | . | . . |
| +---+ | |
4 | . . . . 1 | . . | . . |
| +---+ | |
3 | . . . . | . . . | . . |
| +---+ | |
2 | . . 1 | . . . . | . . |
| +---+ | |
1 | > . | . . . . . | . . |
+-----------------------------------+
1 2 3 4 5 6 7 8 9 AVE.
Koncová situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(7, 6) EAST 0 2
ST.+-----------------------------------+
9 | . . . . . . . . . |
| |
8 | . . . . . . . . . |
| |
7 | . . . . . . . . . |
| |
6 | . . . . . . > . . |
| +---+ |
5 | . . . . . . | . | . . |
| +---+ | |
4 | . . . . . | . . | . . |
| +---+ | |
3 | . . . . | . . . | . . |
| +---+ | |
2 | . . . | . . . . | . . |
| +---+ | |
1 | . . | . . . . . | . . |
+-----------------------------------+
1 2 3 4 5 6 7 8 9 AVE.
Použiť môžete nasledujúce senzory robota:
beepers_present()
Vráti hodnotutrue
, ak Karel stojí na pozícii s aspoň jednou značkou, a hodnotufalse
, ak tam žiadna nie jebeepers_in_bag()
Vráti hodnotutrue
, ak je batoh neprázdny, a hodnotufalse
, ak je prázdnyfront_is_clear()
Vráti hodnotutrue
, ak sa priamo pred Karlom nenachádza žiadna stena, a hodnotufalse
, ak sa tam nachádza
Poznámka
Ak chcete označiť blok textu, prepnite sa do označovacieho režimu pomocou v
alebo V
(pre označovanie celých riadkov).
Príkaz y
potom kopíruje text, x
ho vyberá do kopírovacieho registra.
Ak ste sa pomýlili, úpravu vrátite pomocou príkazu u
, redo je Ctrl+R
.
Úloha 2.6
Upravte program tak, aby Karel vyšiel na najvyšší z ľubovoľného počtu schodov a pozbieral všetky značky tam, kde sa nachádzajú. Použite mapu stairs3.kw. Vaše riešenie overte.
Stiahnite si súbor sveta:
wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs3.kw
Počiatočná situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(1, 1) EAST 0 0
ST.+-----------------------------------+
9 | . . . . . . . . . |
| |
8 | . . . . . . . . . |
| +---+ |
7 | . . . . . . | . | . . |
| | | |
6 | . . . . . . | . | . . |
| +---+ | |
5 | . . . . 5 | . . | . . |
| +---+ | |
4 | . . . . | . . . | . . |
| | | |
3 | . . . . | . . . | . . |
| +---+ | |
2 | . . 1 | . . . . | . . |
| +---+ | |
1 | > . | . . . . . | . . |
+-----------------------------------+
1 2 3 4 5 6 7 8 9 AVE.
Koncová situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(7, 8) EAST 0 6
ST.+-----------------------------------+
9 | . . . . . . . . . |
| |
8 | . . . . . . > . . |
| +---+ |
7 | . . . . . . | . | . . |
| | | |
6 | . . . . . . | . | . . |
| +---+ | |
5 | . . . . . | . . | . . |
| +---+ | |
4 | . . . . | . . . | . . |
| | | |
3 | . . . . | . . . | . . |
| +---+ | |
2 | . . . | . . . . | . . |
| +---+ | |
1 | . . | . . . . . | . . |
+-----------------------------------+
1 2 3 4 5 6 7 8 9 AVE.
Môžete si naprogramovať nové senzory robota (podľa potreby):
right_is_clear()
Vráti hodnotutrue
, ak sa napravo od robota nenachádza žiadna stena, inak vráti hodnotufalse
right_is_blocked()
Vráti hodnotutrue
, ak sa napravo od robota nachádza stena, inak vráti hodnotufalse
left_is_clear()
Vráti hodnotutrue
, ak sa naľavo od robota nenachádza žiadna stena, inak vráti hodnotufalse
left_is_blocked()
Vráti hodnotutrue
, ak sa naľavo od robota nachádza stena, inak vráti hodnotufalse
Doplňujúce úlohy
Úloha A.1
Preložte a spustite program priamo z editora ViM. Editor ViM obsahuje vlastnosti, ktoré Vám zjednodušia programátorskú prácu.
Zámerne spravte v programe stairs.c
chybu: Vymažte bodkočiarku. V príkazovom móde editora ViM nájdite bodkočiarku:
/;
Vymažte ju pomocou x
.
Poznámka
Príkaz /
slúži na vyhľadávanie. Za /
napíšte hľadaný text.
Príkazom n
a N
sa pohybuje po nájdených výskytoch. Podobne príkaz *
vyhľadáva aktuálne slovo.
Samozrejme môžete využiť aj iné metódy pohybu po texte, napr. príkazy wWbB
(posunie kurzor na ďalšie a minulé slovo).
Uložte súbor:
:w
Choďte s kurzorom na začiatok súboru pomocou gg
alebo na koniec súboru pomocou GG
. Preložte program priamo z editora:
:make
Mala by sa vypísať chybová hláška a kurzor skočí hneď na chybný riadok. Opravte program, uložte súbor a preložte ho. Využite históriu, aby ste opäť nemuseli vypisovať príkaz na preklad.
Úloha A.2
Naštudujte si súbory sveta a vymyslite súbor sveta stairs4.kw
tak, aby schody boli rôzne široké. Pomôcť si môžete referenčnou príručkou. Upravte Váš program tak, aby Karel dokázal prejsť cez rôzne široké schody.
Úloha A.3
Vytvorte program marker
, pomocou ktorého Karel označkuje všetky rohy ľubovoľne veľkého sveta. Platí, že robot označkuje len tie rohy sveta, ktoré ešte označkované nie sú. Vaše riešenie otestujte na mapách sveta marker.kw a marker2.kw.
Úloha A.4
Pri elektronickom spracovaní hlasovacích lístkov nastali problémy pre rôzne nečistoty na týchto lístkoch. Navrhnite pre robota Karla program ballot
, pomocou ktorého vyčistí všetky nečistoty na hlasovacích lístkoch a zachová len korektne vyznačené hlasy.
Hlas je platný vtedy, ak je hlasovacie pole vyplnené na všetkých jeho troch pozíciách po jednej značke. Jednotlivé hlasovacie polia (je ich rôzny počet) sa nachádzajú na párnych pozíciách a šírka sveta má vždy nepárny počet pozícií. Na otestovanie Vášho riešenia použite mapu ballot.kw a vymyslite aspoň 2 nové mapy.
Počiatočná situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(1, 3) EAST 0 0
ST.+---------------------------+
5 | . . . . . . . |
| +---+ +---+ +---+ |
4 | . | 1 | . | 2 | . | . | . |
| | | | | | | |
3 | > 1 . 1 . 1 . |
| | | | | | | |
2 | . | 1 | . | . | . | 1 | . |
| +---+ +---+ +---+ |
1 | . . . . . . . |
+---------------------------+
1 2 3 4 5 6 7 AVE.
Koncová situácia
CORNER FACING BEEP-BAG BEEP-CORNER
(7, 3) EAST 5 0
ST.+---------------------------+
5 | . . . . . . . |
| +---+ +---+ +---+ |
4 | . | 1 | . | . | . | . | . |
| | | | | | | |
3 | . 1 . . . . > |
| | | | | | | |
2 | . | 1 | . | . | . | . | . |
| +---+ +---+ +---+ |
1 | . . . . . . . |
+---------------------------+
1 2 3 4 5 6 7 AVE.
Doplňujúce zdroje
- Karel Language Reference
- Tu nájdete knižnicu robota Karla, vrátane návodu na inštaláciu knižnice.
- Rudolf Pecinovský: Základy algoritmizace - kapitola 6.1
- Pavel Herout: Učebnice jazyka C (1. díl) - kapitola 9.2
- Hlavičkový súbor robota Karla karel.h
- Súbor pre preklad Karlovho programu Makefile
- GNU Make Tutorial
- Náš VIM tutoriál
- ViM Quick Reference Card (.pdf)
- Tomášov konfigurák pre ViM
- Danielov konfigurák pre ViM