Ciele cvičeniaCvič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).
|
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:
gcc -Werror -Wall prekazkovy_beh.c -lsuperkarel -lcurses -o PREKAZKOVY_BEH |
Svoj program spustíte nasledovne:
./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):
// 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
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.
Č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.
Pre náš príklad:
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:
Poďme odpovedať na tieto otázky pre náš príklad:
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:
Hlavný program
Funkcia preskočenia prekážky - jump()
Funkcia senzora prítomnosti prekážky - is_there_bar()