Понављање

Понављање наредби дати број пута

Размислимо како бисмо написали програм који десет пута исписује Zdravo. На основу онога што смо до сада научили можемо десет пута навести наредбу print("Zdravo").

Приметимо да је овај програм било напорно откуцати (чак иако смо користили технику копирања и лепљења). Ако сада замислимо да желимо да корисник прво унесе број колико пута жели да се испише поздрав, тада је јасно да тај програм не можемо испрограмирати на овај начин, већ су нам потребне мало напредније технике програмирања. Решење долази у облику петљи, тј. наредби које омогућавају да се нека наредба или неки блок наредби понове више пута. За почетак размотримо наредбу којом постижемо да се нешто понови дати број пута. Најједноставнији начин да то урадимо је да употребимо наредни облик програма.

Овде смо употребили петљу for i in range(n): која је уобичајени начин да се изрази да се наредбе наведене у телу петље извршавају n пута. Нагласимо да се на крају линије у којој се употребљава наредба for обавезно ставља симбол :, као и то да се наредбе које се понављају (за њих се каже да чине тело петље) обавезно морају увући у односу на наредбу for (обично неколико размака или један табулатор тј. карактер Tab). Када се петља заврши, извршава се наредба која је наведена иза петље и то поравната са речју for. На пример,

Увежбајмо овај облик понављања кроз још неколико једноставних примера.

Обими 5 троуглова

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

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

Поздрави сваког ученика

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

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

Бројачке променљиве

Током извршавања петље облика for i in range(n): променљива i редом узима вредности 0, 1, 2 итд., све до вредности n-1. На пример, ако је n једнако 3, тада ће се тело петље извршити пет пута и у првом извршавању тела петље променљива i ће имати вредност 0, у другом вредност 1, а у трећем вредност 2.

Испис бројева од 0 до 9

Употреби петљу да би се исписали бројеви од 0 до 9.

Испис бројева од a до b

Када се у позиву функције range наведе само један аргумент, онда бројање креће од нуле, међутим, када се наведу два аргумента a и b, тада бројање креће од a и завршава се са b-1.

Напиши програм који учитава два броја a и b и затим исписује све бројеве од a до b (укључујући и њих).

Игра жмурке

Ако се у позиву функције range наведу три аргумента, трећи од њих одређује корак за који се у сваком кораку петље врши увећавање бројачке променљиве. На пример, range(1, 10, 2) означава да бројачка променљива креће од 1 и да се у сваком кораку увећава за 2, све док је строго мања од 10 тј. да редом узима вредности 1, 3, 5, 7 и 9.

У игри жмурке деца броје 5, 10, 15, итд., до 100. Напиши програм који исписује баш те бројеве.

Аларм који звони на сваких 10 минута

Сат је навијен тако да између 8:00 и 10:30 звони на сваких 10 минута. Напиши програм који исписује времена у којима сат звони.

Задатак је много једноставније реализовати ако време представимо само помоћу минута. Зато дефинишемо функције конверзије сати и минута у минуте и минута у сате и минуте.

Измена вредности променљиве у петљи

Једна од најчешћих употреба измене вредности променљивих је у петљама. Размотримо следећи проблем.

Пшеница на шаховској табли

Легенда каже да је изумитељ игре шах од свог владара тражио да га награди тако што ће на прво поље шаховске табле ставити једно зрно пшенице, на друго два зрна, на треће четири и тако даље, стављајући на свако поље дупло више зрна пшенице него на претходно. Владар се насмејао како је малу награду изумитељ тражио, међутим, када је кренуо да броји зрна, брзо је схватио да у целом краљевству нема довољно пшенице да би исплатио награду. Напиши програм који исписује колико на сваком од поља има зрна пшенице, као и колико је укупно пшенице на целој табли.

_images/wheat_chessboard.jpg

Током рада програма одржаваћемо променљиву која чува број зрна на тренутном пољу (њена вредност креће од 1 и у сваком кораку се увећава за 2) и укупан број зрна на пољима до тог (њена вредност креће од 0 и у сваком кораку се увећава за број зрна на текућем пољу). Тело петље у којем се исписује број зрна на текућем пољу и у којој се ажурирају вредности променљивих (израчунава се њихова нова вредност) поновићемо 64 пута.

Обавезно изврши овај програм корак по корак и посматрај како се у сваком кораку петље мењају вредности променљивих.

Више речи о алгоритмима овог типа биће у поглављу о основним алгоритмима.

Пролазак кроз листу

Петља for ... in ... : се може употребити и да се проће кроз све елементе неке дате листе. На пример, ако је l листа, тада for i in l: проузрокује да променљива i узима редом елементе листе l, по један у сваком кораку. Илуструјмо то следећим примером.

Оперативни системи

Дата је листа у којој се налази списак неколико оперативних система. Исписаћемо све елементе ове листе (сваки у посебној линији).

Други начин је да употребимо бројачку променљиву и да елементима листе приступамо на основу индекса. На тај начин уз сваки систем можемо исписати и његов редни број. Бројачка променљива узима редом вредности од 0, па све до броја који је за један мањи од дужине листе. Ако редни бројеви иду од 1 па до дужине листе, редни број је у сваком кораку за један већи од вредности бројачке променљиве.

Пролазак кроз листу парова

У петљи можемо проћи и кроз све елементе листе парова.

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

Формирајмо прво списак неколико научника.

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

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

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

Годишња доба

Годишња доба се понављају у круг: пролеће, лето, јесен, зима, пролеће, лето, јесен, зима и тако даље. Напиши програм који исписује смене годишњих доба током пет година.

Ако су имена годишњих доба написана у јендој листи, тада је потребно исписивати редом елементе на позицијама 0, 1, 2, 3, затим опет 0, 1, 2, 3 и тако даље. Ако направимо петљу у којој ће бројачка променљива узимати редом вредности од 0 до 19 (то је 20 годишњих доба која се смењују током пет година), тада се серија бројева 0, 1, 2, 3, 0, 1, 2, 3, … може добити тако што се узимају остаци при дељењу са 4 бројева од 0 до 19. Имајући ово у виду, исправи наредни програм.

Пролазак кроз ниску

Већ смо видели да се у многим случајевима ниска може користити веома слично као листа карактера. У том светлу, могуће је у петљи проћи кроз све карактере ниске.

Свако слово у посебном реду

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

Пролазак кроз речник

Још једна структура података кроз чије елементе је могуће проћи коришћењем петље облика for ... in ... : је речник.

Површине земаља

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

Исписаћемо једну по једну земљу и њену површину.

У претходном програму променљива zemlja редом узима вредности назива земаља (кључева у датом речнику).

Још један користан начин да се прође кроз елементе речника је да се употреби метода items() кроз чији се резултат може проћи на исти начин којим се пролази кроз све елементе листе парова.

Условна петља

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

И петљу while можемо употребити да прођемо кроз серију правилно размакнутих бројева. Урадимо поново задатак са игром жмурке.

Жмурке - петља while

Приметимо да се у телу петље крије наредба broj = broj + 5 која проузрокује да се вредност променљиве broj промени тако што се њена текућа вредност увећа за пет (о промени вредности променљиве и наредбама овог облика више је речено у поглављу о променама вредности променљивих).

Петљу while употребљавамо када не знамо унаред колико пута треба извршити тело неке петље.

Цифре броја

Напиши програм који одређује и исписује цифре датог природног броја (већег од 1), кренувши од цифре јединица. На пример, ако корисник унесе број 1234, програм треба да испише 4, 3, 2, 1 (сваку цифру у посебном реду).

Раније смо видели да се последња цифра броја може одредити тако што се одреди остатак при дељењу тог броја са 10, а да се она може обрисати из броја тако што се пронађе целобројни количник тог броја са 10. Да би се одредиле све цифре броја, потребно је понављати одређивање, исписивање и брисање последње цифре броја, све док број не постане нула.

Извршите обавезно овај програм корак по корак и пратите вредности променљивих. На пример, ако унесете број 123, приликом првог уласка у петљу проверава се да ли је 123 > 0 и пошто јесте, исписује се 123 % 10 тј. 3, а број n се замењује са 123 // 10 тј. 12. Након тога се проверава да ли је 12 > 0 и пошто јесте, исписује се 12 % 10 тј. 2, а број n се замењује са 12 // 10 тј. 1. Након тога се проверава да ли је 1 > 0 и пошто јесте, исписује се 1 % 10 тј. 1, а број n се замењује са 1 // 10 тј. 0. На крају се проверава да ли је 0 > 0 и пошто није, петља се завршава. Дакле, програм исписује цифре 3, 2 и 1, баш како је и тражено.

Наша препорука је да овај облик петље вежбате помоћу робота Карела, јер у задацима које смо вам припремили постоји велики број њих који захтевају употребу петље while.

Угнежђене петље

Тело петље могу да чине било које наредбе, па и наребе гранања, али и друге петље.

Таблица множења

Напиши програм који исписује таблицу множења бројева од 1 до n. На пример, за n=4 таблица треба да изгледа овако.

1*1=1 1*2=2 1*3=3 1*4=4
2*1=2 2*2=4 2*3=6 2*4=8
3*1=3 3*2=6 3*3=9 3*4=12
4*1=4 4*2=8 4*3=12 4*4=16

Основу решења овог задатка чини пролазак кроз све парове бројева од 1 до n. За то се користе угнежђена петља. Бројач спољашње петље одговара броју врсте тј. првом чиниоцу (у првој врсти је први чинилац увек 1, у другој 2, у трећој 3, у четвртој 4). Бројач унутрашње петље одговара броју колоне тј. другом чиниоцу (у првој колони је други чинилац увек 1, у другој 2, у трећој 3, у четвртој 4).

Обратимо пажњу да се цела унутрашња петља понавља n пута, по једном за сваку вредност бројача спољашње петље. Када се i постави на 1 тада j редом узима све вредности од 1 до 4. Након тога се се i постави на 2, а j из почетка узима све вредности од 1 до 4 и тако даље.

У телу унутрашње петље знају се вредности бројача i и j и лако можемо израчунати њихов производ и исписати одговарајућу једнакост. Штампање ћемо подесити тако да се не прави размак између делова (постављањем sep="") и тако да се не прелази у наредни ред, већ размак након штампе (постављањем end=" "). У нови ред ћемо прелазити након завршетка рада унутрашње петље (тако што ће последња наредба спољашње петље бити print()).

Наредни програм је скоро готов - прошири наредбу print тако да се израчунава и штампа одговарајући производ.