Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.97 KB | None | 0 0
  1. Напиши програм на основу којега ће робот доћи на поље (3, 3) и покупити лоптицу.
  2.  
  3. Да би дошао на жељено поље робот мора два пута да иде напред, да се окрене на лево, затим опет да иде два пута напред и на крају да покупи лоптицу. То му можемо наредити наредним програмом.
  4.  
  5.  
  6. 1
  7. from karel import *
  8. 2
  9. napred() # idi napred
  10. 3
  11. napred() # idi napred
  12. 4
  13. levo() # okreni se nalevo
  14. 5
  15. napred() # idi napred
  16. 6
  17. napred() # idi napred
  18. 7
  19. uzmi() # uzmi lopticu
  20. (Карел_на_поље_33)
  21.  
  22. Прва линија програма from karel import * је линија којом почињу сви програми за Карела - остави је таквом каква јесте. Након тога се роботу задаје једна по једна наредба, свака у посебном реду. Иза сваке наредбе роботу наведене су заграде (њих не смемо изоставити). Додатно, свака наредба мора бити у посебном реду и испред наредби не смеш писати размаке. Оваква правила називају се синтаксичка правила и ако се неко од њих не испоштује долази до синтаксичке грешке. Програм не сме садржати ни једну синтаксичку грешку да би исправно радио.
  23.  
  24. Текст иза знака # представља такозване коментаре. Робот тај текст не чита - написали смо га само да би теби било јасније шта која наредба значи.
  25.  
  26. У наредном програму има неколико синтаксичких грешака. Ако покушаш да га покренеш добићеш поруку
  27.  
  28. SyntaxError: bad input on line 4
  29. Примети да је грешка пријављена у линији 4 иако је грешка направљена већ у линији 3, где су изостављене заграде. Ово се често дешава, па када анализираш где је грешка настала, увек провери и линију испред оне која је у поруци о грешци наведена.
  30.  
  31. Исправи све синтаксичке грешке, па онда покрени програм.
  32.  
  33.  
  34. 1
  35. from karel import *
  36. 2
  37. napred()
  38. 3
  39. napred
  40. 4
  41. levo()
  42. 5
  43. napred)
  44. 6
  45. napred[]
  46. 7
  47. uzmi{}
  48. (Карел_на_поље_33_грешке)
  49.  
  50. У претходном програму је свака наредба Карелу била написана у посебној линији. Могуће је задати и више наредби у једној линији, али тада их је потребно раздвојити тачка-запетом (симболом ;).
  51.  
  52.  
  53. 1
  54. from karel import *
  55. 2
  56. napred(); napred(); levo(); napred(); napred(); uzmi()
  57. (Карел_на_поље_33_један_ред)
  58.  
  59. Решење у којем је свака наредба у посебној линији се ипак мало чешће користи (вероватно зато што се такав код лакше чита и мења, ако је то потребно).
  60.  
  61. Претходни садржај можеш погледати и у наредној видео-лекцији.
  62.  
  63.  
  64. Програмирање слагањем блокова
  65. Пошто претпостављамо да већ познајеш програмирање уз помоћ слагања блокова (на пример у програму MIT Scratch или на сајту code.org), омогућили смо ти да прве програме пишете на два начина: текстом у програмском језику Python или слагањем блокова. Сваки програм написан за робота Карела се може приказати и у облику блокова - довољно је да притиснеш дугме Blockly. Програм састављен од блокова можеш мењати и прилагођавати (можеш променити редослед блокова, додати нове блокове, обрисати неке блокове, променити вредности уписане у неке блокове и слично) и када завршиш дугметом Врати у Python које се налази у доњем десном углу прозора тај програм можеш добити написан у језику Python. Ускоро ћеш и сам/сама видети да је писање текста често бржи и ефикаснији начин креирања програма (зато сви професионални програмери своје програме пишу у текстуалним, а не у блоковским језицима), тако да те охрабрујемо да од самог почетка кренеш да програме уносиш куцањем текста у програмском језику Python, а да блокове користиш само као помоћно средство када се заглавиш.
  66.  
  67. Испробај ту могућност на примеру који смо мало пре видели, тако што ћеш коришћењем блокова додати наредбе која недостају, тако да робот дође до поља (3, 3) и покупи лоптицу.
  68.  
  69.  
  70. 1
  71. from karel import *
  72. 2
  73. napred() # idi napred
  74. 3
  75. napred() # idi napred
  76. 4
  77. napred() # idi napred
  78. 5
  79. napred() # idi napred
  80. (Карел_на_поље_33_Blockly)
  81.  
  82. Ако покренеш програм пре него што додаш наредбу да робот скрене, видећеш да ће доћи до грешке током извршавања твог програма. Наиме, у трећем кораку напред робот ће ударити у зид и добићеш поруку Робот је ударио у зид.
  83.  
  84. Коришћење блокова демонстрирано је и у наредној видео-лекцији.
  85.  
  86.  
  87. Пребаци лоптицу на поље (3, 5)
  88.  
  89. У овом задатку ћемо нашем роботу дати мало компликованији задатак. Потребно је дође до поља (4, 3) на којем се налази једна лоптица, а затим да ту лоптицу пребаци у рупу на пољу (3, 5).
  90.  
  91. Допуни наредни програм тако да робот изврши дати задатак.
  92.  
  93.  
  94. 1
  95. from karel import *
  96. 2
  97. napred()
  98. 3
  99. napred()
  100. 4
  101. levo()
  102. 5
  103. napred()
  104. 6
  105. napred()
  106. 7
  107. desno()
  108. 8
  109. napred()
  110. 9
  111. uzmi()
  112. 10
  113. ??? # dodaj naredbe koje nedostaju ovde
  114. 11
  115. ostavi()
  116. (Карел_пребаци_лоптицу)
  117.  
  118. Ако користиш блокове, на месту на ком треба да додаш нове наредбе добићеш један велики зелени блок који треба да избациш (на пример, да га превучеш до канте за смеће) и да га замениш одговарајућим наредбама. Наравно, покушај задатак да решиш као прави профи-програмер: писањем програмског кода, а не слагањем блокова!
  119.  
  120. Пребаци обе лоптице у рупу
  121.  
  122. У овом задатку робот Карел има задатак да покупи обе лоптице и пребаци их у рупу (на њој пише колико лоптица треба да оставиш у рупу).
  123.  
  124. Помози сада роботу тако што ћеш попунити недостајућа места у коду.
  125.  
  126.  
  127. 1
  128. from karel import *
  129. 2
  130. desno(); napred(); napred(); # idi do prve loptice
  131. 3
  132. uzmi(); # uzmi je
  133. 4
  134. ??? # idi do rupe
  135. 5
  136. ostavi(); # ostavi lopticu
  137. 6
  138. ??? # idi do druge loptice
  139. 7
  140. ??? # uzmi je
  141. 8
  142. desno(); desno(); napred(); desno(); napred(); # idi do žutog polja
  143. 9
  144. ostavi() # ostavi lopticu
  145. (Карел_пребаци_две_лоптице_1)
  146.  
  147. Понављање - бројачка петља for
  148. Често робот исту наредбу треба да понови више пута. Да би се такви програми могли једноставније писати је коришћење петљи.
  149.  
  150. Иди 8 поља напред
  151.  
  152. У наредном лавиринту постоји 8 поља испред робота. Коришћењем петље учини да робот дође до лоптице и да је затим покупи.
  153.  
  154. Један начин да решимо задатак је да роботу 8 пута задамо наредбу да иде напред и затим наредбу да покупи лоптицу.
  155.  
  156.  
  157. 1
  158. from karel import *
  159. 2
  160. napred()
  161. 3
  162. napred()
  163. 4
  164. napred()
  165. 5
  166. napred()
  167. 6
  168. napred()
  169. 7
  170. napred()
  171. 8
  172. napred()
  173. 9
  174. napred()
  175. 10
  176. uzmi()
  177. (Карел_8_поља_напред)
  178.  
  179. Замислимо колико би досадно било куцати десет или сто пута наредбу да робот иде напред, када би лавиринт био већи. Пошто се у програмима често јавља потреба да се неке наредбе понављају, сви програмски језици обезбеђују начин да се то постигне. У програмском језику Python, који наш робот Карел разуме, понављање се постиже коришћење наредбе for. Понављања у програмима се називају циклуси или петље (по чему је наша фондација „Петља” добила име). Погледајмо како се претходни програм може скратити употребом петље for.
  180.  
  181.  
  182. 1
  183. from karel import *
  184. 2
  185. for i in range(8):
  186. 3
  187. napred()
  188. 4
  189. uzmi()
  190. (Карел_8_поља_напред_for)
  191.  
  192. Овде смо употребили петљу for i in range(n): која је уобичајени начин да се изрази да се наредбе наведене у телу петље извршавају n пута (ми смо уместо n навели 8, чиме смо постигли то да се наредба napred() изврши 8 пута). Овим смо дакле рекли „Понови пет пута корак напред”. Уместо i смо могли употребити и неко друго слово или реч (или знак _).
  193.  
  194. Наредбе које се понављају (за њих се каже да чине тело петље) се обавезно морају увући у односу на наредбу for (обично помоћу неколико размака, најчешће 4, или једног табулатора тј. карактера Tab који се на тастатурама налази лево од тастера Q). Када се петља заврши, извршава се наредба која је наведена иза петље и то поравната са речју for (у претходном програму то је наредба uzmi()). Наредба uzmi() након петље for није увучена, што значи да се она извршава само једном и то када се заврши извршавање петље for тј. када се њено тело изврши одговарајући број пута. Када би она била увучена и она би се понављала.
  195.  
  196. Неке честе грешке
  197. Нагласимо да се на крају линије у којој се употребљава наредба for обавезно ставља двотачка (симбол :). Ако се она не наведе добићеш поруку о грешци
  198.  
  199. SyntaxError: bad input on line ???
  200. Ово значи Синтаксичка грешка: лош унос на линији ??? - број линије ти може указати на то где је грешка направљена (немој да заборавиш да провериш и линију изнад те). Јако честа грешка програмера-почетника је да забораве двотачку на крају наредбе for - обрати пажњу на тај важан детаљ.
  201.  
  202. Ако заборавиш да увучеш тело петље, поново ћеш добити поруку
  203.  
  204. SyntaxError: bad input on line ???
  205. Још једна грешка која може наступити услед неодговарајућег увлачења наредби је и
  206.  
  207. IndentationError: unindent does not match any outer indentation level on line ???
  208. На енглеском језику IndentationError значи Грешка у увлачењу.
  209.  
  210. У складу са претходном дискусијом, исправи наредни програм.
  211.  
  212.  
  213. 1
  214. from karel import *
  215. 2
  216. for i in range(8)
  217. 3
  218. napred()
  219. 4
  220. uzmi()
  221. (Карел_8_поља_напред_for_грешке)
  222.  
  223. Петљама ћемо се много детаљније бавити у поглављу Понављање.
  224.  
  225. Иди 7 поља напред
  226. Пробај сада сам/сама да допуниш наредни програм тако да робот покупи лоптицу. Не заборави да се пре петље окрене у правом смеру.
  227.  
  228.  
  229. 1
  230. from karel import *
  231. (Карел_7_поља_напред)
  232.  
  233. Покупи 10 лоптица
  234.  
  235. Испред робота се налази 10 лоптица. Напиши програм којим робот купи све те лоптице.
  236.  
  237.  
  238. 1
  239. from karel import *
  240. (Карел_покупи_10_лоптица)
  241.  
  242. Савет: употреби поново петљу for да се иста наредба не би понављала пуно пута.
  243.  
  244. Покупи пет лоптица на пет поља испред
  245.  
  246. Напиши програм у којем робот купи лоптице на пет поља испред себе.
  247.  
  248.  
  249. 1
  250. from karel import *
  251. 2
  252. for i in range(5):
  253. 3
  254. napred()
  255. 4
  256. uzmi()
  257. (Карел_покупи_5_лоптица_на_5_поља_испред)
  258.  
  259. Приметимо да су у овом програму две наредбе робота понављале пет пута (наредба napred() и наредба uzmi()) и да су обе биле увучене по 4 карактера. Пробај сада да наредиш роботу да се врати на почетно поље када покупи лоптице.
  260.  
  261.  
  262. 1
  263. from karel import *
  264. 2
  265. for i in range(5):
  266. 3
  267. napred()
  268. 4
  269. uzmi()
  270. 5
  271. ??? # dopuni ovde kod
  272. (Карел_покупи_5_лоптица_на_5_поља_испред_и_врати_се)
  273.  
  274. На крају, модификуј програм тако да робот док се враћа оставља по једну лопту на сваком пољу, тако да распоред лоптица буде исти као и на почетку.
  275.  
  276.  
  277. 1
  278. from karel import *
  279. 2
  280. for i in range(5):
  281. 3
  282. napred()
  283. 4
  284. uzmi()
  285. 5
  286. ??? # dopuni ovde kod
  287. (Карел_покупи_5_лоптица_на_5_поља_испред_и_врати_се_остављајући_лоптице)
  288.  
  289. Претходни садржај можеш погледати и у наредној видео-лекцији.
  290.  
  291.  
  292. Покупи по три лоптице на пет поља испред
  293.  
  294. На сваком од пет поља испред робота налазе се по три лоптице. Напиши програм на основу којег робот купи све те лоптице.
  295.  
  296.  
  297. 1
  298. from karel import *
  299. 2
  300. for i in range(5):
  301. 3
  302. napred()
  303. 4
  304. for j in range(3):
  305. 5
  306. uzmi()
  307. (Карел_покупи_по_3_лоптице_на_5_поља_испред)
  308.  
  309. Приметимо да се у претходном програму петља for налази у телу петље for. Такве се петље називају угнежђене петље. Приметимо да смо у њима морали употребити различита слова (у спољној смо употребили i, а у унутрашњој j). Више детаља о овоме биће у наредним поглављима.
  310.  
  311. Претходни садржај можеш погледати и у наредној видео-лекцији.
  312.  
  313.  
  314. Домаћи задатак
  315. Пребаци обе лоптице у рупу
  316.  
  317. Задатак је исти као мало пре, једино се лавиринт мало променио. Потребно је да робот пребаци обе лоптице у рупу.
  318.  
  319.  
  320. 1
  321. from karel import *
  322. 2
  323. ??? # idi do prve loptice i uzmi je
  324. 3
  325. ??? # idi do druge loptice i uzmi je
  326. 4
  327. ??? # idi do rupe i ostavi obe loptice
  328. (Карел_пребаци_две_лоптице_2)
  329.  
  330. Размакнуте лоптице
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement