Розгалуження та оператор вибору. 6 клас

Під час розв'язування задач з алгоритмізації одним з найважливіших елементів є так зване “розгалуження”, яке дуже точно описується казковою формулою “Праворуч підеш — голову втратиш, прямо підеш — коня втратиш...”, а по-іншому “якщо..., то..., інакше...”.
Алгоритмічна конструкція “розгалуження” передбачає нелінійне виконання програми, для чого можуть мати місце вкладені блоки коду — саме ті фрагменти програми, які необхідно виключити з лінійної послідовності виконання дій у програмі.
Вкладені блоки коду в Python виділяються відступами на початку рядка. Алгоритмічні структури можуть вкладатися одна в одну скільки завгодно разів — це призводить до більшої вкладеності блоків коду і, відповідно, більших відступів.
З іншого боку це значить, що та частина коду, яка не передбачає вкладеності, тобто виконується послідовно, не має містити зайвих відступів , плаваючи вліво-вправо — всі команди мають бути гарно написані на одному рівні.
Більшість мов програмування є досить гнучкими в цьому питанні, але містять додаткові оператори або позначки для виділення вкладених блоків. Розробники ж Python пішли іншим шляхом: позбавились таким чином зайвих елементів у коді і одночасно змусили програмістів гарно форматувати код.
Умовне розгалуження — if..else
логічно описує умову, за якої відбувається перехід на одну чи іншу гілку, та включає 2 вкладених блоки коду:
if n==0:
    print “n is equal to zero”
else:
    print “n is not equal to zero”
Якщо умова справджується, виконується перший блок. Якщо ні — другий. Іноді буває, що необхідно щось робити лише у випадку, коли умова вірна — в такому випадку другу частину конструкції можна опустити:
if n==0:
    print “n is equal to zero”
print “this will be printed anyway”
В якості умови найчастіше застосовуються порівняння змінних із значеннями або іншими змінними. Для цього застосовують <, >, <=, >=, ==. Для перевірки “не дорівнює” є аж два позначення: != та <>. Зверніть увагу: для перевірки, чи є значення або змінні рівними використовується подвійне “дорівнює”, одинарне ж застосовується для присвоєння значень.
Щоб зрозуміти, як працює оператор if, розглянемо кілька типових задач на перевірку умови і вибір.
Задача 1. Скласти програму введення значення температури повітря t і виведення тексту “Гарна погода!”, якщо t>10 градусів за Цельсієм і тексту "Погана погода!, якщо t<=10 градусів за Цельсієм.
Текст програми на псевдомові:
ввод t
якщо (t<10) то
     s = 'Погана погода! '
інакше
     s = 'Гарна погода!'
кінець якщо
виведення s
Текст програми на Python:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
t = float(input ('Введіть температуру в градусах: '))
if t<10:
    s = 'Погана погода! '
else:
    s = 'Гарна погода!'
print (s)

Початок кожної “гілки” програми позначається символом “:”. Умова в операторі if (“якщо”) записується без дужок. Як таке закінчення оператора if відсутнє. Python вважає, що наступний оператор починається в рядку без відступу.

Задача 2. Скласти програму введення оцінки Р, яку отримав учень, виведення тексту “Молодець!”, якщо Р>=9, “Добре!”, якщо P>5 і “Ліньтяй!”, якщо P<=5.

Текст програми на Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
p = int(input ('Введіть оцінку: '))
if p<=5:
    s = 'Ліньтяй!'
elif p < 10:
    s = 'Добре!'
else:
    s = 'Молодець!'
print(s)

Ключове слово elif в Python є скороченням від else if (“інакше якщо”) і використовується для організації вкладених умов (алгоритмів вибору).


Задача 3. Дано три дійсних числа a, b ,c. Вводяться в програму з клавіатури. Програма виводить рядок “triangle”, якщо можуть існувати відрізки з такою довжиною та з них можна скласти трикутник, або “not triangle” - якщо ні.
Текст програми мовою Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

a=float(input('Введіть a: '))
b=float(input('Введіть b: '))
c=float(input('Введіть c: '))
if a<=0 or b<=0 or c<=0:
    res='not triangle'
else:
    if a<b+c and b<a+c and c<a+b:
        res='triangle'
    else:
        res='not triangle'
print (res)

В розв'язку цієї задачі для формування умови в операторі if використано логічні оператори and (“i”) та or (“або”). Ці оператори дають результати, що описуються спеціальним типом даних — логічним.
Логічний тип даних є дуже простим і включає всього 2 можливих значення: True та False -- істина та хиба. Ці значення виникають, насамперед, як результат перевірки (обчислення) будь-яких умов у програмі. Наприклад, результатом перевірки 10 > 0 буде True, 91 < 0 -- False. Коли умова містить змінні, її значення, відповідно, залежить від значень цих змінних на момент перевірки умови (в циклі або розгалуженні).
num = input('input N:')
if num == '7':
    print 'Lucky number!'
В даному випадку після введення значення користувачем виконується перевірка: якщо введена змінна рівна ‘7’ (нагадую, за умовчанням введені значення вважаються рядками), логічний вираз набуде значення True, умова справдиться і інтерпретатор перейде у вкладений блок коду. Якщо змінна не рівна ‘7’, вираз набуде значення False, тобто “хиба” і умова не справдиться.
Ось це значення умови True або False має свій власний тип даних, що дозволяє нам створювати змінні цього типу і взагалі використовувати його за межами розгалужень та циклів.
Наприклад, ми можемо обчислити логічний вираз завчасно:
num = raw_input('input N:')
is_seven = num == '7'
if is_seven:
    print 'Lucky number!'


Прості та складні логічні вирази

Автоматично ж значення логічного типу виникають за наявності операцій порівняння у виразі. Для деякої пари значень a та b це:
  • a < b -- дорівнює True, якщо a менше b, інакше — False,
  • a == b -- дорівнює True, якщо a дорівнює b, інакше — False,
  • a != b, a <> b -- дорівнює True, якщо a не дорівнює b, інакше — False,
  • a >= b -- дорівнює True, якщо a більше або дорівнює b, інакше — False,
  • a > b -- дорівнює True, якщо a більше b, інакше — False.

Вони є простими логічними виразами (умовами). В якості a та b можуть використовуватись будь-які змінні, вирази та функції.
На практиці часто доводиться перевіряти складніші випадки, коли мають задовольнятися декілька різних умов. Звичайно, для цього можна використати цілий ряд перевірок — послідовних, або вкладених одна в одну, але такий запис є громіздким. Тому для цього використовують складні логічні вирази, які включають декілька простіших, об'єднаних логічними операторами:
  • or y — дорівнює True, якщо хоч один з х або у дорівнює True, інакше — False,
  • and y — дорівнює True, якщо і х і у одночасно дорівнюють True, інакше — False,
  • not x — дорівнює True, якщо x False, і навпаки.

При цьому х та у можуть бути як простими, так і складними виразами, що дозволяє будувати логічні вирази будь-якої складності.
Логічні операції можуть застосовуватися в одному виразі із математичними. При цьому математичні мають вищий пріоритет виконання, отже будуть обраховані раніше. Далі отримані значення будуть порівняні між собою, а потім результати порівняння “поєднані” логічними зв’язками-операціями. Першими у виразі обчислюються значення всіх “модифікаторів” not, потім and зліва направо, потім or -- також зліва направо. Так само, як і в арифметичних виразах, круглі дужки змінюють порядок виконання операцій. Але, за наявності в одному виразі різних типів зв’язок, раджу завжди використовувати дужки -- так простіше відстежувати порядок обчислення складних виразів.
Нехай нам необхідно перевірити, чи є заданий рік високосним. Для цього він має ділитися націло на 4, але не ділитися на 100, або ділитися на 400:
year = int(raw_input('input year:'))
if (year % 4 == 0) and (not(year % 100 == 0) or (year % 400 == 0)):
    print 'is leap'
else:
    print 'is not leap'

True i False можуть бути легко перетворені на рядки. Результатом буде 'True' та 'False' відповідно.
Також логічні значення перетворюються на числа. Це може бути не так очевидно, але True відповідає одиниці, а False — нулю. Це працює як для цілих, так і для дійсних чисел:
int(True) == 1
int(False) == 0
float(True) == 1.0
float(False) == 0.0
str(True) == ‘True’
str(False) == ‘False’
В зворотньому порядку перетворення працює трохи інакше, але запам'ятати дуже просто: будь-які “непорожні” значення конвертуються в True, а будь-які “нульові” - в False. Для примусового переведення значення до логічного типу використовується вбудована функція bool:
bool(None) == False
bool(0) == False
bool(0.0) == False
bool('') == False
Всі інші значення відомих нам типів — істині:
bool(1) == True
bool(10) == True
bool(-1.1) == True
bool('False') == True
bool(-100500) == True
Якщо значення інших типів беруть безпосередню участь в логічних операціях (без додаткових операцій порівняння), вони автоматично конвертуються в логічні значення. Отже ми можемо писати:

if x>0 and y and z:

замість

if x>0 and bool(y) and bool(z):

Наприклад, це дозволяє записати вираз із високосним роком ще наступним чином:
year = int(input('input year: '))
print not(year % 4) and ((year %100) or not(year %400))




Коментарі

Популярні дописи з цього блогу

Повторення. Цілі і дробові раціональні вирази. 11 клас

Авторські права та ліцензії у веб-середовищі

Сервіси розміщення аудіо та відео файлів в Інтернеті