Проверите па одлучите¶
Наредба while се показала као врло корисна, јер смо употребљавајући је могли да решавамо много разноврсније задатке. Ипак, следећи пример показује да постоје једноставни задаци које са овим што до сада знамо и даље не можемо да решимо.
Рецимо да вам је у некој ситуацији потребно да померите Карела само за једно поље ако је могуће (ако није могуће, Карел треба да остане тамо где је).
Ако напишемо само наредбу napred(), ризикујемо поруку о грешци у случају да је Карел пред зидом.
Ако наредбу napred() сместимо испод while moze_napred():, ризикујемо да одемо даље него што смо желели.
Ако не користимо наредбу napred(), ризкујемо да се не померимо ни онда када је то могуће (и потребно).
Очигледно, потребна нам је нека нова наредба, која ће Карелу рећи „ако можеш напред, помери се за једно место”.
Наредба if¶
Наредба која нам је потребна у описаном случају је наредба if
, која такође постоји у скоро свим програмским језицима. На пајтону се она (у свом једноставнијем облику) пише овако:
Видимо да је писање if
наредбе веома слично писању while наредбе. Под if
наредбом се такође може наћи једна или више других наредби, које чине тело if наредбе
. При томе важе иста правила за писање двотачке после услова и увлачење наредби које се извршавају ако је услов испуњен. Разлика је у томе што се наредбе у телу if наредбе неће понављати - ако је услов испуњен оне ће се извршити само једанпут.
Наредба if
се зове и наредба гранања зато што се ток извршавања програма код ове наредбе грана: следећа наредба која ће се извршити зависи од одговора на питање из услова.
У поменутом примеру, требало би писати:
Следе задаци у којима се (поред раније упознатих) користи if
наредба.
Узми једну лоптицу ако их има¶
Испред Карела је једно поље, на коме се налази нула или више лоптица. Напишите програм на основу кога ће Карел прећи на то поље, а затим узети тачно једну лоптицу ако на пољу има бар једна лоптица.
Покрените програм више пута да бисте га тестирали на различитим примерима.
У нашем случају, услов ће бити ima_loptica_na_polju()
, а наредба која се условно извршава је uzmi()
.
(Karel_if__take_one_if_any)
Иди до краја и покупи по једну лоптицу где их има¶
Испред Карела је бар једно поље, а може их бити било колико. На сваком пољу има нула или више лоптица. Карел треба да покупи по тачно једну лоптицу са сваког поља на коме има лоптица.
Покрените програм више пута да бисте га тестирали на различитим примерима.
Овде је потребно користити while наредбу за напредовање, а после сваког напредовања у телу while петље треба користити if наредбу за проверу да ли Карел стоји на пољу са лоптицом.
(Karel_if__many_squares_take_one_if_any)
Ако не радиш то, уради ово (if-else)¶
У неким задацима треба урадити једну ствар ако је неки услов испуњен, а неку другу ствар ако није испуњен. У том случају можемо да користимо проширени облик if наредбе, који изгледа овако:
У проширеном облику if
наредбе први део (до речи else
) има исти изглед и значење као и до сада. У наставку се пише реч else
једнако увучена као и реч if
, затим се пише двотачка, а испод следи једна или више других наредби, које чине тело else гране
. Ова друга група наредби се пише увучено у односу на реч else
, а извршава се ако услов наведен у if
наредби није испуњен.
Пример - узимање и остављање лоптица¶
Испред Карела су 3 поља, а на сваком од њих може да буде по једна или ниједна лоптица. Карел треба да узме лоптице са оних поља на којима се налазе и да их постави на она поља на којима се не налазе. Карел на почетку има довољно лоптица код себе.
Помоћу новог, проширеног облика if
наредбе, Карелу можемо да кажемо: „Ако је на пољу лоптица, онда узми ту лоптицу, иначе остави једну лоптицу”, тако да се задатак лако решава:
(Karel_if__take_else_put)
Покупи лоптице до којих можеш да дођеш¶
Лавиринт се састоји од два реда. Карел се налази у горњем реду, који је проходан до краја. У доњем реду могу да се налазе препреке или поља са по једном лоптицом. Карелов задатак је да покупи све лоптице.
(Karel_if__take_all_from_lower_row)
Ради само кад нешто није¶
Нека је потребно да се Карел окрене лево ако не може да иде напред (ако може да иде напред, не треба да ради ништа).
Према правилима писања if наредбе, после услова (у телу прве гране) мора да постоји бар једна наредба, а према логици задатка нам није потребна ни једна наредба на том месту. У таквим ситуацијама можемо да пишемо:
или
У првом случају користимо специјалну наредбу pass
која не ради ништа. Тиме је задовољена и синтакса (правила писања), а добили смо и програм који ради како желимо.
У другом случају, помоћу речи not
правимо супротан услов, што значи да је услов if наредбе испуњен када Карел не може да иде напред. У овом случају гране мењају улоге и онда нам else грана више није потребна.
Следи пар сличних задатака, у којима такође треба нешто урадити само када услов није испуњен.
Окрени се ка празном пољу¶
Карел може да буде окренут на било коју страну, али само у једном смеру може да започне кретање. Потребно је да се Карел окрене ка слободном пољу и да направи један корак.
(Karel_if__turn_to_free_square)
Нудимо вам два кратка решења:
Додај лоптице где их нема¶
Испред Карела је непознат број поља, а на сваком од њих може да буде по једна или ни једна лоптица. Карел има довољно лоптица код себе, а треба да стави по једну лоптицу на свако поље на коме нема лоптице.
(Karel_if__fill_the_empty_squares)