Вижте и решете

Операторът while се оказа много полезeн, защото с него успяхме да разрешим по-разнообразни задачи. Следващият пример обаче показва, че има прости задачи, които не можем да решим с наученото досега.

Нека да кажем, че в някаква ситуация трябва да преместите Карел само с едно поле, ако е възможно (ако не е възможно, Карел трябва да остане там, където е).

Очевидно се нуждаем от нов оператор, който ще каже на Карел „ако можете да продължите напред, преместете едно място“.

Операторът if

Твърдението, от което се нуждаем в описания случай, е операторът if, който също съществува в почти всички езици за програмиране. В Python той (в по-простата си форма) е написан така:

Виждаме, че писането на оператора if е много подобно на писането на oператора while. Под if можем да поставим и един или повече оператора, които съставляват тялото на оператора if. Същите правила се прилагат за писане на двоеточие: след условието и за изречения отстъпи, които се изпълняват, ако условието е изпълнено. Разликата е, че операторите, които съставят if няма да се повторят - ако условието е изпълнено, те ще бъдат направени само веднъж.

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

В горния пример трябва да напишем:

Да видим някои задачи, в които (освен вече известните ни оператори) се използва операторът if.

Вземете една топка, ако има такава

Има едно поле пред Карел, с нула или повече топки. Напишете програма, която казва на Карел да се придвижи на това поле и след това вземете точно една топка, ако има поне една топка в полето.

Стартирайте програмата няколко пъти, за да я тествате на различни примери.

В нашия случай условието ще бъде is_ball_on_square(), а командата, която условно се изпълнява, е pick_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_if__take_one_if_any)

Отидете до края на пътеката и изберете една топка, където е възможно

Има поне един квадрат пред Карел и може да има произволен брой от тях. Всеки квадрат има нула или повече топки. Карел трябва да вземе точно една топка от всеки квадрат, на който има топка.

Стартирайте програмата няколко пъти, за да я тествате на различни примери.

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

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

Ако не направите така, направете това (if-else)

При някои задачи трябва да се направи едно нещо, ако е изпълнено определено условие, а друго - ако не е изпълнено. В такъв случай можем да използваме разширената форма на оператор if, който изглежда така:

В разширената форма на if, първата част (преди else) има същия вид и значение като преди. Под тази част се изписва else, насъщото място в реда, където бихме изписали if`, последвана от двоеточие:. В следващите редове пишем един или повече други оператори, които съставляват тялото на else. Тази втора група отоператори се изписва едно поле по-навътре от else и се изпълнява, ако условието, посочено в оператора if, не е изпълнено.

Пример - вземане и пускане на топки

Пред Карел има 3 квадрата и на всеки от тях може да има или една топка, или николко. Карел трябва да вземе топки от квадратите, на които има топки и да постави по една топка на всеки квадрат, който първоначално е бил празен. Карел има достатъчно топки с него в началото.

Използвайки новата, разширена форма на израза if, можем да кажем на Карел: „Ако има топка на квадрата, тогава вземете тази топка, иначе пуснете една топка“, така че задачата да бъде лесно разрешена:

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

Вземете топките, до които можете да стигнете

Лабиринтът се състои от два реда. Карел е в горния ред, който е напълно празен и проходим. В долния ред може да има препятствия или квадратчета с една топка. Задачата на Карел е да вземе всички топки.

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

Действайте само, когато нещо не е изпълнено

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

Според правилата за писане на if, след условието (в тялото на първия branch) трябва да има поне един оператор, според логиката на задачата не се нуждаем от оператор на това място. В такива ситуации можем да пишем:

или

В първия случай използваме pass, който не прави нищо. Правейки това, удовлетворяваме синтаксиса (правила за писане) и получаваме програма, която работи така, както искаме.

Във втория случай, използвайки думата not, правим обратното условие, което означава, че условието на if е изпълнено, когато Karel не може да продължи напред. В този случай клоните променят ролите, така че else частта вече не е необходима.

В малкото предстоящи задачи има какво да се направи само когато условието не е изпълнено.

Обърнете се към празно поле

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

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

We offer you two short solutions:

Където няма топки, добавете ги

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

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