Цикли з умовою

Розбираємося ще з одним типом циклів і їх застосуванням

Не завжди при складанні програм з повторенням одних і тих самих дій можна заздалегідь визначити, СКІЛЬКИ разів доведеться їх повторювати. Ось, наприклад, такий нескладний скрипт, в якому Кіт іде поки не зустріне перешкоду. Як визначити, скільки разів треба повторити команду "Перемістити"? Для цього в Scratch використовується спеціальний блок "Повторити до..."

Такий цикл у Scratch складається з двох частин: умови й тіла циклу, яке виконується доти, доки НЕ ВИКОНАЄТЬСЯ умова.

В Python теж є такий цикл, виконання якого залежить від того, виконується чи не виконується певна УМОВА, тільки на відміну від Scratch він виконується не на false (тіло циклу виконується, якщо умова НЕ виконується - див. скрипт: Доторкається? Ні? Значить іти 5 кроків!), а на true (тіло циклу виконується доти, доки УМОВА ВИКОНУЄТЬСЯ і перестає виконуватися, якщо УМОВА вже НЕ ВИКОНУЄТЬСЯ).

А тепер детальніше...

Цикл з передумовою

Блок-схема циклу з передумовою

З назви цього циклу зрозуміло, що у ньому УМОВА стоїть спочатку (умова - ПОПЕРЕДУ!). Якщо вона виконується, тоді запускається тіло циклу і після цього знову перевіряється виконання умови. Якщо умова усе ще виконується, тоді тіло циклу запускається знову і так доти, доки умова циклу не ПЕРЕСТАНЕ ВИКОНУВАТИСЯ. Якщо умова не виконується, тоді програма пропускає команди тіла циклу (вихід з циклу) і виконує команди, розміщені після циклу.

В мові програмування Python цикл з передумовою має такий вигляд:

while <умова>:

    тіло циклу

Через те, що слово while перекладається з англійської як "поки", то цей тип циклу теж інколи називають "цикл-поки". Аналогічно до циклу з лічильником умова цього циклу може бути як простою, так і складеною, усередині тіла циклу ніякі знаки пунктуації не ставлять, просто кожна його нова команда повинна починатися з нового рядка з відступом від лівого краю.

Завдання 34

Обчислити суму додатних членів числової послідовності, в якій перше число дорівнює х (х>0), а кожне наступне число на у (y>0) менше за попереднє

Наприклад, якщо х=20, а у=7, то потрібно обчислити суму 20+13+6=39.

Таку задачу можна розв'язати і з допомогою циклу з лічильником, але, оскільки початок та інтервал нашого ряду з кожним новим запуском програми можуть змінюватися, то доведеться перед запуском циклу, який буде до деякої змінної ("коробочки") додавати наступне число, спочатку порахувати кількість ітерацій циклу для даного конкретної пари чисел умови задачі.

І не зовсім це і складно:

from math import trunc

x = int(input('Введіть перше число діапазону: '))

y = int(input('Введіть інтервал: '))

s = 0

n = trunc((x-1)/y)+1

'''Вираховуємо різницю між першим числом ряду і останнім додатним цілим числом (число 1), ділимо її на фрагменти по у, відкидаємо дробову частину частки і додаємо 1, для врахування самОго першого числа ряду'''

for i in range(n):

    s += x

    x -= y

print(s)

Однак, складного з точки зору розумових зусиль вираховування кількості чисел, які потрібно додавати, можна й уникнути, застосувавши простішу конструкцію алгоритма за допомогою циклу з передумовою:

x = int(input('Введіть перше число діапазону: '))

y = int(input('Введіть інтервал: '))

s = 0

while x>0:

    s += x

    x -= y

print(s)

Цей цикл буде виконуватися доти, доки число х додатне. Як тільки воно стає рівним нулю або від'ємним, цикл завершується і виводиться сума-результат.

В ході створення циклів слід ретельно їх продумувати: що виконується в тілі циклу і, найголовніше, КОЛИ ВІДБУДЕТЬСЯ ВИХІД З ЦИКЛУ. Річ у тому, що при використанні циклів з умовою можливе виникнення такої ситуації, що цикл НЕ ЗАВЕРШИТЬСЯ НІКОЛИ. Уявімо собі, що в Завданні 34 значення змінної у не вводиться з клавіатури користувачем, а отримується в результаті інших обчислень. Що станеться, якщо в результаті такого обчислення вийде так, що значення змінної у стане рівним нулю? Тоді вийде, що команда x-=y ЖОДНИМ ЧИНОМ не змінюватиме значення змінної х (20-0 завжди дорівнюватиме 20, скільки разів би ця дія не повторювалася), а значить, через те, що значення змінної х не змінюється, умова while x>0... виконуватиметься ЗАВЖДИ (бо х так і залишиться додатним). В результаті отримаємо ситуацію, яка в програмуванні називається словом "зациклювання", коли цикл виконується ВІЧНО, бо умова для виходу з циклу не настає НІКОЛИ.

Перегляньте розміщені нижче приклади і розберіться, скільки разів будуть виконані цикли і яким буде результат виконання програм. Чи є серед та, що приведе до "зациклювання"?

1️⃣

a = 4

b = 6

while a < b:

    a += 1

print(a)

2️⃣

a = 4

b = 6

while a < b:

    a += b

print(a)

3️⃣

a = 4

b = 6

while a > b:

    a += 1

print(a)

4️⃣

a = 4

b = 6

while a < b:

    a -= 1

print(a)

Відповіді

1) 2 рази; a=6

2) 1 раз; а=10

3) 0 разів; а=4

4) зациклювання

Завдання 35

Скласти програму для обчислення суми усіх чисел від a до b, якщо кожне наступне число цього ряду на d більше від попереднього

Перше, останнє число й інтервал вводяться з клавіатури, створюється та сама "коробочка", куди будуть скидатися доданки, і в циклі виконуються дві дії: додаємо поточне число до цієї "коробочки", а щоб отримати наступне число потім додаємо до поточного числа інтервал d.

У завданні є багато спільного з Завданням 34, а тому спробуйте самостійно

a = float(input('Введіть перше число: '))

b = float(input('Введіть останнє число: '))

d = float(input('Задайте інтервал: '))

s = 0

while a<=b:

    s += a

    a += d

print(s)

Для тих, хто хоче знати більше

В деяких мовах програмування окрім циклу з передумовою, де умова стоїть перед тілом циклу і її виконання чи невиконання визначає, запускати тіло циклу чи ні, є ще й цикл з післяумовою, в якому усе навпаки: спочатку виконується дія, а вже потім перевіряється умова, чи вдалося досягти потрібного результату (усе як у нашому житті: спочатку робимо, а потім думаємо 🙄). Саме такий цикл з післяумовою є у Scratch, бо там цикл виконується якраз доти, доки НЕ ПОЧНЕ виконуватися умова (поки Кіт не почне торкатися до дерева). 

ПІДСУМКИ

Отже, узагальнюємо прочитане:

ДОМАШНЄ ЗАВДАННЯ

Скласти програму для обчислення суми усіх двоцифрових парних чисел

Підказки

Тут слід зрозуміти, що ця задача одноразова. Вона взагалі така ОДНА, оскільки набір двоцифрових (тих, що складаються з двох цифр, якщо хто забув 😉) парних чисел тільки ОДИН. Однак, цих чисел досить багато для того, щоб робити такі обчислення вручну, а тому скласти програму і перекласти свою проблему на комп'ютер (нехай навіть і для розв'язування одноразової задачі) - це найлогічніший і найраціональніший крок.

Зважаючи на одноразовість задачі, неважко зрозуміти, що введення будь-яких даних в цю програму не потрібне, оскільки перше в цій послідовності чисел двоцифрове парне число уже давно відоме. Яке це число? Якщо ми знаємо перше парне двоцифрове число, то як отримати наступне? Яка "відстань" між двома сусідніми парними числами? На скільки вони відрізняються? Ну й, нарешті, до якого числа вести обчислення теж відомо! Яке ОСТАННЄ двоцифрове число (або перше вже не двоцифрове)? Залишилося використати, як основу для створення своєї програми, один з варіантів розв'язання Завдання 34.

УСПІХУ! ✌