$$ \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 / Наредбе са понављањима и условима

Наредбе са понављањима и условима

Наредбе понављања које смо видели у претходној лекцији су одличне ако знамо колико пута треба да се изврши нека наредба. Али шта ако то не знамо? На пример, колико пута је потребно ударити чекићем ексер да бисмо га закуцали у дрво? Док се не закуца. Колико пута треба да убацимо земљу лопатом у рупу? Док се рупа не напуни. Колико дуго треба да трчимо на трци? Док не стигнемо до циља.

У овим примерима имамо нешто што личи на наредбе понављања којима не можемо да кажемо колико пута треба да се изврше. У овим наредбама понављања морамо да имамо неке одлуке или услове. Ово су нове врсте наредби које зовемо наредбе понављања са условима. То су комбинације обичних наредби за понављање и наредби са одлукама.

Сетите се примера са Редом који хоће да дође до прасета на слици. Ако бисмо имали само обичну наредбу понављања морали бисмо да избројимо колико је далеко од прасета да бисмо уписали неки број (на пример „понављај 5 пута“). Међутим, ако имамо наредбу понављања са условом, можемо да му кажемо понављај док не дођеш до прасета наредбу „помери се напред“, као на слици десно:

 

Зашто су корисне наредбе понављања са условима? Прво, лакше нам је да програмирамо са њима зато што не морамо да бројимо колико пута треба да се понови нека наредба. Ово би било тешко ако би Ред био 73 корака од прасета па бисмо морали тачно да избројимо колико је далеко. Ако бисмо промашили један број, Ред би или стао испред прасета или би ударио у зид иза прасета. Други разлог је да некада стварно не можемо да знамо колико пута треба да се нешто понови. На пример, ако не видимо сва поља између Реда и прасета, не можемо да претпоставимо колико пута Ред треба да иде напред. Али, оно што знамо је да Ред треба да дође до прасета. Зашто то не бисмо користили као услов до када треба да се понавља наредба уместо неког броја који смо раније користили?

Помозите фармеру на сајту часа програмирања да попуни рупе у пољу и уклони гомиле земље као у следећем видеу:

На слици је фармер са лопатицом који хоће да напуни рупу на путу земљом. Можемо да му кажемо „испуни 1“ што значи да убаци једну лопату земље у рупу. Међутим, пошто не знамо колико је рупа дубока, не можемо да му кажемо нешто као пет пута убаци земљу. Али ако имамо наредбу понављања са условом можемо да му кажемо нешто као „Док је ту рупа: испуни 1“. Тако ће фармер сипати лопату по лопату у рупу док је не напуни.

У овом програму ће фармер прво да се помери напред, онда окрене улево па онда помери напред да би дошао до рупе. Онда ће да понавља наредбу „испуни 1“ све док је ту рупа. Када испуни рупу до врха неће више да извршава наредбу. 

Хајде сад да објаснимо фармеру како да испуни рупу и покупи земљу са гомиле на слици доле. Можемо да му кажемо испуни 1 као у претходном примеру, али и уклони 1 што значи да узме једну лопатицу земље са гомиле. Програм који би му објаснио како да изравна овај терен је приказан на слици десно.

Прво ћемо да му кажемо да се помери два пута напред како би дошао до рупе. Онда му кажемо да испуни рупу по једном лопатицом земље све док је ту рупа. Потом му говоримо како да дође до гомиле земље. Онда му другом петљом говоримо да треба да уклони по једну лопатицу земље са гомиле све док не нестане гомила.

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

Помозите фармеру да покупи гомиле земље са њиве или да напуни рупе земљом на https://studio.code.org/s/course3/stage/12/puzzle/1. Као и у примерима у овој лекцији, нећете знати колико је велика гомила и колико је дубока рупа па ћете морати да користите наредбе понављања са условима да би попуњавао рупе све док их не напуни.