Још краћи програми

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

../_images/nested_for_3x5.png

Програм који решава задатак могао је да изгледа овако:

Видимо да се у овом програму следећа група наредби понавља три пута:

То нам омогућава да додатно скратимо програм. При објашњавању for наредбе смо поменули да у телу петље могу да се нађу друге петље. Сада имамо прилику да то искористимо.

Угнежђене for наредбе

Када се у телу једне петље налази друга петља, онда прву петљу зовемо спољна петља, а другу унутрашња. Заједно их зовемо угнежђене или уметнуте петље. У следећем примеру ћемо видети како се пишу угнежђене for наредбе.

Покупи три пута по 5 лоптица

Испред Карела су три поља, а на њима по 5 лоптица. Карел треба да покупи све лоптице.

Задатак је поновљен, али сада ћемо га решити на другачији начин.

Раније смо поменули да је са i у досадашњим примерима for наредбе именовано место на коме бројимо докле смо стигли са понављањем. Сада први пут треба да у току бројања једне ствари (поља) пребројимо другу ствар (лоптице). То значи да ће на пример бити потребно да знамо када смо на трећем пољу при другој лоптици. Због тога не можемо да користимо исто име за оба бројача, па смо уместо досадашњег i увели нова имена за бројаче. У програму који следи бројач поља смо назвали i_polje, а за бројач лоптица i_loptica.

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)

У датом решењу наредба uzmi() је додатно увучена, јер се она извршава по једном за свако i_loptica из опсега [0, 1, 2, 3, 4]. Осим тога, цела наредба for i_loptica in range(5): се (уз наредбу napred(), заједно са својим телом) понавља 3 пута, по једном за свако i_polje из опсега [0, 1, 2]. То значи да се наредба uzmi() извршава укупно 3 x 5 = 15 пута (на сваком од три поља по пет пута).

Код уметнутих петљи је потребно додатно пазити на правилно увлачење наредби, јер оно постаје нешто мало компликованије. Погрешно увлачење појединих наредби може да доведе до погрешног резултата, или до програма који уопште не ради.

Задаци за вежбу

Прескок

Испред Карела је на сваком трећем пољу по једна лоптица, а он треба да их обе покупи.

Карел треба да понови 2 пута групу наредби: „три пута иди напред, а затим узми лоптицу”.

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

Испред Карела је на сваком трећем пољу по пет лоптица, а он треба да их све покупи.

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

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 пута, а у њој Карел треба да уради следеће:

  • Два пута понови кораке: „иди напред” и „узми лоптицу”

  • Окрени се лево

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 лоптице

Напишите програм помоћу кога ће Карел да покупи свих 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)

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