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 rekurzie v programovaní. 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 č. 4

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

[3] Tutorialspoint, Logical Operators in C

[4] KPI-FEI-TUKE, Prednáška č. 3 


Úloha 1.1

(úlha prevzaná z [1])

Vytvorte program multiplier, v ktorom bude Karol prechádzať postupne celým svetom a zdvojnásobovať počet značiek, ktoré nájde. Samozrejme, bez použitia premenných. Nakoniec sa Karol vráti na pozíciu kde začal. Vaše riešenie otestujte na svete multiplier.kw


Svoj program skompilujete nasledovne:

gcc -Werror -Wall multiplier.c -lsuperkarel -lcurses -o Multiplier



 

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

multiplier.c
// HLAVICKY
#include <karel.h>
#include <superkarel.h>
// DEKLARACIE VLASTNYCH FUNKCII
void new_line();
void turn_right();
void multiply();
void go_home();
// MAIN
int main()
{
    turn_on("multiplier.kw");
    // TU BUDE HLAVNY CYKLUS   
    turn_off();
    return 0;
}
// TU BUDU DEFINICIE FUNKCII

Začiatočná situácia

Koncová situácia


Na minulom cvičení sme preberali podstatu algoritmizácie.  Na tomto cvičení by ste si tieto poznatky mali prehĺbiť a navyše doplniť o problematiku rekurzie.

Najprv si musíme zodpovedať niektoré otázky a až tak môžeme pristúpiť k programovaniu:

  • 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ť celým svetom.
    • 2. Ak je Karol v pravom hornom rohu, musí sa vrátiť tam kde štartoval.
    • 3. Ak narazí na značku, musí ju zdvojnásobiť
  • Aké sú rozhodovacie podmienky pri zmene rutiny?
    • Pri prechode celým svetom - Nemal by prejsť o riadok vyššie? Je už v pravom hornom rohu? 
    • Pri značkách - Stojí na značke?
    • Návrat na štart - Skončil sa už hlavný cyklus prechádzania celého sveta?

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 hlavný cyklus, tak aby Karol prechádzal celým svetom.
  2. Ak ním prešiel tak naprogramujeme jeho návrat na štart.
  3. Ak sme spravili bod 1. a 2. tak máme spravenú kostru programu a môžeme sa zamýšľať nad zdvojnásobovaním značiek, ktoré budeme robiť rekurentne. O rekurzívnom programovaní si povieme  viac tu.  



Vývojový diagram

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

  • Diagram pre hlavný program
  • Diagram pre posun na ďalší riadok ( napr. new_line() )
  • Diagram pre návrat na štart ( napr. go_home() )
  • Diagram pre zdvojnásobenie (napr. multiply() ).



Hlavný program 

Funkcia návratu na začiatok sveta go_home()



Funkcia zdvojnásobenia značiek multiply()

Funkcia posunu o riadok vyššie new_line()

  • No labels