$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$
Hour of Code / Функције и пчеле

Функције и пчеле

Програми могу да буду веома дугачки. Замислите програм који неком објашњава како да се креће кроз ходнике и пролази кроз врата. Програм би изгледао овако:

У овом примеру можемо да видимо да се наредбе „Отвори врата“, „Прођи“ и „Затвори врата“ увек извршавају заједно и понављају неколико пута. Било би лепо да их заменимо наредбом понављања, али проблем је то што се оне не понављају тако да после једног извршавања те групе од три наредби опет крене извршавање те исте групе. Уместо тога између сваке групе се може наћи по једна, две или три наредбе „иди право“ због којих не можемо да користимо наредбу понављања.

Међутим, можемо да урадимо нешто друго. Уместо да понављамо те три наредбе, можемо да кажемо нешто као „ПРОЂИ КРОЗ ВРАТА“ али да негде објаснимо да ова "наредба" у ствари значи да треба да се изврше наредбе „Отвори врата“, „Прођи“ и „Затвори врата“. Једноставно, могли бисмо негде са стране да напишемо нешто овако:

Наредбе „Отвори врата“, „Прођи“ и „Затвори врата“ су група наредби која се зове „ПРОЂИ КРОЗ ВРАТА“.

Ово је у ствари група наредби са неким заједничким именом (или процедура или функција како се негде зове). Идеја је да на једном месту кажемо да постоји нека група наредби која се стално извршава заједно, а да у програму само ставимо име те групе када желимо да се изврше наредбе у њој. На овај начин не морамо да на више места копирамо исте наредбе. Сада наш програм изгледа овако:

Програм је исти као и претходни али има мање наредби, лакши је за писање а и лакши је за читање. Сваки пут када наиђемо на наредбу „ПРОЂИ КРОЗ ВРАТА“, ми знамо да у ствари треба да извршимо следеће три наредбе у функцији са тим именом.

Хајде да помогнемо пчелици на слици да покупи нектар са цветова.

Пчелица треба да се помери два поља напред па да оде лево по нектар и врати се. Онда иде још три поља напред и опет оде лево по нектар и врати се. Онда треба да се помери још два поља напред и опет оде лево по нектар и врати се.

Када пишемо програм морамо да смислимо шта да радимо са овим делом иде лево по нектар и врати се .

Можемо да напишемо наредбе које су потребне да пчела оде лево по нектар и врати се назад: 

окрени се улево, помери се напред, помери се напред, узми нектар, узми нектар,
узми нектар, помери се уназад, помери се уназад, окрени се удесно

Приметите да на сваком цвету има по три нектара па мора три пута да уради "узми нектар". Ако бисмо ове наредбе ставили у програм он би изгледао овако:

помери се напред, помери се напред,

окрени се улево, помери се напред, помери се напред, узми нектар, 
узми нектар, узми нектар, помери се уназад, помери се уназад, окрени се удесно помери се напред, помери се напред, помери се напред, окрени се улево, помери се напред, помери се напред, узми нектар,
узми нектар, узми нектар, помери се уназад, помери се уназад, окрени се удесно помери се напред, помери се напред, окрени се улево, помери се напред, помери се напред, узми нектар,
узми нектар, узми нектар, помери се уназад, помери се уназад, окрени се удесно

Овде има толико наредби које се понављају да нећемо ни покушати да их наслажемо. Уместо тога ћемо ставити наредбе које објашњавају пчели како да оде лево по нектар и врати се назад помоћу функције којој ћемо дати име „Иди по нектар“:

„Иди лево по нектар и врати се“ је група наредби (функција) коју ће пчелица да изврши сваку пут када би требало да оде лево по нектар. Ова група наредби у себи има акције два пута иди напред, покупи нектар са цвета, два пута иди назад да би се вратио на главни пут и окрени се удесно.

Пчелица ће извршити наредбе у тој групи сваки пут када треба да оде лево по нектар. Сада наш програм изгледа овако:

Јесте да смо написали два мала програмчића (једну функцију и један програм који је неколико пута позива) али ово је много јасније него онај први програм где бисмо све понављали.

Сваки пут када пчелица наиђе на име групе „Иди лево по нектар и врати се“, она ће погледати у овај списак наредби и извршити их.

Домаћи задатак

Поиграјте се мало са проблемима који се решавају са функцијама на сајту часа програмирања. 

На https://studio.code.org/s/course3/stage/6/puzzle/1 можете видети још примера са пчелом која користи функције да би покупила нектар са цвећа и направила мед на саћу. У неким примерима ћете имати спремне функције које се позивају у програму и ви ћете морати да у њих упишете неке наредбе, а у другим проблемима ћете морати сами да смислите и функције и где ћете их позивати.