§ 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.

Оцініть свої знання