Prijavi problem


Obeleži sve katergorije koje odgovaraju problemu

Jos 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.

Programiranje u Pajtonu, priručnik za šesti razred

Робот Карел

Хајде на почетку мало да се играмо тако да кроз игру научимо неке основне појмове програмирања. Одличан начин за то је писање програма за робота који се зове Карел (по чешком писцу Карелу Чапеку који је измислио реч робот). Робот Карел се налази у лавиринту и разуме наредне наредбе

  • napred() - помери се једно поље напред,
  • levo() - окрени се 90 степени налево (у смеру супротном казаљки на сату),
  • desno() - окрени се 90 степени надесно (у смеру казаљке на сату),
  • uzmi() - покупи лоптицу са поља на којем се налазиш,
  • ostavi() - спусти лоптицу на поље на којем се налазиш,
  • moze_napred() - проверава да робот може да се помери напред (да ли испред њега постоји зид),
  • broj_loptica_na_polju() - враћа број лоптица на пољу на ком се робот налази,
  • ima_loptica_na_polju() - проверава да ли на пољу на ком се робот налази има лоптица,
  • broj_loptica_kod_sebe() - враћа број лоптица које робот тренутно има код себе,
  • ima_loptica_kod_sebe() - проверава да ли робот тренутно има лоптица код себе.

Робот Карел разуме и програмски језик Python и програмирајући га научићемо неколико основних наредби тог језика. Испрограмирали смо га тако да ради унутар прегледача веба и не мораш ништа додатно да инсталираш да би писао програме за Карела.

Линијски програми

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

Иди до лоптице и узми је

Напиши програм на основу којега ће робот доћи на поље (3, 3) и покупити лоптицу.

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

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.

(Карел_на_поље_33)

Прва линија програма from karel import * је линија којом почињу сви програми за Карела - остави је таквом каква јесте. Након тога се роботу задаје једна по једна наредба, свака у посебном реду. Иза сваке наредбе роботу наведене су заграде (њих не смемо изоставити). Додатно, свака наредба мора бити у посебном реду и испред наредби не смеш писати размаке. Оваква правила називају се синтаксичка правила и ако се неко од њих не испоштује долази до синтаксичке грешке. Програм не сме садржати ни једну синтаксичку грешку да би исправно радио.

Текст иза знака # представља такозване коментаре. Робот тај текст не чита - написали смо га само да би теби било јасније шта која наредба значи.

У наредном програму има неколико синтаксичких грешака. Исправи их.

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.

(Карел_на_поље_33_грешке)

У претходном програму је свака наредба Карелу била написана у посебној линији. Могуће је задати и више наредби у једној линији, али тада их је потребно раздвојити тачка-запетом (симболом ;).

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.

(Карел_на_поље_33_један_ред)

Решење у којем је свака наредба у посебној линији се ипак мало чешће користи (вероватно зато што се такав код лакше чита и мења, ако је то потребно).

Програмирање слагањем блокова

Пошто претпостављамо да већ познајеш програмирање уз помоћ слагања блокова (на пример у програму MIT Scratch или на сајту code.org), омогућили смо ти да прве програме пишете на два начина: текстом у програмском језику Python или слагањем блокова. Сваки програм написан за робота Карела се може приказати и у облику блокова - довољно је да притиснеш дугме Blockly. Програм састављен од блокова можеш мењати и прилагођавати (можеш променити редослед блокова, додати нове блокове, обрисати неке блокове, променити вредности уписане у неке блокове и слично) и када завршиш дугметом Врати у Python које се налази у доњем десном углу прозора тај програм можеш добити написан у језику Python. Ускоро ћеш и сам/сама видети да је писање текста често бржи и ефикаснији начин креирања програма (зато сви професионални програмери своје програме пишу у текстуалним, а не у блоковским језицима), тако да те охрабрујемо да од самог почетка кренеш да програме уносиш куцањем текста у програмском језику Python, а да блокове користиш само као помоћно средство када се заглавиш.

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

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.

(Карел_на_поље_33_Blockly)

Ако покренеш програм пре него што додаш наредбу да робот скрене, видећеш да ће доћи до грешке током извршавања твог програма. Наиме, у трећем кораку напред робот ће ударити у зид и добићеш поруку да се слупао (Crashed on line ???).

Пребаци лоптицу на поље (3, 5)

У овом задатку ћемо нашем роботу дати мало компликованији задатак. Потребно је дође до поља (4, 3) на којем се налази једна лоптица, а затим да ту лоптицу пребаци у рупу на пољу (3, 5).

Допуни наредни програм тако да робот изврши дати задатак.

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.

(Карел_пребаци_две_лоптице_1)

Пребаци обе лоптице у рупу

Задатак је исти као мало пре, једино се лавиринт мало променио. Потребно је да робот пребаци обе лоптице у рупу.

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)

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

Понављање

Иди 5 поља напред

У наредном лавиринту постоји 5 поља испред робота. Коришћењем петље учини да робот дође до лоптице и да је затим покупи.

Један начин да решимо задатак је да роботу 5 пута задамо наредбу да иде напред и затим наредбу да покупи лоптицу.

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.

(Карел_5_поља_напред)

Замислимо колико би досадно било куцати десет или сто пута наредбу да робот иде напред, када би лавиринт био већи. Пошто се у програмима често јавља потреба да се неке наредбе понављају, сви програмски језици обезбеђују начин да се то постигне. У програмском језику Python, који наш робот Карел разуме, понављање се постиже коришћење наредбе for. Понављања у програмима се називају циклуси или петље (по чему је наша фондација „Петља” добила име). Погледајмо како се претходни програм може скратити употребом петље 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.

(Карел_5_поља_напред_for)

Овде смо употребили петљу for i in range(n): која је уобичајени начин да се изрази да се наредбе наведене у телу петље извршавају n пута (ми смо уместо n навели 5, чиме смо постигли то да се наредба napred() изврши 5 пута). Овим смо дакле рекли „Понови пет пута корак напред”. Уместо i смо могли употребити и неко друго слово или реч (или знак _).

Нагласимо да се на крају линије у којој се употребљава наредба for обавезно ставља двотачка (симбол :). Ако се она не наведе добићеш поруку о грешци SyntaxError: bad input on line ???, што значи Синтаксичка грешка: лош унос на линији ??? - број линије ти може указати на то где је грешка направљена. Јако честа грешка програмера-почетника је да забораве двотачку - обрати пажњу на тај важан детаљ.

Наредбе које се понављају (за њих се каже да чине тело петље) се обавезно морају увући у односу на наредбу for (обично помоћу неколико размака, најчешће 4, или једног табулатора тј. карактера Tab који се на тастатурама налази лево од тастера Q). Када се петља заврши, извршава се наредба која је наведена иза петље и то поравната са речју for (у претходном програму то је наредба uzmi()). Ако заборавиш да увучеш тело петље, поново ћеш добити поруку SyntaxError: bad input on line ???. Још једна грешка која може наступити услед неодговарајућег увлачења наредби је и IndentationError: unindent does not match any outer indentation level on line ???. На енглеском језику IndentationError значи Грешка у увлачењу. Наредба uzmi() након петље for није увучена, што значи да се она извршава само једном и то када се заврши извршавање петље 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.

(Карел_5_поља_напред_for_грешке)

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

Иди 7 поља напред

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

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.

(Карел_7_поља_напред)

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

Покупи 10 лоптица

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

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.

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

Савет: употреби поново петљу 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.

(Карел_покупи_5_лоптица_на_5_поља_испред)

Приметимо да су у овом програму две наредбе робота понављале пет пута (наредба napred() и наредба uzmi()) и да су обе биле увучене по 4 карактера. Пробај сада да наредиш роботу да се врати на почетно поље када покупи лоптице.

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.

(Карел_покупи_5_лоптица_на_5_поља_испред_и_врати_се)

Покупи по три лоптице на пет поља испред

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

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.

(Карел_покупи_по_3_лоптице_на_5_поља_испред)

Приметимо да се у претходном програму петља for налази у телу петље for. Такве се петље називају угнежђене петље. Приметимо да смо у њима морали употребити различита слова (у спољној смо употребили i, а у унутрашњој j). Више детаља о овоме биће у наредним поглављима.

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

Наредни лавиринт је зачаран и не зна се колико тачно поља постоји између робота и лоптице. Напиши програм тако да робот и у таквом лавиринту увек стиже до лоптице и узима је. Подсећам те да помоћу 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() - функција која враћа тачно (true) ако се на пољу на којем се робот налази налазе и лоптице (једна или више њих).

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

Гранање

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

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

Робот треба три пута да се помери напред и да са сваког поља на које дође покупи лоптицу (ако на пољу има лоптица). Међутим, пре него што покупи лоптицу он мора да провери да ли на том пољу уопште постоји лоптица. Провера услова у програмском језику 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)

Неколико задатака за вежбу можеш наћи овде.