§ 34. Вкладені розгалуження та цикли
У програмах можна поєднувати команди розгалуження та повторення. Ми вже складали алгоритми, у яких команди розгалуження та повторення слідували одна за одною. Але команди також можуть вкладатися одна в одну. Повторимо, які команди при цьому використовуються.
Завдання 1
Завдання 2
Розгляньте блок-схему до наведеної задачі. Які вкладення вона містить?
34.1. Алгоритми з розгалуженнями, вкладеними в цикл
Якщо потрібно перевірити, чи відповідають елементи деякої послідовності значень певній умові, то в тіло циклу слід укласти команду розгалуження. Розгалуження, вкладене в цикл, може бути повним і неповним.
Приклад 1
У квітнику 7 квіток. Підрахуємо кількість червоних і кількість синіх квіток. Розглянемо фрагмент блок-схеми алгоритма, що виконує підрахунок (див. рисунок).
Як бачимо, у цикл укладено повне розгалуження. Цикл for дає змогу повторити перевірку умови розгалуження для кожного елемента послідовності. Розгляньмо ще приклади.
Завдання 3
Приклад 2
Знайдемо кількість слів red у списку.
k = 0 # Задання початкового значення лічильника
for word in ['blue', 'red', 'red', 'blue', 'red', 'blue', 'red']:
if word == 'red':
k = k+1 # Збільшення значення лічильника
print('k = ', k)
За допомогою команди розгалуження, вкладеного в цикл, можна перевіряти відповідність деякій умові значень, що вводяться з клавіатури.
Приклад 3
Уведемо з клавіатури 8 довільних чисел і підрахуємо, скільки серед них парних (див. рисунок).
k = 0
for i in range(8):
a = int(input('Наступне число'))
if a%2 == 0: # Вкладене неповне розгалуження
k = k+1 # перевіряє, чи введене число парне
print('Кількість парних дорівнює ', k)
Приклад 4
Знайдемо всі дільники натурального числа k. Число 1 і саме число k не включаємо до переліку дільників.
Алгоритм розв’язування задачі: перебрати всі значення змінної і від 2 до k//2; якщо і є дільником числа k (k%і == 0), вивести значення і.
Результат виконання наведено на рисунку.
k = int(input('k = ?'))
for i in range(2, k//2+1):
if k%i == 0:
print(i, end = ' ')
У циклах із умовою також можна керувати виконанням команд тіла циклу за допомогою вкладених розгалужень.
Приклад 5
Найбільший спільний дільник (НСД) двох чисел a і b можна знайти за алгоритмом Евкліда, давньогрецького математика. Цей алгоритм можна описати так: поки А ≠ В, від більшого числа віднімати менше (див. рисунок).
Під час кожної ітерації більше з чисел А і В заміняється їх різницею. Цикл припиняється, коли значення змінних А і В стають рівними — це НСД початкових значень. Виконаємо алгоритм для чисел 12 і 18 (див. рисунок).
Приклад 6
Черепашка переміщується в точку з випадковими координатами х і у, поки одна з координат не стане такою, що дорівнює 0. При цьому якщо значення х є додатним, то Черепашка залишає червоний слід, а якщо від’ємним — то синій.
from turtle import*
from random import*
width(3)
x = y = 200
while x != 0 and y != 0:
x = randint(–100, 100)
y = randint(–100, 100)
if x>0: color('red')
else: color('blue')
goto(x, у)
Результат виконання програми наведено на рисунку.
34.2. Алгоритми з повтореннями, вкладеними в розгалуження
Цикли у свою чергу можуть бути вкладеними в розгалуження. Команду циклу може містити команда як повного, так і неповного розгалуження. Блок-схему команди повного розгалуження із вкладеними по обох гілках командами циклу зображено на рисунку.
Приклад 7
Якщо в тренерки день народження, тричі привітати її.
vidp = input('Сьогодні ваш день народження? (Так/Ні)')
if vidp == 'Так':
for i in range(3):
print('Вітаємо!')
Приклад 8
Якщо число а є трицифровим, знайти суму цифр числа а. Умова повного розгалуження перевіряє, чи є уведене число трицифровим. Для виокремлення цифр числа скористаємося операторами обчислення неповної частки від ділення та обчислення остачі:
З65%10 = 5
365//10 = 36
Якщо умова істинна, у циклі до суми почергово додаються цифри числа а. Якщо умова хибна, повідомляється, що уведене число не відповідає умові задачі (див. рисунок).
a = int(input('a = ?'))
if a >= 100 and a<1000:
s = 0
for i in range(3):
s = s+a%10
a = a//10
print('s = ', s)
else:
print('Число має бути трицифровим')
Цей прийом часто використовується для перевірки коректності введених даних.
У повному розгалуженні команди циклу можуть входити як до гілки Так, так і до гілки Ні.
Приклад 9
Програма запитує: Малювати кола чи квадрат? і чекає на відповідь. Якщо відповідь 1 (вибрали кола), то Черепашка малює квітку з п’яти кіл (див. рисунок), в інших випадках — малює квадрат.
from turtle import*
k = input('Малювати кола чи квадрат
(1/2)?')
if k = '1':
for i in range(5):
circle(50)
left(72)
else:
for i in range(4):
forward(100)
left(90)
Завдання 4
Отже, під час складання алгоритму розв’язування задачі можна організувати як послідовне виконання розгалужень і циклів, так і вкладати команди циклу та розгалуження одна в одну.
Завдання 5
Питання для самоперевірки
1. Завантажте програму Python → IDLE. Створіть нове вікно програми.
Збережіть файл із назвою Vprava34 у власну папку.
2. Запишіть команду введення значення змінної а:
a = int(input('a?'))
7. Давні греки вважали досконалим число, яке дорівнює сумі своїх дільників, включно з 1. Наприклад, число 6 є досконалим (6 = 1+2+3).
Внесіть зміни до програмного коду для перевірки, чи є число а досконалим.
if a == s: print(a, ' — досконале число')
else: print(a, ' — недосконале число')
Закінчіть роботу, закривши вікно IDLE.