Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info
iconfalse

Ciele cvičenia

Cvičenie bude zamerané na precvičovanie algoritmizácie pomocou Karla s použitím knižnice superkarel.h. V rámci cvičenia bude vysvetlená problematika a dôležitosť plánovania algoritmu, ešte pred samotným písaním kódu, aj za použitia vývojových diagramov. Pre dosiahnutie uvedených cieľov je  nutné osvojiť si aj logické výrazy a logické operátory (AND, OR, NOT).

Info

Dôležité linky a odporúčaná literatúra

[1] KPI-FEI-TUKE, Cvičenie č. 3

[2] Microsoft, Vytvorenie základného vývojového diagramu vo Visiu

[3] Tutorialspoint, Logical Operators in C


Úloha 1.1

(úlha prevzaná z [1])

Vytvorte program prekazkovy_beh.c, v ktorom bude Karol prechádzať zľava smerom vpravo a pritom bude preskakovať prekážky.  Samozrejme, bez použitia premenných. Karol prekážkový beh skončí v momente, keď nájde značku. Pre tuto úlohu použite mapu: olympics.kw. Pri programovaní využite knižnicu superkarel.h ktorej funkcie sú detailnejšie vysvetlené v [1].

(poznámka) Predstavme si, že na Karola pozeráme zboku. Teda spodné ohraničenie mapy považujeme za bežeckú dráhu, na ktorej sú umiestnené prekážky. 

Svoj program skompilujete nasledovne:

Code Block
languagebash
gcc -Werror -Wall prekazkovy_beh.c -lsuperkarel -lcurses -o PREKAZKOVY_BEH

Svoj program spustíte nasledovne:

Code Block
languagebash
./PREKAZKOVY_BEH

Úloha 1.2 

Implementujte rutinu pre návrat Karla na štartovaciu pozíciu (znova preskakuje všetky prekážky). Pre splnenie úlohy je potrebné editovať mapu tak, aby na začiatku Karol mal v batohu práve jednu značku. 

Úloha 1.3

Implementujte ostatné úlohy uvedené na oficiálnej stránke predmetu [1].

Kostra programu (aby sme urýchlili priebeh cvičenia):

Code Block
languagecpp
titleprekazkovy_beh.c
linenumberstrue
// HLAVICKY
#include <superkarel.h>
// DEKLARACIE VLASTNYCH FUNKCII
void jump();        // celá rutina skoku cez prekážku
int is_there_bar(); // vlastný senzor na detekciu prekážky
void turn_right();  // otočka vpravo
// MAIN
int main()
{
    turn_on("olympics.kw");
    set_step_delay(300); // Jeden krok bude Karolovi trvať 300ms
// TU BUDE HLAVNY CYKLUS 
	turn_off();
    return 0;
}
// TU BUDU DEFINICIE FUNKCII
void turn_right()
{
  set_step_delay(10); // Chceme aby sa otočka vykonala veľmi rýchlo ...
  turn_left();
  turn_left();
  turn_left();
  set_step_delay(300); // Vrátime rýchlosť Karola na pôvodnú hodnotu.
}

int is_there_bar()
{
//  if( tu je viacero podmienok spojených cez logické operátory &&, || resp. ! pre negáciu )
//  {
//   return 1; // Ak sú splnené jedinečné podmienky, vráti sa hodnota 1 
//  }
//  else
    return 0; // Ak pred prekážkou nestojí, vráti sa hodnota 0
}

Začiatočná situácia

Koncová situácia


Anchor
A1
A1
Najprv algoritmus potom kód!

Pri programovaní je dobrým zvykom najprv premyslieť prečo, čo a ako chcem spraviť. Mnoho programátorov začína písaním kódu. To však neznamená, že si nepremysleli svoj postup. Jednoducho sú skúsení. Predmet ZAP má študentom pomôcť naučiť sa myslieť algoritmicky. V nasledujúcom texte si na príklade uvedenom vyššie ukážeme ako by taká tvorba algoritmu mala prebiehať. 

PREČO?

Táto otázka znie triviálne ale je potrebné si ju položiť minimálne jedného dôvodu - má zmysel daný problém riešiť? Dôvodov pre riešenie problému môže byť nespočetne veľa. Uvedieme len príklady niekoľkých. 

  • Aby som sa niečo naučil a čas strávený na univerzite nebol iba strateným časom.  
  • Aby som získal zápočet/skúšku.
  • Aby som dostal svoju výplatu.
  • Aby som vyvinul nové zariadenie/aplikáciu, ktoré mi uľahčia život.
  • ...

ČO?

Túto otázku si programátor kladie hneď ako je rozhodnutý ísť "do toho". Rovnako ju kladie aj svojím klientom, ktorí od neho chcú, aby im vyvinul aplikáciu/program.

  • Čo má daný program robiť? 
  • Čo bude vstupom daného programu?
  • Čo má byť jeho výstupom?

Pre náš príklad: 

  • Čo má daný program robiť?  - Robot Karol má prejsť cez  prekážkovú dráhu. 
  • Čo bude vstupom daného programu? - Vstupom programu je zadaná mapa "olympics.kw".
  • Čo má byť jeho výstupom? - Výstupom bude mapa zobrazená na obrazovku.

AKO?

Tu prichádza ku slovu ALGORITMIZÁCIA. Tu si musí programátor klásť ďalšie otázky, tie môžu byť rôzneho charakteru, ale určite by si mal položiť tieto:

  • Aké vstupné parametre je potrebné nastaviť a aké sú vstupné predpoklady?
  • Aké hlavné cykly (režimy) bude program vykonávať?
  • Aké sú rozhodovacie podmienky pri zmene rutiny a ukončenia programu?
  • Mám dostatočnú úroveň poznania problematiky? - poznanie sa zlepší jedine praxou 
  • Ak je program funkčný, je potrebné si položiť otázku: Je môj program optimálny? Je možné niečo vylepšiť?

Poďme odpovedať na tieto otázky pre náš príklad:

  • Aké vstupné parametre je potrebné nastaviť a aké sú vstupné predpoklady? - Predpokladáme, že veľkosť mapy bude pre tento príklad vždy rovnaká a Karol bude vždy štartovať z ľavého dolného rohu smerom na východ. 
  • Aké hlavné cykly (režimy) bude program vykonávať? -
    • 1. Karol musí prechádzať svetom smerom vpravo.
    • 2. Ak je Karol pred prekážkou, musí ju preskočiť.
    • 3. Ak narazí na značku, došiel do cieľa a program končí. 
  • Aké sú rozhodovacie podmienky pri zmene rutiny?
    • Pri prechode svetom -  Je už na značke, teda v cieli? 
    • Pred skokom - Stojí pred prekážkou? 
    • Počas skoku - Vyskočil už cez celú výšku prekážky? Je za prekážkou? Dopadol už na zem?  

Ak máme zodpovedané tieto otázky mali by sme mať oveľa lepšiu predstavu ako chceme úlohu vyriešiť. Všimnime si, že stále nebol napísaný ani riadok kódu a pritom sme pri riešení úlohy výrazne pokročili.

Je nezmysel programovo implementovať všetko naraz. Z otázok zodpovedaných vľavo je jasné, že úlohu musíme riešiť postupne. Svoj postup môžeme zapísať v textovej podobe napríklad takto:

  1. Najprv vytvoríme kostru programu a navrhneme funkciu pre overenie či Karol stojí pred prekážkou.
  2. Potom môžeme vytvoriť funkciu pre implementáciu preskočenia prekážky. 
  3. Ak bola prvá prekážka preskočená môžeme rozmýšľať nad slučkou a testovania značiek na ukončenie tejto slučky.
  4. Počas celého vývoja je potrebné myslieť na eventuality, ktoré môžu nastať a prípadne tieto vyriešiť počas implementácie kódu. 

Vývojový diagram

Samotný algoritmus môžeme vyjadriť v grafickej podobe vo forme vývojového diagramu. Vývojové diagramy sú užitočné ale častokrát časovo veľmi náročné. Pre túto úlohu si ukážeme ako by taký "vývojak" mohol vyzerať ale pri riešení Vašich zadaní ho kresliť nebudete. Ak budete pracovať na zložitejších problémoch v rámci BC prác, tak je vhodné dokumentáciu doplniť vývojovým diagramom.  

Vývojový diagram bude pozostávať z troch čiastkových diagramov.

  • Diagram pre hlavný program
  • Diagram senzor na prekážky 
  • Diagram pre skok

Flowchart Tutorial ( Complete Flowchart Guide with Examples )

Význam jednotlivých symbolov nájdete aj v literatúre [2].


Hlavný program 

Funkcia preskočenia prekážky - jump()

Funkcia senzora prítomnosti prekážky - is_there_bar()