Създайте серия от оператори

Нека си припомним задачата Вземете топката на съседното поле. Задачата беше, че във всяка посока Карел трябваше да се опита да отиде до съседното поле и (ако можеше да отиде до съседния площад), за да опита да вземе топката там. За да улесним пробването на следващата посока, избрахме да връщаме Карел на началния квадрат след всеки опит.

Една програма, която решава тази задача, е:

TЧастта от програмата от седмия до единадесетия ред изглежда малко по-трудна за следване. В тази част може да се наложи да си представите какво ще направи Карел, за да разберете напълно какво се случва там.

Коментарите донякъде помагат за по-лесното разбиране на тази част от програмата. В допълнение към коментарите, ще бъде още по-добре, ако има функция back(), която ще премести Карел крачка назад. Тогава програмата ще бъде по-кратка и по-разбираема:

Функцията back () не е част от библиотеката на Karel, но много лесно можем сами да напишем тази функция. Когато приключите, ще можем да използваме функцията back () еднакво с другите функции на библиотеката Karel, като например move () или turn_right ().

Как се пишат функции

Засега ще научим само най-простия начин за писане на функция в Python, а други, по-сложни форми ще видим по-късно.

WКогато пишете някоя функция в Python, думата def в началото, скобите () и двоеточие: в края на първия ред са задължителни. За име на функция можем да използваме всяко правилно написано име, което сме избрали. Следващите оператори се пишат по-навътре и те формират тялото на функцията (ако повече от една команда е написана на ред, тогава тези команди са разделени с точка и запетая;). Операторите във функционалното тяло ще се изпълняват всеки път, когато името на функцията се срещне при изпълнение на програмата, тоест когато се извиква тази функция.

В съответствие с тези правила, функцията back () може да бъде написана, както следва:

Тогава цялата програма ще изглежда така:

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.

(Karel_functions__take_neighboring_ball_final)

Когато извлечем някои оператори (които имат значение като група) във функция, можем да напишем програми, които са по-кратки и ясни, защото сме разделили проблема на по-малко сложни части.

Друго предимство на функциите за писане е, че лесно можем да ги използваме в други програми (тук понякога ще копираме предварително написани функции, но в реалното програмиране има по-добър и по-прост начин за повторно използване на веднъж написани функции).

Излизане от функцията или цикъла преди края

В задачата да търсим топката на съседно поле, в името на простотата на програмата, решихме, че дори когато Карел намери топка, той продължава да търси в останалите посоки. Има начин да се избегне това ненужно изпълнение на останалите оператори.

Когато искаме да прекъснем изпълнението на цикъла, пишем специален оператор break за прекъсване. Ефектът е да изскочите от цикъла и да продължите изпълнението на програмата от първия оператор след цикъла.

Използвайки break, ще изскочим от най-близкия (най-тесен) for или while цикъл, съдържащ декларацията за почивка. Ако операторът за прекъсване е разположен в две или повече вложени цикли, изпълнението продължава с оператора, който следва най-вътрешния (най-тесен) цикъл.

Използвайки break, бихме могли да модифицираме основната част на програмата:

във:

По този начин цикълът завършва веднага щом топката бъде намерена и взета. Тъй като няма други операции след този цикъл, в този случай чрез изпълнение на break, работата на програмата завършва.


Подобно на излизането от цикъла, ние също можем да излезем от функцията, преди да се изпълнят всички нейни оператори.

Когато искаме да прекъснем изпълнението на функция, пишем специален оператор return. Ефектът на оператора return е да излезете от функцията и да продължите изпълнението на програмата от първият оператор след мястото, от което е извикана функцията.

С return излизаме от функцията, без значение колко цикъла има около оператора за връщане вътре във функцията.

Можем да превърнем програмата за вземане на топката от съседното поле във функция. В този случай можем да напишем:

Задачи за упражнение

Оставяйте топките, докато има, както топки, така и квадратчета

Първоначално Карел има няколко топки и трябва да ги подреди по пътеката по една за всяко поле (започвайки от това, на което стои), доколкото е възможно. Карел спира да поставя топки, когато удари препятствие или когато му свършат топките (каето се случи първо). Няма значение дали Карел ще спре на последния запълнен квадрат или на първия празен квадрат.

Съвет: Поставете едно от тези две условия в while цикъл, така цикълът приключва, когато условието вече не е изпълнено. Освен това, използвайте оператора break за излизане от цикъла, ако другото условие не е изпълнено.

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.

(Karel_functions__put_balls_until_wall_or_no_more_balls)

Преместете всички топки един квадрат назад

Пред Карел има пътека с неизвестна дължина. В стартовия квадрат няма топки. Карел трябва да измести всяка топка по един квадрат на запад.

Можете да разрешите тази задача, като повторите следните стъпки, стига да има квадратчета пред Карел:

  • отидете на следващия квадрат

  • вземете всички топчета от този квадрат

  • отидете крачка назад (тоест, обърнете се и отидете една стъпка напред)

  • пуснете всички топчета

  • върнете се на квадрата, от който сте взели топките

По този начин можете да използвате написаната по-рано функцията, която разгледахме по-рано, за да се върнете към квадрата, към който Карел движи топките. Просто трябва да го копирате (или да го въведете отново) в областта за вашето решение.

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.

(Karel_functions__all_balls_one_square_back)

Следвайте топките

Всеки квадрат съдържа една топка или нито една. Квадратите с топките върху тях образуват пътека, която започва на площада до Карел. Карел трябва да следва този път и да вземе всички топки.

Съвет: За да решите тази задача, можете да напишете функцията go_to_neighboring_nonempty_square (), която трябва само да премести Karell до съседния квадрат, който има топка върху него (return би бил полезен там). Функцията go_to_neighboring_nonempty_square () трябва да се различава от написаната по-рано функция take_at_neighboring_square () само в смисъл, че не взема топката.

Когато Карел събере всички топки, следващият призив на тази функция ще го постави на празен квадрат (между другото, това ще бъде квадратът, където Карел взе последната топка). Когато на площада, на който е Карел, няма топка, това ще означава, че Карел вече е взел всички топчета.

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.

(Karel_functions__follow_the_balls)

Вземете всички топчета от цялата маса

Карел първоначално е обърнат на север (нагоре) и е разположен в долния ляв ъгъл на правоъгълна маса с неизвестни размери, без вътрешни стени. На всеки квадрат може да има произволен брой топки. Карел трябва да вземе всички топчета от всички квадратчета на дъската.

Съвет: Напишете функция empty_one_row(), която кара Karel да:

  • завийте наляво (на изток), като погледнете по реда, в който се намира

  • преминете през целия ред и вземете всички топки от всеки квадрат в този ред, включително квадрата, на който е започнал

  • обърнете се към началото на реда (т.е. на запад)

  • върнете се в началото на реда и завийте на север (нагоре), както той застана преди повикването на функцията

Програмата, която решава задачата с помощта на тази функция, не е дълга. Трябва да направи следното:

  • изпразнете първия ред

  • докато има редове пред Карел, отидете на следващия и го изпразнете

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.

(Karel_functions_take_all_balls_2D)