Наредбе гранања¶
У лекцијама о Карелу смо редовно проверавали на пример да ли робот може да иде напред. Ове провере су нам биле портебне, јер уколико бисмо покушали да померимо робота напред када поље испред њега не постоји, програм би пријавио грешку и прекинуо рад. Исто тако, требало је пре узимања лоптице провравати да ли постоји лоптица на пољу, а пре оставњања лоптица провреавати да ил Карел има лоптица код себе.
Слично томе, у програмима у којима рачунамо често нам је потребно да поредимо две вредности, то јест да установимо да ли су оне једнаке, да ли је једна мања од друге, различита од друге и слично. У зависности од исхода поређења, програм може да настави са извршавањем на различите начине.
Неки од симбола који се користе за поређење су исти као у математици (на пример <
и >
), а неки нису. У следећој табели су зато дате ознаке свих стандардних поређења које се користе у математици и у програмском језику Пајтон (као и у многим другим програмским језицима).
Математика |
Пајтон |
Значење |
---|---|---|
\(а < b\) |
a < b |
a је мање од b |
\(a \leq b\) |
a <= b |
a је мање или једнако b |
\(a > b\) |
a > b |
a је веће од b |
\(a \geq b\) |
a >= b |
a је веће или једнако b |
\(a = b\) |
a == b |
a је једнако b |
\(a \neq b\) |
a != b |
a није једнако b |
Запис \(а < b\) можемо да схватимо као израз чија је вредност у сваком конкретном случају „тачно” или „нетачно”. Ове вредности се у Пајтону пишу редом као True и False и то су логичке константе, односно константе типа bool
који зовемо логички тип. Изразе чија је вредност типа bool (логичког типа) зовемо логички изрази. Сви изрази у горњој табели су логички изрази (касније ћемо видети и другачије логичке изразе).
Наредба if¶
Наредбу if смо већ упознали у лекцијама о Карелу, подсетимо се:
Наредба if служи за доношење одлуке која група од две групе наредби треба да се изврши. На пајтону се она пише овако:
Значење (семантика) наредбе if:
Наредба написана горе значи: ако је услов испуњен, изврши наредбе naredba_a1, … naredba_ak, а ако није испуњен, онда изврши наредбе naredba_b1, … naredba_bm.
Правила писања (синтакса) наредбе if
После речи
if
се пише логички израз и на крају реда обавезно знак:
(двотачка).У следећим редовима, увучено за исти број размака (уобичајено је 4), пишу се наредбе које треба да буду извршене ако логички израз има вредност True. Ових наредби може бити једна или више.
Након наредби које се извршавају ако је услов испуњен пише се реч
else
и поново знак:
(двотачка). Реч else је једнако увучена као и реч if.У следећим редовима, поново увучено за исти број размака, пишу се наредбе које треба да буду извршене ако логички израз има вредност False. И ових наредби може бити једна или више.
Наредба if
се зове и наредба гранања зато што се ток извршавања програма код ове наредбе грана: следећа наредба која ће се извршити зависи од вредности логичког израза у услову. Групе наредби после речи if, односно else зе зато називају и гранама if наредбе.
У случају да програм не треба да уради ништа када услов if наредбе није испуњен, то јест када нам друга грана наредбе if није потребна, можемо да је изоставимо:
Овакав, скраћени облик if наредбе ћемо користити касније.
Наредба if - примери и задаци¶
Пример - ко је млађи:
Петар и Милош треба да одиграју партију билијара. Договорили су се да први игра онај ко је млађи. Написати програм који учитава број година Петра и Милоша (који нису једнаки) и исписује ко ће извести први потез.
Пример - паковање:
Јаја се на фарми пакују у кутије од по 10 комада и пуне кутије се шаљу у продавницу. Написати програм који учитава број јаја спремних за паковање, а исписује да ли сва јаја могу да се спакују и пошаљу у продавницу, или ће неколико јаја привремено остати неупаковано.
Овде треба проверити да ли је број јаја дељив са 10. Ради тога користимо оператор % који даје остатак при дељењу. Ако је остатак при дељењу броја јаја са 10 једнак нули, сва јаја могу да се пошаљу.
Задатак - Страна улице:
Парни бројеви се налазе са десне стране улице, а непарни са леве. Написати програм који учитава тражени број и исписује са које стране улице се налази тај број.
Овде треба проверити да ли је тражени број дељив са 2. Задатак је сличан претходном - ако је остатак при дељењу траженог броја са 2 једнак нули, број је са десне стране, иначе је са леве стране.
Задатак - биоскоп:
Имате код себе 700 динара. Напишите програм који учитава цену биоскопске карте и цену кокица, а затим исписује да ли имате довољно новца за карту и кокице.
Сложени услови¶
У неким задацима је потребно да искажемо услове који су сложенији од простог поређења две вредности. За повезивање једноставнијих услова се користе речи и, или и не, а у Пајтону се за то користе управо исте те речи на енглеском: and, or, not. При томе, ако су a и b неки услови, тада:
услов a and b ће бити испуњен ако су оба услова a и b испуњена;
услов a or b ће бити испуњен ако је бар један од услова a и b испуњен;
услов not a ће бити испуњен ако услов a није испуњен (што смо већ помињали и у поглављима о Карелу);
Ови услови се могу даље комбиновати у још сложеније, према потребама задатка. У сложеним условима можемо да користимо заграде да бисмо утицали на редослед рачунања услова (или ако нисмо сигурни који је подразумевани редослед), а и да би програм био јаснији другим људима који га читају. Ако у сложеном услову нема заграда, прво се примењује not, затим and, и на крају or.
Сложени услови - примери¶
Пример - преступна година:
Написати програм који одговара да ли је задата година (између 1800-те и 2200-те, укључујући границе) преступна или проста.
По грегоријанском календару, за одређивање да ли је година проста или преступна, користе се следећа правила:
године које нису дељиве са 4 (нпр. 1923, 1070, 2017) су просте;
године које су дељиве са 100 а нису са 400 (нпр. 1700, 1800, 1900, 2100, 2200) су такође просте;
све остале године (нпр. 1984, 2000, 2012) су преступне. То су године које су дељиве са 4 а нису са 100, или су дељиве са 400.
Записујући дата правила у облику логичког услова, добијамо:
Равноправно решење добијамо ако искористимо опис за преступне године, дат у трећем правилу (уверите се размишљањем и испробавањем оба програма да се добија исти резултат):
Пример - радно време:
Радно време једне продавнице сувенира је од 7 до 11 ујутро и од 17 до 22 увече (сматрати да тачно у 7:00 и у 17:00 ради, а у 11:00 и у 22:00 не ради). Петар је наишао на продавницу у H часова и M минута. Написати програм који учитава број H (од 0 до 23) и одговара да ли је Петар наишао у току радног времена продавнице.
До решења можемо дођи и поступним рачунањем логочких вредности, користећи логичке променљиве:
У овом решењу само h је целобројна променљива, а све остале (u_radno_vr_ujutro, u_radno_vr_uvece, u_radno_vr) су логичке, што значи да ће током извршавања програма добити вредности True или False.
Сложени услови - питања¶
-
Q-24: Упарите равноправне услове
Покушајте поново!
- a <= b
- a < b or a == b
- a >= b
- b <= a
- not (a == b)
- a < b or a > b
- not (a != b)
- a == b
- h < 7 and 11 <= h
- Не, тај услов није испуњен ни за једно h.
- h < 7 or 11 <= h
- Тачно
- not(7 <= h) or not(h < 11)
- Тачно
- h <= 7 or 11 < h
- Не, вредност услова се разликује у случају да је h једнако баш 7 или 11.
Q-25: Који све услови су равноправни са not(7 <= h and h < 11) ?
-
Q-26: Упарите услове и описе
Покушајте поново!
- Бар један од a, b, c је позитиван
- a > 0 or b > 0 or c > 0
- Ни један од a, b, c није позитиван
- a <= 0 and b <= 0 and c <= 0
- a, b, c нису сви позитивни
- a <= 0 or b <= 0 or c <= 0
- a, b, c су сви позитивни
- a > 0 and b > 0 and c > 0
- (stanovnika <= 10000) or (stanovnika > 10000 and prihod <= 2000)
- Тачно
- stanovnika <= 10000 or prihod <= 2000
- Тачно
- stanovnika <= 10000 and prihod <= 2000
- Погрешно
- (prihod <= 2000) or (prihod > 2000 and stanovnika <= 10000)
- Тачно
Q-27: Државна влада нуди помоћ за изградњу спортског центра. Насељена места до 10000 становника могу сва да конкуришу, а од места са више од 10000 становника, могу да конкуришу она у којима је просечан приход до 2000. Који од услова исправно проверавају да ли неко место може да конкурише?
Сложени услови - задаци¶
Задатак - бројеви по реду:
Написати програм који учитава целе бројеве a, b, c и одговара на питање да ли су ти бројеви дати по величини од најмањег до највећег.
Задатак - средњи број:
Написати програм који учитава целе бројеве a, b, c и одговара на питање да ли је b средњи по величини од њих.
Задатак - чување пса:
Са Аном и Марком живи још само њихов пас Боби. Њих двоје имају заказана путовања истог месеца, Ана од датума a1 до a2, а Марко од m1 до m2. Обоје на пут полазе ујутро, а враћају се увече. Пошто не желе да остављају Бобија самог, интересује их да ли им се путовања преклапају.
Написати програм који учитава целе бројеве a1, a2, m1 и m2, и одговара на питање да ли се Анино и Марково путовање преклапају.
Помоћ: путовања се преклапају ако Марко одлази пре него што се Ана врати (дан Марковог одласка је мањи или једнак дану Аниног повратка) или обрнуто, ако Ана одлази пре него што се Марко врати.