Час 2 - Робот Карел - условне петље, гранање¶
Поред наредби које робот може да извршава, које смо користили у досадашњим програмима, робот Карел може да поставља следећа питања.
moze_napred()
- проверава да робот може да се помери напред (да ли испред њега постоји зид),ima_loptica_na_polju()
- проверава да ли на пољу на ком се робот налази има лоптица,broj_loptica_na_polju()
- враћа број лоптица на пољу на ком се робот налази,ima_loptica_kod_sebe()
- проверава да ли робот тренутно има лоптица код себе.broj_loptica_kod_sebe()
- враћа број лоптица које робот тренутно има код себе,
Понављање - условна петља while¶
Иди напред док можеш¶
Наредни лавиринт је зачаран и не зна се колико тачно поља постоји
између робота и лоптице. Напиши програм тако да робот и у таквом
лавиринту увек стиже до лоптице и узима је. Подсећам те да помоћу
mozeNapred()
можеш проверити да ли се робот може померити
напред, тј. да ли се испред њега налази зид.
Петљу for
најчешће користимо када знамо тачно колико пута желимо
да се нешто понови. Међутим, постоји и други облик петље којим се
обезбеђује да се наредбе понављају све док је неки услов испуњен. У
овом програму желимо роботу да наредимо да иде напред док год је то
могуће и након тога да покупи лоптицу. Док се на енглеском језику каже
while, па се и условна петља назива петља while
. Погледај како се
она може употребити. Покрени наредни програм више пута и видећеш да
исправно ради без обзира на то како се се зачарани лавиринт променио.
Запамти, while
значи док. У преходном програму смо, дакле, роботу
рекли следеће: „Док можеш да идеш напред иди напред. Узми лоптицу.”
Приметимо и да се након услова петље while
наводи двотачка, док се
наредбе које се понављају увлаче (веома слично као што је био случај и
код петље for
). И поруке о грешкама уколико се то не испоштује су
сличне.
И петљама while
ћемо се детаљније бавити у поглављу Понављање.
Купи лоптице док можеш¶
Наредни лавиринт је зачаран и не зна се колико тачно има лоптица испред робота. Напиши програм којим робот купи све те лоптице.
Један начин да се реши задатак је да се прво одреди колико је лоптица
на пољу на ком се робот налази, а затим да се употреби петља
for
. Број лоптица на пољу се може одредити позивом
broj_loptica_na_polju()
.
Овим програм смо рекли роботу следеће: „Онолико пута колико је на пољу лоптица, узми лоптицу”.
Други начин да се задатак реши је да се употреби петља while
и да
се лоптице купе све док их има на пољу. Ту проверу робот може да
изврши коришћењем питања ima_loptica_na_polju()
.
Покушај да измениш претходни програм и задатак решиш на овај начин. Твој програм треба роботу да каже следеће „Иди напред. Док има лоптица на пољу узимај лоптицу”.
Претходни садржај можеш погледати и у наредној видео-лекцији.
Гранање¶
Покупи лоптицу ако је има¶
Наредни лавиринт је зачаран. Сваки пут када се робот покрене, лоптице на три поља испред њега се наместе другачије. Напиши програм којим робот купи све лоптице.
Робот треба три пута да се помери напред и да са сваког поља на које
дође покупи лоптицу (ако на пољу има лоптица). Међутим, пре него што
покупи лоптицу он мора да провери да ли на том пољу уопште постоји
лоптица. Провера услова у програмском језику Python (а и у многим
другим програмским језицима) врши се наредбом if
, што на енглеском
језику значи ако.
Подсетимо се, помоћу услова ima_loptica_na_polju
испитујемо да ли
на пољу има лоптица. Претходним кодом смо роботу рекли „Ако на пољу
на ком стојиш има лоптица, онда узми лоптицу”, чиме постижемо да
Карел провери да ли на пољу има лоптица и да, ако их има, узме једну
лоптицу. Приметимо да је, слично као и код петљи, након услова
наведена двотачка, а да је наредба која се извршава ако је услов
испуњен мало увучена. То је обавезно и, ако то не испоштујеш, добићеш
поруку о грешци, веома сличну као и код петљи.
У зависности од тога да ли је услов који проверавамо испуњен, ток
програма се грана, па се наредба if
назива и наредба
гранања. Гранањем и наредбом if
ћемо се много детаљније бавити
у поглављу Гранање.
Дакле, да бисмо решили задатак, комбиноваћемо померање робота и наредбу гранања којом ћемо проверавати да ли на пољу постоји лоптица, пре него што је робот покупи.
Приметимо да се у претходном програму наредбе
понављају три пута и можемо употребити петљу for
да добијемо
једноставнији програм.
И наредни лавиринт је зачаран и његова дужина се мења сваки пут када се робот покрене, при чему се лоптице на пољима поново непредвидиво размештају. Напиши програм којим робот у оваквом лавиринту купи све лоптице.
Пошто у овом случају робот не зна колико пута треба да се помери
напред, употребићемо петљу while
и померати робота напред докле
год је то могуће.
Претходни садржај можеш погледати и у наредној видео-лекцији.
Узимање и остављање лоптица¶
Карел не зна где се налазе лоптице, а има задатак да три поља испред себе промени тако да узме лоптице са оних поља на којима се налазе и да их постави на она поља на којима се не налазе.
У ранијим програмима смо видели како робот може да иде три поља напред
и да узима лоптице на које наиђе. Потребно је да тај програм проширимо
тако да робот оставља лоптице на празна поља. Најлакши начин да се то
уради је да кажемо следеће: „Ако је на пољу лоптица, онда је узми, а у
супротном је остави”. То можемо остварити помоћу допуне наредби if
помоћу речи else
која значи у супротном тј. иначе.
Дакле, ако желимо да робот изврши неке наредбе ако је неки услов
испуњен, а неке друге ако тај услов није испуњен, користимо наредбу
if-else
. Иза речи if
наводи се услов, затим двотачка и затим
наредбе које ће се извршити ако услов јесте испуњен. Нако тога се
наводи реч else
поравната са речју if
, затим се наводи
двотачка, а наредбе које се извршавају ако услов наведен иза if
није испуњен, такође се увлаче.
Претходни садржај можеш погледати и у наредној видео-лекцији.
Кретање у круг¶
Покушај да решиш и наредни, мало тежи задатак.
Напиши програм којим се роботу наређује да се креће у круг око лавиринта и да покупи све лоптице на које наиђе.
Једна идеја за решење је да четири пута поновимо наредбе којима робот иде напред докле год може и купи све лоптице на које наиђе.
Још једна идеја за решење може биће следећа. Ако робот може да се помери напред, онда ћемо му рећи да се помери напред и нако тога ћемо му рећи да провери да ли се на пољу налази лоптица и да је узме. У супротном, ако робот не може да се помери напред, значи да је дошао до зида и тада ћемо му рећи да се окрене на лево. Све ово ћемо понављати у једној петљи (која ће се извршити 20 пута, што је тачно број корака који је потребан да би робот обишао цео круг). Покушај да наредни код допуниш тако да робот успешно покупи све лоптице.
Домаћи задатак¶
Лоптице на три стране¶
Помози роботу да покупи све лоптице. Пошто је лавиринт зачаран, мораћеш да употребиш петљу са провером услова.
Једно могуће решење (не и једино) је следеће.
Покупи лоптице до којих можеш да дођеш¶
Помози роботу да покупи све лоптице. Наравно, лавиринт је опет зачаран и распоред препрека и лоптица испред робота се мења приликом сваког покретања програма.
У сваком кораку робот треба да се помери напред, затим да се окрене за 90 степени (ка југу) и провери да ли је испред њега препрека. Ако нема препреке тј. ако може да иде напред, онда треба да оде напред, узме лоптицу, окрене се за 180 степени (ка северу), поново оде напред и окрене се за 90 степени (ка истоку). У супротном само треба да се окрене за 90 степени (ка истоку).
Једно могуће решење (не и једино) је следеће.