2. týždeň

First Steps with Karel the Robot

Vlastné funkcie, dvojcestné vetvenie, logické cykly

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.kpi.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ára
  • mkdir nazov vytvorí nový adresár nazov
  • cd nazov zmení aktuálny adresár na iný (v tomto prípade podadresár nazov)

Ú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

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 Karla
  • Makefile : 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 alebo A.
  • Program uložíte pomocou :w, program uložíte a skončíte pomocou :wq alebo Shift+Z+Z.
  • Príkazy za : môžete dopĺňať pomocou TAB 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 batohu
  • put_beeper() Pokiaľ má Karel vo svojom batohu značku, položí ju na pozíciu, na ktorej sa aktuálne nachádza
  • turn_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ť pomocou p alebo P.
  • 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 hodnotu true, ak Karel stojí na pozícii s aspoň jednou značkou, a hodnotu false, ak tam žiadna nie je
  • beepers_in_bag() Vráti hodnotu true, ak je batoh neprázdny, a hodnotu false, ak je prázdny
  • front_is_clear() Vráti hodnotu true, ak sa priamo pred Karlom nenachádza žiadna stena, a hodnotu false, 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 hodnotu true, ak sa napravo od robota nenachádza žiadna stena, inak vráti hodnotu false
  • right_is_blocked() Vráti hodnotu true, ak sa napravo od robota nachádza stena, inak vráti hodnotu false
  • left_is_clear() Vráti hodnotu true, ak sa naľavo od robota nenachádza žiadna stena, inak vráti hodnotu false
  • left_is_blocked() Vráti hodnotu true, ak sa naľavo od robota nachádza stena, inak vráti hodnotu false

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

  1. Karel Language Reference
  2. Tu nájdete knižnicu robota Karla, vrátane návodu na inštaláciu knižnice.
  3. Rudolf Pecinovský: Základy algoritmizace - kapitola 6.1
  4. Pavel Herout: Učebnice jazyka C (1. díl) - kapitola 9.2
  5. Hlavičkový súbor robota Karla karel.h
  6. Súbor pre preklad Karlovho programu Makefile
  7. GNU Make Tutorial
  8. ViM Quick Reference Card (.pdf)
  9. Tomášov konfigurák pre ViM
  10. Danielov konfigurák pre ViM

Video