Branching statements ( операции за разклоняване)¶
В уроците по Карел всеки път, когато искахме Карел да продължи напред, трябваше първо да проверим дали Карел може да продължи. Тези проверки бяха необходими, защото ако се опитаме да преместим робота напред, когато площадът пред него не съществува, програмата ще докладва за грешка и ще спре да работи. По същата причина бяхме проверили дали има топка на квадрат преди да я вземем и проверявахме дали Карел има топка със себе си, преди да пусне топката.
По подобен начин в програмите с числа често се налага да сравняваме две стойности, тоест да определим дали те са равни, дали едната е по-малка от другата, различна от другата и други подобни. В зависимост от резултата от сравнението, програмата може да продължи да се изпълнява по различни начини.
Някои от символите, използвани за сравнение, са същите като в математиката (например <
и >
) а някои не са. Следващата таблица дава обозначение на всички стандартни сравнения, използвани в математиката и в Python (а също и в много други езици за програмиране).
Math |
Python |
Meaning |
---|---|---|
\(а < b\) |
a < b |
a is less than b |
\(a \leq b\) |
a <= b |
a is less than or equal to b |
\(a > b\) |
a > b |
a is greater than b |
\(a \geq b\) |
a >= b |
a is greater than or equal to b |
\(a = b\) |
a == b |
a is equal to b |
\(a \neq b\) |
a != b |
a is not equal to b |
Нотацията \(a<b\) може да се разбира като израз, чиято стойност е вярна или невярна във всеки случай. Тези стойности са написани в Python като True и False и те са логически константи, тоест константи от типа bool, който наричаме логически тип. Изражения, чиято стойност е вярна или невярна (логически тип), се наричат логически изрази. Всички изрази в таблицата по-горе са логически изрази (по-късно ще видим повече логически изрази).
If оператор¶
Операторът if вече беше въведено в уроците от Карел, нека си припомним:
Използва се за определяне на коя от двете групи оператори да се изпълни. В Python пише така:
Значение на оператора if:
Изявлението, написано по-горе, означава: ако условието е изпълнено, изпълнете statement_a1,… statement_ak, в противен случай изпълнете инструкция_b1,… statement_bm.
Правила за писане (синтаксис) на оператора if
След думата
if
, се пише логически израз и в края на реда се изисква символът:
(двоеточие).В следващите редове, отредени за същия брой интервали (обикновено 4), се записват изразите, които трябва да бъдат изпълнени, ако логическият израз се изчисли на True. Може да има едно или повече от тези твърдения.
След командите, които се изпълняват, ако условието е изпълнено, се изписва думата else и отново символът: (двоеточие). Else се пише на същото ниво на отстъпи като if.
В следващите редове, отредени за същия брой интервали, напишете командите, които трябва да се изпълнят, ако логическият израз се изчисли на False. Може да има едно или повече от тези твърдения.
Операторът if се нарича също операция за разклоняване, тъй като потокът на изпълнение на програмата за този оператор се разклонява: следващият оператор за изпълнение зависи от стойността на логическия израз в условието. Групи от изрази след думата, ако или друго, следователно се наричат също клонове на израза if.
В случай, че програмата не се нуждае от нищо, когато условието на оператора if не е изпълнено, тоест когато не се нуждаем от друг клон на оператора if, можем да го пропуснем:
Ще използваме тази кратка форма на оператора if по-късно.
If - примери и задачи¶
Пример - кой е по-млад:
Петър и Марк искат да играят на билярд. Те се съгласиха, че по-младият играч играе първи. Напишете програма, която чете възрастта на Петър и Марк (които не са равни) и отпечатва кой ще направи първия ход.
Пример - опаковане:
Яйцата във фермата са опаковани в кутии по 10 опаковки и пълните кутии се изпращат до магазина. Напишете програма, която взема броя на яйцата, готови за опаковане, и отпечатва дали всички яйца могат да бъдат опаковани и изпратени до магазина, или дали няколко яйца ще останат разопаковани временно.
Тук трябва да проверим дали броят на яйцата се дели на 10. По тази причина използваме оператора%, който дава остатъка след разделянето. Ако остатъкът след разделяне на броя на яйцата на 10 е равен на нула, всички яйца могат да бъдат опаковани и изпратени
Задача - страна на улицата:
Четните номера на къщите са от дясната страна на улицата, а нечетни номера на къщите вляво. Напишете програма, която приема домашен номер и отпечатва на коя страна на улицата е номерът.
Тук е необходимо да се проучи дали даденото число се дели на 2. Задачата е подобна на предходната - ако остатъкът от разделянето на дадения номер на къща с 2 е равен на нула, числото е от дясната страна на улицата , в противен случай е от лявата страна.
Задача - кино:
Имате 10 евро със себе си. Напишете програма, която взема цената на билета за филма и цената на пуканките, след което разпечатва дали имате достатъчно пари и за билета, и за пуканките.
Логически изрази¶
В някои задачи трябва да изразим условия, които са по-сложни, отколкото просто да сравняваме две стойности. Думите and, or и not се използват, за да се свържат по-простите термини, а Python използва точно същите думи за това. Ето как да се оценят такива сложни условия. Ако a и b са някакви условия, то:
условието
a and b
ще бъде изпълнено ако и двете условия a и b са изпълнени;условие
a or b
ще бъде изпълено ако поне едно от условията a и b е изпълнено;условието
not a
ще бъде изпъленено ако условието a не е изпъленено(вече споменахме това по време на уроците с Карел);
Тези условия могат да бъдат комбинирани допълнително в още по-сложни според нуждите на задачата. В сложни условия можем да използваме скоби, за да повлияем на реда, в който се изчисляват условията (също когато не сме сигурни кой е редът по подразбиране) и да направим програмата по-ясна за другите хора, които я четат. Ако няма скоби в сложното състояние, не се прилага първо, след това и, и накрая или.
Логически изрази - примери¶
Пример - високосна година:
Напишете програма, която отпечатва дали дадена година (между 1800 и 2200, включително граници) е високосна или проста.
Според григорианския календар се използват следните правила, за да се определи дали една година е обикновена или високосна:
години, които не се делят на 4 (например 1923, 1070, 2017) са обикновени;
години, които се делят на 100, а не на 400 (например 1700, 1800, 1900, 2100, 2200), също са обикновени;
всички останали години (например 1984, 2000, 2012) са високосни. Това са години, които се делят на 4, а не на 100, или са делими на 400.
Записвайки тези правила под формата на логически условия, получаваме:
Получаваме еднакво добро решение, ако използваме описанието за високосните години, дадено в правило 3 (проверете, като мислите чрез него и като изпробвате и двете програми, че получаваме същия резултат):
Пример - работно време:
Работното време на един магазин за сувенири е от 7 до 11 сутринта и от 17 до 22 вечерта (като се има предвид, че той работи в 7:00 и в 17:00 рязко и не работи в 11:00 и в 22:00). Петър попадна в магазина в H часа и M минути. Напишете програма, която приема числото H (от 0 до 23) и отговаря дали Петър попадна в магазина по време на работното време.
Можем да стигнем и до решение, като постепенно изчисляваме логически стойности, използвайки логически променливи:
В това решение само h е целочислена променлива и всички останали (at_morning_office_hours, at_evening_office_hours, at_office_hours) са логични, което означава, че те ще получат стойности True или False при изпълнение на програмата.
Логически изрази - въпроси¶
-
Q-24: Съпоставете еквивалентните изрази
Try again!
- 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
- No, this condition is not fulfilled for any h.
- h < 7 or 11 <= h
- Correct.
- not(7 <= h) or not(h < 11)
- Correct.
- h <= 7 or 11 < h
- No, the value of the conditions differs if h is exactly 7 or 11.
Q-25: Какви са всички условия, равни на not (7 <= h and h <11)?
-
Q-26: Свържете условията с описанията
Try again!
- At least one of a, b, c is positive
- a > 0 or b > 0 or c > 0
- None of a, b, c is positive
- a <= 0 and b <= 0 and c <= 0
- a, b and c are not all positive
- a <= 0 or b <= 0 or c <= 0
- a, b and c are all positive
- a > 0 and b > 0 and c > 0
- (population <= 10000) or (population > 10000 and income <= 2000)
- Correct.
- population <= 10000 or income <= 2000
- Correct.
- population <= 10000 and income <= 2000
- Wrong.
- (income <= 2000) or (income > 2000 and population <= 10000)
- Correct.
Q-27: Правителството на държавата предлага помощ за изграждането на спортен център. Селища с до 10 000 жители имат право да кандидатстват, както и селища с над 10 000 жители и среден доход до 2000 г. Кое от условията правилно проверява дали дадено населено място може да се прилага?
Логически изрази - задачи¶
Задача – подредени числа:
Напишете програма, която приема цели числа a, b, c и отговаря на въпроса дали тези числа са дадени в ред от най-малки до най-големи.
Задача - среден номер:
Напишете програма, която приема цели числа a, b, c и отговаря на въпроса дали b е среден по размер.
Задача - гледане на кучето:
Анна и Марк живеят заедно и имат куче на име Боби. Двете трябва да пътуват същия месец, Анна от ден a1 до a2, и Марк от ден m1 до m2. И двамата тръгват сутринта и се връщат вечерта. Тъй като не искат да оставят Боби сам, те се чудят дали пътуванията им се припокриват.
Напишете програма, която приема цели числа a1, a2, m1 и m2, и ще отговори на въпроса дали пътуванията на Ана и Марк се припокриват.
Съвет: пътуванията се припокриват, ако Марк замине преди Ана да се върне (денят на заминаването на Марк е по-малък или равен на деня на връщането на Ана) или обратно - ако Ана напусне преди Марк да се върне.