Нека съкратим още програмите

Да се върнем към последната програма от предишния урок. Карел трябваше да вземе по пет топки от всеки от трите квадрати в него.

../_images/nested_for_3x5.png

Програмата, която решава задачата, може да изглежда така:

Виждаме, че в тази програма следната група оператори се повтаря три пъти:

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

Nested for цикли

Когато в тялото на един цикъл има втори цикъл, тогава първият цикъл се нарича външен цикъл, а другият се нарича вътрешен цикъл. Заедно ги наричаме вложени или вмъкнати цикли. В следващия пример ще видим как се пишат вложени for цикли.

Вземете пет топки три пъти

Пред Карел има три полета, а на всеки от тях има 5 топки. Карел трябва да вземе всичките топки.

Задачата се повтаря, но сега ще я решим по различен начин.

Споменахме, че i в предходните примери служи брояч на повторения. Сега за първи път трябва да броим други неща (топки) по време на броенето на едно нещо (полета). Това означава например, че ще трябва да знаем точно кога сме на третото поле, като вземем втората топка. Следователно не можем да използваме едно и също име и за двата брояча, затова сме въвели нови имена за броячи вместо предишните i. В следната програма наричаме брояча на полетата i_square, а името на брояча на топката е i_ball.

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_for_TakeMxN)

В даденото решение, операторът pick_ball () е допълнително отразен, тъй като се изпълнява такива за всеки i_ball от диапазона [0, 1, 2, 3, 4]. В допълнение, целия statement за i_ball в диапазон (5): (заедно с неговото тяло и оператора се движат () над него), се повтаря 3 пъти, по един за всеки i_square от обхвата [0, 1, 2]. Това означава, че командата pick_ball () изпълнява общо 3 х 5 = 15 пъти (на всеки от трите полета пет пъти). .. infonote:: С вложени цикли е необходимо да се обърне допълнително внимание на правилното отстъпване на операторите, защото става малко по-сложно. Неправилното отстъпване на някои команди може да доведе до грешен резултат или до програма, която изобщо не работи.

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

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.

(Karel_for_every_nth_square_5)

Мини напред

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

Външният цикъл трябва да бъде изпълнен 3 пъти, а в него 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_for_ring)

We’ve made verbal instructions a little more similar to the program, try converting them into statements. If you still want to see the program itself, click the “Solution” button.

Върви и вземи по 3 топки всеки път

Напишете програма, чрез която Карел ще вземе всичките 18 топки.

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

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_for_ring_3)

Again, we give instructions which look like a program (this time without the program itself).