Цикл while

Цикли в програмуванні. Цикл while

Цикли є такою ж важливою частиною структурного програмування, як умовні оператори. За допомогою циклів можна організувати повторення виконання ділянок коду. Потреба в цьому виникає досить часто. Наприклад, користувач послідовно вводить числа, і кожне з них потрібно додавати до загальної суми. Або потрібно вивести на екран квадрати ряду натуральних чисел і тому подібні завдання.

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

Можна сказати, while є універсальним циклом. Він присутній у всіх мовах, які підтримують структурне програмування, в тому числі в Python. Його синтаксис узагальнено для всіх мов можна висловити так:

while логічний_вираз: 
    вираз 1
    ...
    вираз n

While, після того як його тіло виконано, потік повертається до заголовка циклу і знову перевіряє умова. Якщо логічний вираз повертає істину, то тіло знову виконується. Потім знову повертаємося до заголовку і так далі.

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

Розгляньте блок-схему циклу while.



Блок-схема циклу while

На ній яскраво-блакитними прямокутниками позначена основна гілка програми, ромбом - заголовок циклу з логічним виразом, бірюзовим прямокутником - тіло циклу.

З циклом while можливі дві виняткові ситуації:

Якщо при першому заході в цикл логічне вираз повертає False, то тіло циклу не виконується жодного разу. Цю ситуацію можна вважати нормальною, так як при певних умовах логіка програми може припускати відсутність необхідності у виконанні виразів тіла циклу.

Якщо логічний вираз в заголовку while ніколи не повертає False, а завжди залишається рівним True, то цикл ніколи не завершиться, якщо тільки в його тілі немає оператора примусового виходу з циклу (break) або викликів функцій виходу з програми - quit (), exit ( ) в разі Python. Якщо цикл повторюється і повторюється нескінченну кількість разів, то в програмі відбувається зациклення. В цей час вона зависає і самостійно завершитися не може.

Згадаймо наш приклад з уроку про виключення. Користувач повинен ввести ціле число. Оскільки функція input () повертає рядок, то програмний код повинен перетворити введене до целочисленному типу за допомогою функції int (). Однак, якщо були введені символи, які не є цифрами, то виникає виняток ValueError, яке обробляється гілкою except. На цьому програма завершується.

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

Але ж можна просити і просити користувача коректно вести число, поки він його не введе. Ось як може виглядати який реалізує це код:

# Приклад 1
n = input("Введіть ціле число:")
while type(n)!= int:
    try:
        n = int(n)
    except ValueError:
        print("Неправильно ввели!")
        n = input("Введіть ціле число:")
if n% 2 == 0:
    print("Парне")
else:
    print("Непарне")

Примітка 1. Не забуваємо, в мові програмування Python в кінці заголовків складних інструкцій ставиться двокрапка.

Примітка 2. У вираженні type (n)! = int за допомогою функції type () перевіряється тип змінної n. Якщо він не дорівнює int, т. б., значення n не є цілим числом, а є в даному випадку рядком, то вираз повертає істину. Якщо ж тип n дорівнює int, то дане логічне вираз повертає хиба.

Примітка 3. Оператор % в мові Python використовується для знаходження залишку від ділення націло. Так, якщо число парне, то воно без залишку ділиться на 2, т. б. залишок буде дорівнює нулю. Якщо число непарне, то залишок буде дорівнює одиниці.

Простежимо алгоритм виконання цього коду. Користувач вводить дані, вони мають строковий тип і присвоюються змінної n. У заголовку while перевіряється тип n. При першому вході в цикл тип n завжди строковий, т. б. він не дорівнює int. Отже, логічне вираз повертає істину, що дозволяє зайти в тіло циклу.

Тут в гілці try відбувається спроба перетворення рядка до цілочисленого типу. Якщо вона була вдалою, то гілка except пропускається, і потік виконання знову повертається до заголовку while.

Тепер n пов'язана з цілим числом, отже, її тип int, який не може бути не дорівнює int. Він йому дорівнює. Таким чином логічний вираз type (n)! = int повертає False, і весь цикл завершує свою роботу. Далі потік виконання переходить до оператора if-else, що знаходиться в основний гілці програми. Тут могло б перебувати що завгодно, не обов'язково умовний оператор.

Повернемося назад. Якщо в тілі try спроба перетворення до числа була невдалою, і було викинуто виключення ValueError, то потік виконання програми відправляється в гілку except і виконує знаходяться тут вираження, останнє з яких просить користувача знову ввести дані. Мінлива n тепер має нове значення.

Після завершення except знову перевіряється логічне вираз в заголовку циклу. Воно дасть True, т. К. Значення n і раніше рядок.

Вихід з циклу можливий тільки тоді, коли значення n буде успішно конвертовано в число.

Розглянемо наступний приклад:

# Приклад 2
total = 100
i = 0
while i<5:
    n = int(input("Введи ціле число "))
    total = total - n
    i = i + 1
print("Залишилося", total)

Скільки разів "прокрутиться" цикл в цій програмі. Скільки ітерацій він зробить?
Відповідь: 5.

1. Спочатку змінна i дорівнює 0. У заголовку циклу перевіряється умова i <5, і воно істинне. Тіло циклу виконується. У ньому змінюється значення i, шляхом додавання до нього одиниці.

2. Тепер змінна i дорівнює 1. Це менше п'яти, і тіло циклу виконується вдруге. У ньому i змінюється, її нове значення 2.

3. Два менше п'яти. Тіло циклу виконується втретє. Значення i стає рівним трьом.

4. Три менше п'яти. На цій ітерації i присвоюється 4.

5. Чотири і раніше менше п'яти. До i додається одиниця, і тепер її значення дорівнює п'яти.

Далі починається шоста ітерація циклу. Відбувається перевірка умови i <5. Але оскільки тепер воно повертає брехня, то виконання циклу переривається, і його тіло не виконується.

"Смислове навантаження" даного циклу - це послідовне віднімання з змінної total чисел, що вводяться. Мінлива i в даному випадку грає тільки роль лічильника ітерацій циклу. В інших мовах програмування для таких випадків передбачений цикл for, який так і називається: "цикл з лічильником". Його перевага полягає в тому, що в тілі циклу не треба змінювати змінну-лічильник, її значення змінюється автоматично в заголовку for.

Для while наявність лічильника не обов'язково. Уявімо, що треба вводити числа, поки змінна total більше нуля. Тоді код буде виглядати так:

# Приклад 3
total = 100
while total>0:
    n = int(input("Введи ціле число "))
    total = total - n
print ("Ресурс вичерпаний")

Скільки разів тут виконається цикл? Невідомо, все залежить від вводяться значень. Тому у циклу з лічильником відомо кількість ітерацій, а у циклу без лічильника - немає.

Найголовніше для циклу while - щоб в його тілі відбувалися зміни значень змінних, які перевіряються в його заголовку, і щоб хоч коли-небудь наступив випадок, коли логічний вираз в заголовку повертає False. Інакше станеться зациклення.

Примітка 1. Не обов'язково в виразах total = total - n і i = i + 1 повторювати одну і ту ж змінну. В Python допустимо скорочений спосіб запису подібних виразів: total - = n і i + = 1.

Примітка 2. При використанні лічильника він не обов'язково повинен збільшуватися на одиницю, а може змінюватися в будь-яку сторону на будь-яке значення. Наприклад, якщо треба вивести числа кратні п'яти від 100 до 0, то зміна лічильника буде таким i = i - 5, або i - = 5.

Примітка 3. Для лічильника не обов'язково використовувати змінну з ідентифікатором i. Можна назвати змінну-лічильник як завгодно. Однак так прийнято в програмуванні, що лічильники позначають іменами i і j (іноді одночасно потрібні два лічильника).
------------------------------------------------------------------------------------------------------------------

Запитання
1. Коли використовують цикл while ?
2. Накресліть блок-схему вказівки повторення while ?
3. Запишіть загальну структуру циклу while.
4. Коли тіло циклу не виконується жодного разу ?
5. Коли тіло циклу виконується нескінченну кількість раз ?

Завдання
1. Виконати приклади 1, 2, 3

Задачі для самостійного виконання
1. Написати програму обчислення суми всіх двозначних натуральних чисел, використовуючи цикл while.
2. Написати програму обчислення суми всіх двозначних натуральних чисел, які кратні 3 використовуючи цикл while.
3. Написати програму виведення на екран таблиці значень функції y=2*x-1 на проміжку від х1=-3 до х2=3. Крок зміни х=0.5
4. Написати програму знаходження найменшого спільного дільника(nsd) двох цілих чисел.









Комментариев нет:

Отправить комментарий