Пошук

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

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

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.