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

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

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

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

На відміну від Scratch у Pascal типів циклів з умовою не один, а два: один виконується доти, доки УМОВА ВИКОНУЄТЬСЯ, а другий - виконується доти, доки УМОВА НЕ ПОЧНЕ ВИКОНУВАТИСЯ. Тобто, перший тип циклу працює на true, а другий - на false. Це дозволяє організувати виконання циклічних алгоритмів, практично, з будь-якими умовами.

Отже, по-порядку.

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

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

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

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

while <умова> do

begin

тіло циклу

end;

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

Завдання 34

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

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

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

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

program suma_chysel;

var x,y,n,i,s:integer;

begin

writeln('Введіть перше число діапазону');

readln(x);

writeln('Введіть інтервал');

readln(y);

s:=0;

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

{Вираховуємо різницю між першим числом ряду і останнім додатним числом, ділимо

її на фрагменти по у, відкидаємо дробову частину частки і додаємо 1, для

врахування самОго першого числа ряду}

for i:=1 to n do

begin

s:=s+x;

x:=x-y;

end;

writeln(s)

end.

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

program suma_chysel_1;

var x,y,s:integer;

begin

writeln('Введіть перше число діапазону');

readln(x);

writeln('Введіть інтервал');

readln(y);

s:=0;

while x>0 do

begin

s:=s+x;

x:=x-y;

end;

writeln(s)

end.

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

Цикл з післяумовою

Цей тип циклу працює з точністю до навпаки. Тут умова стоятиме ПІСЛЯ тіла циклу і сам цикл працює за сумним принципом, притаманним, на жаль, вчинкам багатьох з нас: "спочатку робимо, а потім думаємо". Спочатку виконується тіло циклу, а потім перевіряється, чи досягнуто потрібного результату. Якщо потрібного результату НЕ досягнуто (умова циклу НЕ ВИКОНУЄТЬСЯ), тоді тіло циклу запускається знову і далі знову перевіряється, чи досягнуто умови циклу і т.д. Як тільки умова циклу почала виконуватися - все: цикл на цьому завершується, відбувається вихід з циклу і виконуються команди, розміщені після циклу.

Через те, що тіло цього типу циклу розміщене ДО перевірки умови, то його інколи називають "цикл-до".

Цикл з післяумовою в Pascal оформлюється так:

repeat

begin

тіло циклу

end

until <умова>;

(з англ. repeat - повторити, until - доки, не раніше як)

Після repeat крапка з комою не ставиться, перед until крапку з комою можна не ставити, а тіло циклу за будь-якої кількості команд у ньому в операторні дужки begin...end можна не брати взагалі.

Ну й тепер створимо програму до розв'язання попередньої задачі з використанням циклу з післяумовою. Для цього потрібно буде дещо змінити. Ця зміна стосуватиметься умови циклу. Оскільки цикл repeat працює на невиконанні умови, то в умову слід записати ті значення змінної х, які нам НЕ ПОТРІБНІ, тобто, від'ємні числа і число 0:

program suma_chysel_2;

var x,y,s:integer;

begin

writeln('Введіть перше число діапазону');

readln(x);

writeln('Введіть інтервал');

readln(y);

s:=0;

repeat

s:=s+x;

x:=x-y

until x<=0;

writeln(s)

end.

Як бачимо, усі ТРИ типи циклів (і цикл for, і цикл while, і цикл repeat) успішно "справляються" з нашою задачею, а тому немає жодного значення, який з типів циклів використовувати. Головне - правильний результат. А про особливості заміни одного типу циклу на інший - на схемі нижче:

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

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

Завдання 35

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

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

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

program suma_riadu_1; //реалізація за допомогою циклу while

var a,b,d,s:real;

begin

writeln('Введіть перше число');

readln(a);

writeln('Введіть останнє число');

readln(b);

writeln('Задайте інтервал');

readln(d);

s:=0;

while a<=b do

begin

s:=s+a;

a:=a+d

end;

writeln(s)

end.

program suma_riadu_2; //реалізація за допомогою циклу repeat

var a,b,d,s:real;

begin

writeln('Введіть перше число');

readln(a);

writeln('Введіть останнє число');

readln(b);

writeln('Задайте інтервал');

readln(d);

s:=0;

repeat

s:=s+a;

a:=a+d

until a>b;

writeln(s)

end.

ПІДСУМКИ

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

  • Цикл - це така форма організації запису програми, яка дозволяє повторювані дії записати тільки один раз.

  • Будь-який цикл складається з умови й тіла циклу.

  • Умова визначає, коли цикл запуститься і коли робота циклу припиниться. Умова може бути розміщена і на початку структури циклу, і в кінці.

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

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

  • Цикли з лічильником дозволяють реалізувати цикл, в якому заздалегідь відома кількість повторів (їх ще називають ітераціями) тіла циклу.

  • Якщо кількість повторів зарані визначити неможливо, тоді використовують цикли з умовою.

  • Цикли з умовою поділяються на цикли з передумовою (спочатку перевірка умови, а потім виконання тіла циклу) і на цикли з післяумовою (спочатку виконується тіло циклу, а потім відбувається перевірка умови).

  • З урахуванням вищезазначеного, в циклі з передумовою, може скластися така ситуація, що тіло циклу не буде виконане жодного разу. Натомість, в циклі з післяумовою, тіло циклу, принаймні, один раз буде виконане завжди.

  • Основна відмінність циклу while від циклу repeat полягає в тому, що тіло циклу while виконується доти, доки виконується умова, а тіло циклу repeat виконується доти, доки умова не почне виконуватися.

  • Цикли while і repeat взаємозамінні, для цього потрібно тільки переформулювати умову. Цикл for теж можна переформулювати як цикл while або цикл repeat, а от з циклу з умовою можна зробити цикл з лічильником тільки в тому разі, якщо можна прорахувати кількість ітерацій циклу.

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

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

Підказки

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

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

УСПІХУ! ✌