$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\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{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Час 2 - Робот Карел - условне петље, гранање

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

  • moze_napred() - проверава да робот може да се помери напред (да ли испред њега постоји зид),

  • ima_loptica_na_polju() - проверава да ли на пољу на ком се робот налази има лоптица,

  • broj_loptica_na_polju() - враћа број лоптица на пољу на ком се робот налази,

  • ima_loptica_kod_sebe() - проверава да ли робот тренутно има лоптица код себе.

  • broj_loptica_kod_sebe() - враћа број лоптица које робот тренутно има код себе,

Понављање - условна петља while

Иди напред док можеш

Наредни лавиринт је зачаран и не зна се колико тачно поља постоји између робота и лоптице. Напиши програм тако да робот и у таквом лавиринту увек стиже до лоптице и узима је. Подсећам те да помоћу mozeNapred() можеш проверити да ли се робот може померити напред, тј. да ли се испред њега налази зид.

Петљу for најчешће користимо када знамо тачно колико пута желимо да се нешто понови. Међутим, постоји и други облик петље којим се обезбеђује да се наредбе понављају све док је неки услов испуњен. У овом програму желимо роботу да наредимо да иде напред док год је то могуће и након тога да покупи лоптицу. Док се на енглеском језику каже while, па се и условна петља назива петља while. Погледај како се она може употребити. Покрени наредни програм више пута и видећеш да исправно ради без обзира на то како се се зачарани лавиринт променио.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_иди_напред_док_можеш)

Запамти, while значи док. У преходном програму смо, дакле, роботу рекли следеће: „Док можеш да идеш напред иди напред. Узми лоптицу.”

Приметимо и да се након услова петље while наводи двотачка, док се наредбе које се понављају увлаче (веома слично као што је био случај и код петље for). И поруке о грешкама уколико се то не испоштује су сличне.

И петљама while ћемо се детаљније бавити у поглављу Понављање.

Купи лоптице док можеш

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

Један начин да се реши задатак је да се прво одреди колико је лоптица на пољу на ком се робот налази, а затим да се употреби петља for. Број лоптица на пољу се може одредити позивом broj_loptica_na_polju().

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_купи_лоптице_док_можеш)

Овим програм смо рекли роботу следеће: „Онолико пута колико је на пољу лоптица узми лоптицу”.

Други начин да се задатак реши је да се употреби петља while и да се лоптице купе све док их има на пољу. Ту проверу робот може да изврши коришћењем питања ima_loptica_na_polju().

Покушај да измениш претходни програм и задатак решиш на овај начин. Твој програм треба роботу да каже следеће „Иди напред. Док има лоптица на пољу узимај лоптицу”.

Претходни садржај можеш погледати и у наредној видео-лекцији.

Гранање

Покупи лоптицу ако је има

Наредни лавиринт је зачаран. Сваки пут када се робот покрене, лоптице на три поља испред њега се наместе другачије. Напиши програм којим робот купи све лоптице.

Робот треба три пута да се помери напред и да са сваког поља на које дође покупи лоптицу (ако на пољу има лоптица). Међутим, пре него што покупи лоптицу он мора да провери да ли на том пољу уопште постоји лоптица. Провера услова у програмском језику Python (а и у многим другим програмским језицима) врши се наредбом if, што на енглеском језику значи ако.

Подсетимо се, помоћу услова ima_loptica_na_polju испитујемо да ли на пољу има лоптица. Претходним кодом смо роботу рекли „Ако на пољу на ком стојиш има лоптица, онда узми лоптицу”, чиме постижемо да Карел провери да ли на пољу има лоптица и ако има да узме једну лоптицу. Приметимо да је, слично као и код петљи, након услова наведена двотачка, а да је наредба која се извршава ако је услов испуњен мало увучена. То је обавезно и ако то не испоштујеш добићеш поруку о грешци, веома сличну као и код петљи.

У зависности од тога да ли је услов који проверавамо испуњен, ток програма се грана, па се наредба if назива и наредба гранања. Гранањем и наредбом if ћемо се много детаљније бавити у поглављу Гранање.

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

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптицу_ако_је_има)

Приметимо да се у претходном програму наредбе

понављају три пута и можемо употребити петљу for да добијемо једноставнији програм.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптицу_ако_је_има_for)

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

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

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптицу_ако_је_има_while)

Претходни садржај можеш погледати и у наредној видео-лекцији.

Узимање и остављање лоптица

Карел не зна где се налазе лоптице, а има задатак да три поља испред себе промени тако да узме лоптице са оних поља на којима се налазе и да их постави на она поља на којима се не налазе.

У ранијим програмима смо видели како робот може да иде три поља напред и да узима лоптице на које наиђе. Потребно је да тај програм проширимо тако да робот оставља лоптице на празна поља. Најлакши начин да се то уради је да кажемо следеће: „Ако је на пољу лоптица, онда је узми, а у супротном је остави”. То можемо остварити помоћу допуне наредби if помоћу речи else која значи у супротном тј. иначе.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_узми_и_остави_лоптице)

Дакле, ако желимо да робот изврши неке наредбе ако је неки услов испуњен, а неке друге ако тај услов није испуњен, користимо наредбу if-else. Иза речи if наводи се услов, затим двотачка и затим наредбе које ће се извршити ако услов јесте испуњен. Нако тога се наводи реч else поравната са речју if, затим се наводи двотачка, а наредбе које се извршавају ако услов наведен иза if није испуњен се такође увлаче.

Претходни садржај можеш погледати и у наредној видео-лекцији.

Кретање у круг

Покушај да решиш и наредни, мало тежи задатак.

Напиши програм којим се роботу наређује да се креће у круг око лавиринта и да покупи све лоптице на које наиђе.

Једна идеја за решење је да четири пута поновимо наредбе којима робот иде напред докле год може и купи све лоптице на које наиђе.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптице_у_круг_1)

Још једна идеја за решење може биће следећа. Ако робот може да се помери напред, онда ћемо му рећи да се помери напред и нако тога ћемо му рећи да провери да ли се на пољу налази лоптица и да је узме. У супротном, ако робот не може да се помери напред, значи да је дошао до зида и тада ћемо му рећи да се окрене на лево. Све ово ћемо понављати у једној петљи (која ће се извршити 20 пута, што је тачно број корака који је потребан да би робот обишао цео круг). Покушај да наредни код допуниш тако да робот успешно покупи све лоптице.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптице_у_круг_2)

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

Лоптице на три стране

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

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_лоптице_на_три_стране)

Једно могуће решење (не и једино) је следеће.

Покупи лоптице до којих можеш да дођеш

Помози роботу да покупи све лоптице. Наравно, лавиринт је опет зачаран и распоред препрека и лоптица испред робота се мења приликом сваког покретања програма.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Карел_покупи_лоптице_до_којих_можеш_да_дођеш)

У сваком кораку робот треба да се помери напред, затим да се окрене за 90 степени (ка југу) и провери да ли је испред њега препрека. Ако нема препреке тј. ако може да иде напред, онда треба да оде напред, узме лоптицу, окрене се за 180 степени (ка северу), поново оде напред и окрене се за 90 степени (ка истоку). У супротном само треба да се окрене за 90 степени (ка истоку).

Једно могуће решење (не и једино) је следеће.