52841.fb2 Я готуюсь до курсу інформатики. Алгоритмізація та програмування - читать онлайн бесплатно полную версию книги . Страница 22

Я готуюсь до курсу інформатики. Алгоритмізація та програмування - читать онлайн бесплатно полную версию книги . Страница 22

УРОК 21. Цикли з післяумовою

Мета уроку: навчити використовувати цикл з післяумовою для розв’язування типових задач.

На початку уроку рекомендується повторити типи циклів, формати опису та порівняльну характеристику циклів. Далі можна розглянути деякі типові задачі з використанням циклу з післяумовою. Нагадуємо, що в усіх цих задачах кількість повторень заздалегідь невідома і тому, фактично, основним длярозв ‘язку цієї задачі є правильно підібрати умову виходу з циклу.

ЗАДАЧА №179

Умова задачі: На дверях ліфта висіло загрозливе попередження про те, що двері самі зачиняються в той самий момент, коли зайвий за вагою пасажир переступить поріг ліфта. Котрий пасажир постраждає, якщо ліфт витримує вагу не більше S кг, а вага пасажирів, що стоять у черзі до ліфта, дорівнює відповідно a1, а2, а3, ... ап?

Розв’язання: У цій задачі зручніше використовувати цикл з післяумовою, тому що спочатку необхідно дати можливість «увійти» пасажиру в ліфт, а потім перевіряти, чи витримає його ліфт. Умовою виходу з циклу буде перевищення сумарної ваги пасажирів, що увійшли в ліфт, деякого заданого критичного значення. Для зберігання ваги чергового пасажира в цій задачі ми будемо використовувати одну й ту саму змінну (А), оскільки після перевірки вага пасажира нас уже не цікавить. Програма має вигляд:

Program Ехаmрlе_179;

Uses crt;

Var N:word; {I - номер пасажира, що увійшов у ліфт}

Sum,A,S:real; {Sum - сумарна вага пасажирів, що знаходяться в ліфті, А - вага чергового пасажира, що увійшов до ліфта, S - критична вага, що може бути піднята ліфтом}

Begin

Clrscr;

Sum:=0;

N:=0; {На початху роботи програми в ліфті немає пасажирів}

Write(‘Введіть критичну вагу, що піднімає ліфт: ‘);

Readln(S);

Repeat

Write(‘Введіть вагу чергового пасажира: ‘);

Readln(A);

Sum:=Sum+A;

N:=N+1;

Until Sun>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 Sun<=0;

Writeln(‘Папуга знущався над дідусем ‘,Day,’ днів.’);

End;

Readkey;

End.

ЗАДАЧА №209

Умова: На скільки років необхідно покласти в банк суму X грошових одиниць, щоб одержати суму N грошових одиниць (N > X), якщо банк нараховує 200 % річних?

Розв’язання.Очевидно, що умовою виходу з цього циклу буде отримання заданої суми грошей. Якщо за умовою задачі N > X, то кожну перевірку ми будемо виконувати після того, як до вкладеної суми додамо щорічний банківський процент. Отже, програма має вигляд:

Program Example_209;

Uses crt;

Var X,N:real; {X - початковий внесок, N - бажана сума} Rezrreal; {Rez - результуюча сума на рахунку} Years:longint; {Years - термін, протягом якого сума перебувала в банку}

Begin

Clrscr;

Write(‘Введіть початкову суму внеску: ‘);

Readln(X);

Write(‘Введіть бажану суму внеску: ‘);

Readln(N);

If N<=X

Then writeln(‘Bn вже маєте бажану суму!’)

Else

Begin

Rez:=X;

Years:=0;

Repeat

Rez:=3*Rez;

{200% річних збільшують за рік внесок втричі}

Years:=Years+l;

Until Rez>=N;

Writeln( ‘Ви отримаєте бажану суму через ‘,years,’ років’) ;

End;

Readkey;

End.

ЗАДАЧА №231

Умова: Скласти програму, яка б допомогла працівникам ДАІ визначати кількість порушників перевищення швидкості на трасі, якщо відомо, що на даному проміжку траси встановлено обмеження на швидкість Vmax, a прилад фіксує швидкість автомобілів 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.

ЗАДАЧА №251

Умова: Дано натуральне число п і дійсні числа а1 а2, .... ап. Відомо, що в заданій послідовності є хоча б одне нульове значення. Розглядаючи члени послідовності, що розташовані до першого нульового члена, визначити середнє арифметичне членів.

Розв ‘язання: Для розв’язку цієї задачі значення п є зайвим, якщо серед членів послідовності буде хоча б один нульовий елемент, тому ми враховувати цю змінну не будемо (хоча дітям можна пояснити, що у випадку відсутності нульового члена послідовності змінна n може використовуватись як додаткова для виходу з циклу, щоб виключити зациклення програми).

Отже, оскільки ми не знаємо, коли зустрінеться нульовий елемент, у програмі знаходиться сума всіх чисел послідовності (змінна sum) та кількість введених чисел (змінна count), а після виходу з циклу вже знаходиться безпосередньо середнє арифметичне членів послідовності як результат ділення суми на кількість чисел, зменшену на одиницю. Зменшення на одиницю відбувається тому, що фактично в тілі циклу буде підраховано один зайвий нульовий елемент (останній).

Програма має вигляд

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.

Домашнє завдання:

• Повторити теоретичний матеріал із роботи циклу з післяумовою;

• Виконати задачі №185, №187, №208(5), №234(4), №239(4), №251(4).