Пошук

Показ дописів із міткою циклы. Показати всі дописи
Показ дописів із міткою циклы. Показати всі дописи

неділя, 10 січня 2010 р.

X. Впорядкування масивів (вступна частина)

Найбільш відомим обмінним сортуванням є метод «бульбашки».

У ньому при послідовному проході по масиву порівнюються два сусідніх елементи. Якщо їх розміщення є неправильним (наприклад, при впорядкуванні за зростанням лівий елемент більший за правий), виконується взаємообмін елементів. Процес повторюється щонайменше N-1 разів, де N – кількість елементів у масиві.

Найпростіший алгоритм «бульбашки» має наступний вигляд:

Текст програми:

Program Bubble_1; {Сортування за зростанням}

Const N=20;

Var Mas:array[1..N] of integer;

i, j:integer; {i, j – змінні циклу)

Rez: integer; {Rez – додаткова змінна для обміну елементів масиву між собою}

Begin

For i:=1 to N do

For j:=1 to N–1 do

If Mas[j]>Mas[j+1] Then

Begin

{Обмін елементів масиву через третю змінну)

Rez:=Mas[j]; Mas[j]:=Mas[j+1]; Mas[j+1]:=Rez;

End;

End.

 

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

Програма, що реалізує описаний алгоритм має наступний вигляд:

Текст програми:

Program Bubble_2; {Сортування за зростанням}

Const N=20

Var Mas:аrray[1..N] of integer;

і, j:integer; {i, j – змінні циклу)

Rez:integer; {Rez – додаткова змінна для обміну елементів масиву між собою}

Begin

For i:=1 to N do

For j:=1 to N–i do

If Mas[j]>Mas[j+1] then

Begin

{Обмін елементів масиву через третю змінну}

Rez:=Mas[j]; Mas[j]:=Mas[j+1]; Mas[j+1]:=Rez;

End;

End.

Зверніть увагу, що в цьому алгоритмі у вкладеному циклі, що безпосередньо здійснює порівняння елементів, змінна циклу змінюється за іншим законом, ніж у попередньому випадку: від 1 до N–i, де і – змінна циклу зовнішньої команди повторення.

Другий метод модифікації алгоритму «бульбашки» полягає в тому, що ми вводимо додаткову змінну булівського типу (так званий прапорець), яка фіксуватиме при черговому проході була здійснена хоча б одна перестановка елементів чи ні. Адже очевидно, що якщо при черговому проході не відбулося жодної перестановки, то масив уже відсортований і процес перегляду можна припинити. Домовимось вважати прапорець «опущеним» (тобто рівним значенню false), якщо перестановки не відбулося, і «піднятим» (рівним true) – у протилежному випадку. Крім того, як і в попередньому випадку, після кожного проходу по масиву найбільший елемент «спливає» угору, тобто займає своє позицію. Тому вводимо додаткову змінну k, що фіксує праву границю впорядкованості, тобто при першому проході k = 1 і ми впорядковуємо всі елементи від 1 до N–1, на другому проході k = 2 і будуть впорядковуватись усі елементи від 1 до N–2 (останній елемент уже впорядкований) і так далі.

Текст програми:

Program Bubble_3; {Сортування за зростанням}

Const N=20;

Var Mas:array[1..N] of integer;

i,j,k:integer; {i, j – змінні циклу,

k – змінна, що фіксує праву границю впорядкування}

Rez:integer; {Rez – додаткова змінна для обміну елементів масиву між собою}

Flag:Boolean; {Flag – змінна, що фіксує перестановку}

Begin

k:=1;

Repeat

Flag:=false; {Робимо припущення, що масив відсортований, а потім перевіряємо, чи правильним було це припущення, тобто чи немає серед елементів таких, що неправильно розташовані, якщо такі елементи будуть, то ми їх переставляємо і Flag присвоюємо значення true}

For і:=1 to N–k do

If Mas[i]>Mas[i+1] Then

Begin

{Обмін елементів масиву через третю змінну}

Rez:=Mas[i];

Mas[і]:=Mas[i+1];

Mas[i+1]:=Rez;

Flag:=true;

End;

k:=k–1;

Until Flag = false;

End.

 

Другим методом сортування є метод прямого вибору. Один з його різновидів полягає в тому, що вибирається мінімальний елемент масиву, а потім виконується його обмін з першим елементом таблиці. Після цього перший елемент вважається впорядкованим і процес повторюється для підмасиву, що містить на один елемент менше за початковий, тобто елементи з 2-го до останнього. Процес повторюється кожен раз для масиву, зменшеного на один елемент. Закінчується він тоді, коли невпорядкований підмасив стає довжиною в один елемент. Таким чином, загальна кількість повторень дорівнює, як і в попередньому випадку, N-1 (N – кількість елементів масиву).

Текст програми:

Program Selection;

Const N=20;

Var Mas:array[1..N] of integer;

і, j, Min, N_Min:integer;

Begin

For i:=1 to N–1 do

Begin

Min:=Mas[x]; {Зберігання еталону мінімуму}

N_Min:=i; {Зберігання номера мінімуму}

For j:=i+1 to N do

If Mas[j]

Begin

Min:=Mas[j]; {Перевизначекня еталону}

N_Min:=j; {Зберігання номеру еталону}

End;

{Обмін місцями мінімуму та першого елементу підмасиву}

Mas[N_Min]:=Mas[i];

Mas[i]:=Min;

End;

End.

Зверніть увагу, що пошук мінімуму в програмі організований стандартно, тобто перший елемент береться за еталон, а потім порівнюється з усіма останніми і, якщо новий елемент виявляється меншим за еталон, то еталон переприсвоюється. Крім цього, в алгоритмі запам’ятовується місце знаходження цього мінімального елемента для того, щоб після виходу з циклу можна було обміняти місцями знайдений мінімум і перший елемент підмасиву. Але оскільки підмасив увесь час змінює свій розмір, за еталон береться перший елемент саме того підмасиву, який розглядається на наступному кроці, тобто i-ий елемент початкового масиву
(і – змінна зовнішнього циклу, що вказує на початок нового підмасиву на кожному кроці).

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

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

12 -8 0 30 5 100

Розбиваємо його на дві частини. До першої входить єдиний впорядкований елемент {12}, а до другої – всі останні {-8 0 30 5 100}. Запишемо тепер процес впорядкування по етапах:

І етап: елемент, що впорядковується = -8.

1) -8 <>

-8 12 0 30 5 100

На цьому цикл припиняє свою роботу, тому що досягнуто початку масиву (і=1).

II етап: елемент, що впорядковується = 0.

1) 0 <>

-8 0 12 30 5 100

2) 0 > -8, значить обмін не виконується, здійснюється вихід із циклу, масив залишається без змін.

III етап: елемент, що впорядковується = 30.

1) 30 > 12, вхід до циклу не відбувається, масив залишається без змін.

IV етап: елемент, що впорядковується = 5.

1) 5 <>

–8 0 12 5 30 100

2) 5 <>

–8 0 5 12 30 100

3) 5 > 0, цикл припиняє свою роботу, масив залишається без змін.

V етап: елемент, що впорядковується = 100.

1) 100 <>

Текст програми:

Program Insert;

Const N=20;

Var Mas:array[1..N] of integer;

і, j, Rez:integer;

Begin

For i:=2 to N do

Begin

j:=i; {Цикл працює, доки лівий елемент більший за правий та доки не досягнуто початок масиву}

While (j>1) and (Mas[j] <>

Begin

Rez:=Mas[j]; Mas[j]:=Mas[j–1]; Mas[j–1]:=Rez; j:=j–1;

End;

End;

End.

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

ЗАДАЧА № 38

Постановка задачі:

Перевірка коректності введення. Дано три числа, що задають величини кутів трикутника. Визначити, чи можна побудувати трикутник, що має задані кути. Якщо ні, користувач повинен ввести інші дані.

Текст програми:

Program Task_38;

Uses crt;

Var a, b, c: integer;

Begin

Clrscr;

Repeat

Write(‘Введіть величини кутів трикутника: ‘);

Readln(а, b, с);

Until (a>0)and(b>0)and(c>0)and(a+b+c)=180;

End.

ЗАДАЧА № 39

Постановка задачі:

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

Аналіз алгоритму:

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

Текст програми:

Program Task_39;

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 Sum>S;

Writeln(‘Постраждає ‘, N,‘–й пасажир.‘);

Readkey;

End.

ЗАДАЧА № 40

Постановка задачі:

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

Аналіз алгоритму:

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

Текст програми:

Program Task_40;

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.

ЗАДАЧА № 41

Постановка задачі:

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

Аналіз алгоритму:

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

Текст програми:

Program Task_41;

Uses crt;

Var X, N:real; {X – початковий внесок, N – бажана сума}

Rez :real; {Rez – результуюча сума на рахунку}

Years:longint; {Years – термін, протягом якого сума перебувала в банку}

Begin

Clrscr;

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

Readln(X);

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

Readln(N);

If N<=X Then writeln(‘Bи вже маєте бажану суму!’)

Else

Begin

Rez:=X;

Years:=0;

Repeat

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

Years:=Years+l;

Until Rez>=N;

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

End;

Readkey;

End.

ЗАДАЧА № 42

Постановка задачі:

Скласти програму, яка б допомогла працівникам ДАІ визначати кількість порушників перевищення швидкості на трасі, якщо відомо, що на даному проміжку траси встановлено обмеження на швидкість Vmax, a прилад фіксує швидкість автомобілів V1 V2, . . . , Vn.


Аналіз алгоритму:

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

Текст програми:

Program Task_42;

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.

ЗАДАЧА № 43

Постановка задачі:

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

Аналіз алгоритму:

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

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

Текст програми:

Program Task_43;

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.

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

ЗАДАЧА № 32

Постановка задачі:

Дано натуральне число N. Визначити кількість цифр у числі.

Текст програми:

Program Task_32;

Uses crt;

Var N: longint; Counter: integer;

Begin

Clrscr;

Write(‘Введіть число: ’);

Readln(N);

Counter:= 0;

While N > 0 do

Begin

Counter:=Counter+1; {Підрахунок кількості цифр}

N:=N div 10; {Відкидання останньої цифри}

End;

Writeln(‘Кількість цифр у заданому числі дорівнює ’, N);

Readkey;

End.

ЗАДАЧА № 33

Постановка задачі:

Коли Василині Премудрій виповнилося 18 років, Чахлик Невмирущий вирішив одружитися з нею. Василина запитала Чахлика, скільки у нього скринь із золотом. Чахлик відповів, що зараз у нього n скринь і щороку додається ще по т скринь. Василина пообіцяла, що вийде заміж тоді, коли у Чахлика буде k повних скринь із золотом. Скільки років буде тоді нареченій?

Текст програми:

Program Task_33;

Uses crt;

Var

m, n, k:word;

{n – початкова кількість скринь із золотом,

 m – щорічний «прибуток» Чахлика,

 k – «потреби» Василини Премудрої}

Sum, Years:word;

{Sum – щорічне накопичення Чахлика,

 Years – вік Василини Премудрої}

Begin

Clrscr;

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

Readln(n);

Write (‘Введіть щорічний прибуток Чахлика: ‘);

Readln(m);

Write(‘Введіть «потреби» Василини Премудрої: ‘);

Readln(k);

Sum:=n;{Початковий «капітал» Чахлика}

Years:=18;{Початковий вік Василини}

While Sum<=k do

Begin

Sum:=Sum+m;

Years:=Years+1;

End;

Writeln(‘Василині вже виповнилося ‘, Years, ‘ років.‘);

Readkey;

End.

ЗАДАЧА № 34

Постановка задачі:

Дано натуральне число п. Визначити суму цифр у числі.

Аналіз алгоритму:

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

123 div 10 = 12

3928 mod 10 = 8.

Процес буде повторюватись, доки від числа «нічого не залишиться», тобто, доки воно не перетвориться на нуль.

Текст програми:

Program Task_34;

Uses crt;

Var n:longint; {N – дане число}

Sum:byte; {Sum – сума цифр числа}

Begin

Clrscr;

Sum:=0; {Сума цифр числа спочатку дорівнює 0}

Write(‘Введіть ціле число: ‘);

Readln(N);

N:=abs(N);

While N>0 do

Begin

Sum:=Sum+N mod 10; {Знаходження суми цифр}

N:=N div 10; {«Відкидання» останньої цифри числа}

End;

Writeln(‘Сума цифр = ‘, Sum);

Readkey;

End.

ЗАДАЧА № 35

Постановка задачі:

Дано ціле число т > 1. Знайти найбільше число k, при якому виконується умова 4k < т.

Текст програми:

Program Task_35;

Uses crt;

Var m, k, Rez:longint; {Rez – обчислення степеню 4}

Begin

Clrscr;

Write(‘Введіть значення m (m>1): ‘);

Readln(m);

Rez:=1;

k:=0;

While Rez

Begin k:=k+l; Rez:=Rez*4; End;

Writeln(‘k = ‘, k) ;

Readkey;

End.

ЗАДАЧА № 36

Постановка задачі:

Обчислити суму ряду  з точністю ε.

Аналіз алгоритму:

Під час обчислення результатів деяких експериментів виникає необхідність отримання результату із заданою похибкою. Нехай результатом є нескінченна сума, що задається певною формулою, і відома похибка ε (ε > 0) для знаходження наближеного значення результату. Будемо вважати, що необхідна точність досягнута, коли додавання наступного доданку змінює суму на величину, меншу за ε.

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

Текст програми:

Program Task_36;

Uses crt;

Var і:word;

S, Epsilon:real; {S – результат обчислень, Epsilon – похибка}

Begin

Clrscr;

S:=0; {Початкове значення дорівнює 0,

тому що результат є накопиченням суми}

Write(‘Введіть значення похибки (Е>0): ‘);

Readln(Epsilon);

і:=1;

While 1/sqr(i)>Epsilon do

Begin S:=S+1/sqr(i); i:=i+1; End;

Writeln(‘Сума ряду = ‘, S:8:2);

Readkey;

End.

ЗАДАЧА № 37

Постановка задачі:

Обчислити значення числа π, використовуючи формулу

Знайти, кількість доданків що дає значення числа π з точністю до 3 знаків.

Аналіз алгоритму:

Для організації циклу з передумовою в цій задачі необхідно мати еталон числа π для порівняння з нескінченною сумою. Візьмемо за цей еталон значення вбудованої функції Рі. Крім того, за умовою задачі нам необхідно отримати результат із точністю до третьої цифри після коми. Пропоную для цього стандартне число π і отриману нескінченну суму помножити на число 1000 та округлити результат за допомогою функції round (отриману суму, крім того, необхідно ще помножити на 4, оскільки сама сума є чвертю числа π). Зверніть увагу також на те, що в нескінченній сумі доданки, що стоять на парних місцях, додаються зі знаком «+», а доданки на непарних місцях – віднімаються від суми. Тобто, залежно від номера доданку (парний чи непарний) ми організовуємо знакочергування у нескінченній сумі.

Текст програми:

Program Task_37;

Uses crt;

Var і, n:word; {і – параметр циклу, n – кількість доданків}

Rez_Pi:real; {Rez_Pi – обчислене значення числа Рі}

Begin

Clrscr;

Rez_Pi:=0;

і: =1; {і – значення знаменника першого доданка}

n:=0; {n – доданків ще нема}

while round(pi*1000)=round(Rez_Pi*4000) do

Begin

If n mod 2=0 Then Rez_Pi:=Rez_Pi+1/i

Else Rez_Pi:=Rez_Pi–1/i;

i:=i+2;

n:=n+1;

End;

Writeln(‘Кількість необхідних доданків: ‘, n);

Writeln(‘Порівняйте значення Рі: ‘);

Writeln(‘  Результат обчислень програми: ‘, Rez_Pi:10:8);

Writeln(‘  Вбудована функція: ‘ , Рі:10:8);

Readkey;

End.

IV. Цикли з параметром

ЗАДАЧА № 26

Постановка задачі:

Знайти суму всіх натуральних чисел від 1 до 100.

Текст програми:

Program Task_26;

Uses crt;

Var Sum, i: integer;

Begin

Clrscr;

Sum:= 0;

For i:= 1 to 10 do

Sum:= Sum + i;

Writeln(‘Сума = ‘, Sum);

Readkey;

End.

ЗАДАЧА № 27

Постановка задачі:

Компанія бабусь поїхала на мотоциклах на курси комп’ютерної грамотності. Попереду на мотоциклі без глушника їхала одна бабуся, за нею – дві, потім – три і т. д. Скільки бабусь їхало на заняття, якщо приголомшені пішоходи всього нарахували N рядів? Чи змогли бабусі зайняти всі місця у класі, якщо там стояло k рядів по m комп’ютерів у кожному? Скільки вільних місць залишилося?

Аналіз алгоритму:

Зверніть увагу на те, що фактично ця задача зводиться до знаходження суми всіх натуральних чисел від 1 до N. У кінці задачі для повторення команди розгалуження учням пропонується визначити кількість зайнятих бабусями та вільних місць.

Текст програми:

Program Task_27;

Uses crt;

Var I, N, Sum:word;{I – параметр циклу, N – кількість рядів мотоциклів, Sum – кількість бабусь, що приїхали на курси}

Place, k, m:word; {k – кількість рядів у комп’ютерному класі, m – кількість комп’ютерів у кожному ряду, Place – кількість місць, якої вистачило для бабусь}

Begin

Clrscr;

Sum:=0;

Write(‘Введіть кількість рядів мотоциклів: ‘);

Readln(N);

For I:=1 to N do Sum:=Sum+I;

Writeln(‘Кількість бабусь, що приїхали на курси = ‘, Sum);

Writeln(‘Кількість комп”ютерів на курсах: ‘, k*m) ;

If Sum

Else Writeln(‘Бабусі зайняли всі місця. ‘);

Place:=Sum – k*m;

If Place>0 Then Writeln(‘Бабусям не вистачило ‘, Place, ‘ місць.’);

Readkey;

End.

ЗАДАЧА № 28

Постановка задачі:

Знайти значення виразу (1 + 0,1)(2 + 0,2)×…×(9 + 0,9).

Аналіз алгоритму:

У даному випадку кількість повторів буде дорівнювати 9.

Текст програми:

Program Task_28;

Uses crt;

Var I:word; {I – параметр циклу}

Rez:real; {Rez – результат обчислень}

Begin

Clrscr;

Rez:=1; {Початкове значення дорівнює 1, тому що результат є накопиченням добутку}

For I:=1 to 9 do Rez:=Rez*(I+0.1*I);

Writeln(‘Rez= ‘, Rez:8:2);

Readkey;

End.

ЗАДАЧА № 29

Постановка задачі:

Дано ціле п. Визначити п!

Аналіз алгоритму:

Відомо, що n! (вимовляється як n–факторіал) – це добуток усіх натуральних чисел від 1 до п.

Текст програми:

Program Task_29;

Uses crt;

Var I, n:word; {I – параметр циклу}

Factorial:longint; {Factorial – результат обчислень}

Begin

Clrscr;

Factorial:=1;

Write(‘Введіть значення n: ‘);

Readln(n);

For I:=1 to n do Factorial:=Factorial*I;

Writeln(‘Факторіал = ‘, Factorial:8:2);

Readkey;

End.


ЗАДАЧА № 30

Постановка задачі:

За даним натуральним значенням змінної п обчислити:

Аналіз алгоритму:

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

Текст програми:

Program Task_30;

Uses crt;

Var I, n:word;{I – параметр циклу}

Rez:real;{Rez – результат обчислень}

Begin

Clrscr;

Rez:=0; {Початкове значення дорівнює 0, тому що результат є накопиченням суми}

Write(‘Введіть значення n: ’);

Readln(n);

For I:=1 to n do Rez:=sqrt(2+Rez);

Writeln(‘Rez= ‘, Rez:8:2);

Readkey;

End.

ЗАДАЧА № 31

Постановка задачі:

Дано ціле число п, яке набуває значень шкільних оцінок. Визначити відповідною кількістю звукових сигналів, яка саме оцінка була задана («1» – один звуковий сигнал, «2» – два сигнали і т.д.). Якщо ж задане число не відповідає значенню шкільної оцінки – подати довгий звуковий сигнал.

Аналіз алгоритму:

Звуковий сигнал у цій програмі можна подавати за допомогою процедур керування вбудованим динаміком sound та nosound. Перша з них викликає звучання ноти заданої частоти (частота вказується в дужках після процедури), а друга виключає динамік. Тривалість звучання та паузи між звуками можна задавати процедурою delay, параметром якої є змінна time (значення цієї змінної можна задати командою присвоєння або введенням із клавіатури).


Текст програми:

Program Task_31;

Uses crt;

Var I, n:word; {I – параметр циклу, n – оцінка учня}

Time:word;

Begin

Clrscr;

Write(‘Введіть Вашу оцінку: ‘);

Readln(n);

Time:=10000;

{Значення цієї змінної залежить від характеристик комп’ютера, і може бути підібране практичним шляхом}

If (n<1)>12) Then

begin

Writeln(‘Ви помилились, такої оцінки не існує. ‘);

Sound(200); Delay (time*5); nosound;

end

Else

For I:=1 to n do

Begin

Sound(200); Delay(time);

Nosound; Delay(time);

End;

Readkey;

End.