На початку уроку рекомендується повторити типи циклів, формати опису та
порівняльну характеристику циклів. Далі можна розглянути деякі типові задачі з
використанням циклу з післяумовою.
Нагадуємо, що в усіх цих задачах кількість
повторень заздалегідь невідома і тому, фактично, основним для розв'язку цієї
задачі являється правильно підібрати умову виходу з циклу.
Задача №179.
Умова: На дверях ліфта висіло загрозливе
попередження про те, що двері зачиняються самі в той самий момент, коли зайвий
за вагою пасажир переступить поріг ліфта. Котрий пасажир постраждає, якщо ліфт
витримує вагу не більше S кг, а вага пасажирів, що стоять у черзі до
ліфта, дорівнює відповідно a1, a2, a3, … an?
В
цій задачі зручніше використовувати цикл с післяумовою, тому що спочатку
необхідно дати можливість "ввійти" пасажиру в ліфт, а потім перевіряти, чи
витримає його ліфт. Умовою виходу з циклу буде перевищення сумарної ваги
пасажирів, що увійшли в ліфт, деякого заданого критичного значення. Для
зберігання ваги чергового пасажиру в цій задачі ми будемо використовувати одну й
ту саму змінну (А), так як після перевірки вага пасажира нас вже не
цікавить.
Program Example_179;
Uses crt;
Var N:word; {I – номер пасажира, що увійшов у
ліфт}
Sum,A,S:real; {Sum – сумарна вага пасажирів, що
знаходяться в ліфті, A – вага
чергового пасажира, що увійшов до
ліфта, S – критична вага, що може
бути піднята ліфтом}
Begin
Clrscr;
Sum:=0; {На початку роботи програми в ліфті
N:=0; немає пасажирів}
Write(‘Введіть критичну вагу, що піднімає ліфт: ’);
Readln(S);
Repeat
Write(‘Введіть вагу чергового пасажира: ’);
Readln(А);
Sum:=Sum+А;
N:=N+1;
Until Sum>S;
Writeln(‘Постраждає ’,N,’-й пасажир.’);
Readkey; {Затримка зображення на екрані}
End.
Задача №181.
Умова: Капосний папуга навчився висмикувати у
дідусі Василя волосся, яке ще залишилося у того на голові. Почавши з однієї
волосини, він щодня збільшував порцію вдвічі. Через скільки днів дідусеві не
знадобиться гребінець, якщо спочатку в нього на голові було аж N
волосин?
Аналогічно попередній задачі, аналізувати наявність волосся на
голові необхідно після того, як папуга вже висмикнув чергову порцію волосся. А
"знущання" над дідусем скінчиться тоді, коли гребінець йому стане непотрібним,
тобто кількість волосся на голові стане дорівнювати нулю.
Зверніть увагу, що
в цій задачі змінна S використовується для підрахунку чергової порції
волосся, що підлягає висмикуванню капосним папугою.
Program Example_181;
Uses crt;
Var S,N,Sum:longint; {S – кількість волосся, що буде
висмикнуто, Sum – кількість
волосся, що залишилося в
дідуся на голові, N –
початкова кількість волосся}
Day:word; {Day – номер дня, який папуга
знущається над дідусем}
Begin
Clrscr;
Write(‘Введіть початкову кількість волосся в дідуся
на голові: ’);
Readln(N);
If N=0
Then writeln(‘Дідусь вже лисий, папузі нічого робити!’)
Else
begin
Day:=0;
Sum:=N;
S:=1; {Початкова кількість волосся, що
буде висмикнутою капосним папугою}
Repeat
Sum:=Sum-S; {Зменшення дідусевого волосся}
S:=S*2;
Day:=Day+1; {Підрахунок номера дня}
Until Sum<=0;
Writeln(‘Папуга знущався над дідусем ’,Day,’ днів.’);
End;
Readkey; {Затримка зображення на екрані}
End.
Задача №197(1).
Умова: Дано натуральне число n.
Визначити кількість цифр у цьому числі.
Для розв'язання цієї задачі можна
використати як цикл з передумовою, так і цикл с післяумовою. Однак, на наш
погляд, другий варіант кращий, тому що навіть число "0" має у своєму складі одну
цифру, а цикл з передумовою цей випадок пропустить. Справа в тому, що умовою
виходу з циклу і в тому, і в другому випадку буде "зникнення" числа, тобто
перетворення його на нуль після відкидання чергової цифри, а, якщо число с
самого початку дорівнює "0", то цикл з передумовою не виконається ні разу, а
цикл с післяумовою виконається обов'язково і підрахує одну цифру. Програма для
розв'язання цієї задачі має наступний вигляд:
Program Example_197_1;
Uses crt;
Var N:longint; {N – задане число}
Count:byte; {Count – кількість цифр в числі}
Begin
Clrscr;
Write(‘Введіть натуральне число: ’);
Readln(N);
N:=abs(N); {Знаходження модуля числа для
позбавлення від помилкового введення
ненатурального числа}
Count:=0; {Початкове значення кількості цифр}
Repeat
Count:=Count+1;
N:=N div 10; {“Відкидання” останньої цифри
числа після підрахунку}
Until N = 0;
Writeln(‘Кількість цифр в числі = ’,Count);
Readkey; {Затримка зображення на екрані}
End.
Задача №208(4).
Умова: Під час обчислення результатів деяких
експериментів виникає необхідність отримання результату із заданою похибкою.
Нехай результатом є нескінченна сума, що задається певною формулою, і відома
похибка e (e > 0) для знаходження наближеного значення
результату. Будемо вважати, що необхідна точність досягнута, коли додавання
наступного доданку змінює суму на величину, меншу за e. Обчислити:
В даній
задачі ми візьмемо додаткову змінну (S), яка буде зберігати наступний
доданок до нескінченої суми. Умовою виходу з циклу буде зменшення величини цього
доданку до значення e по модулю. Зверніть увагу ще на те, що вираз фактично
призводить до знакочергування в нескінченній сумі, тому, щоб не знаходити
степінь числа -1 можна враховувати номер доданку і, якщо він буде парним,
віднімати черговий доданок, якщо ні - додавати.
Program Example_208_4;
Uses crt;
Var i:word; {i – номер доданка}
S,Sum:real; {S – черговий доданок, Sum –
нескінченна сума}
Epsilon:real; {Epsilon – задана похибка
обчислень}
Begin
Clrscr;
Write(‘Введіть значення похибки: ’);
Readln(Epsilon);
Sum:=0; {Початкове значення дорівнює 0 для
накопичення суми}
S:=1; {Перший доданок нескінченної суми за
умовою дорівнює “1”}
i:=1;
repeat
if i mod 2 =0
then Sum:=Sum + 1/S
else Sum:=Sum - 1/S;
i:=i+1;
S:=S*i;
until 1/S<=Epsilon;
Writeln(‘Результат обчислень = ’,Sum:8:2);
Readkey; {Затримка зображення на екрані}
End.
Задача №209.
Умова: На скільки років необхідно покласти в
банк суму Х грошових одиниць, щоб одержати суму N грошових одиниць
(N > X), якщо банк нараховує 200% річних?
Очевидно, що
умовою виходу з цього циклу буде отримання заданої суми грошей. Якщо за умовою
задачі N > X, то кожну перевірку ми будемо виконувати після
того, як до вкладеної суми додамо щорічний банківський процент.
Program Example_209;
Uses crt;
Var X,N:real; {X – початковий вклад, N – бажана
сума}
Rez:real; {Rez – результуюча сума на
рахунку}
Years:longint; {Years – термін, протягом якого
сума лежала в банку}
Begin
Clrscr;
Write(‘Введіть початкову суму вкладу: ’);
Readln(Х);
Write(‘Введіть бажану суму вкладу: ’);
Readln(N);
If N<=X
Then writeln(‘Ви вже маєте бажану суму!’)
Else
Begin
Rez:=X;
Years:=0;
Repeat
Rez:=3*Rez; {200% річних збільшують за рік
вклад втричі}
Years:=Years+1;
Until Rez>=N;
Writeln(‘Ви отримаєте бажану суму через ’,years,’ років.‘);
End;
Readkey; {Затримка зображення на екрані}
End.
Задача №231.
Умова: Скласти програму, яка б допомогла
працівникам ДАІ визначати кількість порушників перевищення швидкості на трасі,
якщо відомо, що на даному проміжку траси встановлено обмеження на швидкість
Vmax, а прилад фіксує швидкість автомобілів V1, V2, …,
Vn.
В даній задачі ніяким чином не обумовлена умова виходу з циклу,
тому є пропозиція: процес підрахування порушників необхідно закінчити тоді, коли
чергове введене число буде недодатнім (дійсно, з від'ємною або нульовою
швидкістю автомобіль рухатися не може). Для тимчасового зберігання швидкості
чергового водія ми будемо знову використовувати одну змінну. Програма, що
виконує задані обчислення, має наступний вигляд:
Program Example_231;
Uses crt;
Var V,Vmax:real; {V – швидкість чергового водія,
Vmax – максимально дозволена
швидкість}
Count:longint;{Count – кількість порушників}
Begin
Clrscr;
Count:=0; {На початку роботи порушники відсутні}
Write(‘Введіть значення максимально дозволеної швидкості: ’);
Readln(Vmax);
Vmax:=abs(Vmax); {Знаходження модуля для
виключення помилки введення
від’ємної максимальної
швидкості}
Repeat
Write(‘Введіть значення швидкості чергового водія: ’);
Readln(V);
If V>Vmax then Count:=Count+1;
Until V<=0;
Writeln(‘Кількість порушників ’,Count);
Readkey; {Затримка зображення на екрані}
End.
Задача №234(2).
Умова: Дано натуральні числа n i
a1, a2, …, an. Визначити кількість членів ak
послідовності a1, a2, …, an, що кратні числу 3 і не кратні
числу 7.
Взагалі цю задачу можна розв'язувати з використанням циклу з
параметром, так як на початку роботи програми задається число n, що
вказує кількість чисел, що вводяться. Але можна цю змінну використати для
організації циклу з післяумовою і отримати інший розв'язок задачі, що вам і
пропонується:
Program Example_234_2;
Uses crt;
Var n:word; {n – кількість чисел, що вводяться}
a,count:word; {a – змінна, що зберігає чергове
введене число; count – кількість
чисел, що задовольняє заданій
умові}
Begin
Clrscr;
count:=0; {На початку роботи кількість
знайдених чисел дорівнює 0}
Write(‘Введіть кількість чисел, що будуть вводитись: ’);
Readln(n);
Repeat
Write(‘Введіть чергове число: ’);
Readln(a);
If (a mod 3 = 0) and (a mod 7 <> 0)
Then count:=count+1;
n:=n-1;
Until n<0;
Writeln(‘Кількість шуканих чисел = ’,count);
Readkey; {Затримка зображення на екрані}
End.
Задача №251 (5).
Умова: Дано натуральне число n і
дійсні числа a1, a2, …, an (a1 < > 0). Відомо,
що в заданій послідовності є хоча б одне нульове значення. Розглядаючи члени
послідовності, що розташовані до першого нульового члена, визначити середнє
арифметичне членів.
Для розв'язку цієї задачі значення n, являється
зайвим, якщо серед членів послідовності буде хоча б один нульовий елемент, тому
ми враховувати цю змінну не будемо (хоча дітям можна пояснити, що у випадку
відсутності нульового члена послідовності змінна n може використовуватись
як додаткова для виходу з циклу, щоб виключити зациклення програми).
Зверніть
увагу на те, що так як ми не знаємо, коли зустрінеться нульовий елемент, в
програмі знаходиться сума всіх чисел послідовності (змінна Sum) та
кількість введених чисел ( змінна сount), а після виходу з циклу вже
знаходиться безпосередньо середнє арифметичне членів послідовності, як результат
ділення суми на кількість чисел, зменшену на одиницю. Зменшення на одиницю
відбувається тому, що фактично в тілі циклу буде підраховано один зайвий
нульовий елемент (останній)
Program Example_251_5;
Uses crt;
Var count:word; {count – кількість членів
послідовності до першого нульового
елемента}
a,Sum:real; {a – черговий член послідовності,
Sum – сума членів послідовності до
першого “0”}
SA:real; {SA – середнє арифметичне}
Begin
Clrscr;
Sum:=0;
count:=0; {Початкові значення дорівнюють “0”}
repeat
write(‘Введіть черговий член послідовності: ’);
readln(a);
Sum:=Sum+a;
count:=count+1;
until a=0;
SA:=Sum/(count-1);
Writeln(‘Середнє арифметичне = ’,SA:8:2);
Readkey; {Затримка зображення на екрані}
End.