Пошук

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

II. Алгоритми розгалуження

ЗАДАЧА № 11

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

Дано значення дійсних величин а, b, с. Знайти:


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

Використані у програмі змінні є очевидними. Тому програма наводиться без пояснень.

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

Program Task_11;

Uses crt;

Var а, b, с : real;

Rez1, Rez2, Min : real; {а, b, с – вхідні дані;

Rez1, Rez2 – проміжні обчислення;

Міn – результат виконання програми}

Begin

Clrscr;

Write(‘Введіть числа а, b, с: ‘);

Readln(a, b, c);

Rez1:=(a + b + с) / 2;

Rez2:=sqrt(1/(sqr(a)+1)+1/(sqr(b)+1)+1/(sqr(c)+1));

If Rez1

Writeln(‘Мінімум = ’, Min:8:2);

Readkey;

End.

ЗАДАЧА № 12

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

Дано значення дійсної величини х. Визначити:

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

На перший погляд діти можуть не зрозуміти, навіщо у цій задачі команда розгалуження. Треба їм нагадати відоме правило: ділити на нуль не можна. І тоді розв’язок стає очевидним.

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

Program Task_12;

Uses crt;

Var X, Rezultat:real;

Begin

Clrscr;

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

Readln(X);

If X*X*X+X–2<>0 Then

begin

Rezultat:=(X–5)/(X*X*X+X–2);

Writeln(‘Rezultat=’, Rezultat:8:2);

end

Else Writeln(‘Обчислення неможливі – ділення на нуль!’);

Readkey;

End.

ЗАДАЧА № 13

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

При даному значенні х обчислити

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

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

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

Program Task_13;

Uses crt;

Var X, Rezultat:real;

Begin

Clrscr;

Wrіte(‘Введіть значення Х: ’);

Readln(X);

If (X>=1) and (X*X*X–sqrt(X–1)>=0) Then

begin

Rezultat:=sqrt(X*X*X–sqrt(X–1));

Writeln(‘Результат = ’, Rezultat:8:2);

end

Else

Writeln(‘Обчислення неможливі – від’ємний підкореневий вираз!’);

Readkey;

End.

ЗАДАЧА № 14

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

За рейтинговою системою оцінка визначається таким чином: якщо загальний бал учня становить не менше 92% від максимального, то виставляється оцінка 12, якщо не нижче 70%,
то – оцінка 8, якщо ж не нижче 50%, то – оцінка 5, в інших випадках – оцінка 2. Визначте оцінку учня, якщо він набрав N балів, а максимальне значення загального балу становить S.

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

У цій задачі можна використати повну або скорочену форму команди розгалуження.

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

Program Task_14;

Uses crt;

Var N, S, Grade:integer; {N – бали, що набрав учень;

S – максимальне значення сумарного балу;
Grade – оцінка учня}

 

Begin

Clrscr;

Wrіte(‘Введіть максимальне значення сумарного балу, що може набрати учень: ‘);

Readln(S);

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

Readln(N);

If (S<=0) or (N<=0) or (N>S) Then writeln(‘Помилка вхідних даних’)

Else

Begin

N:=round(N/S*100);     {Знаходження відношення балів учня до максимально можливого}

If N>=92 then Grade:=12;

If (N<92)>=70) then Grade:=8;

If (N<70)>=50) then Grade:=5;

If N<50>

Writeln(‘Учень отримав оцінку: ’, Grade);

End;

Readkey;

End.

ЗАДАЧА № 15

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

На площині дано дві точки 1 у1 ) та 2, y2). Визначити, яка з них знаходиться далі від початку координат.

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

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

Очевидно, що відстань від початку координат до точки з координатами (х, у) буде обчислюватись наступним співвідношенням:

Зверніть увагу: в зв’язку з тим, що кожна з координат у формулі підноситься до квадрату, неважливо, в якій чверті координатної площини буде знаходитись точка.

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

Program Task_15;

Uses crt;

Var X1, Y1, X2, Y2:real; {X1, Y2, X2, Y2 – координати даних точок}

S1, S2:real; {S1, S2 – відстані до першої та другої точки}

 

Begin

Clrscr;

Write(‘Введіть координати першої точки: ‘);

Readln(X1, Y1);

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

Readln(X2, Y2);

S1:=sqrt(sqr(X1)+sqr(Y1)) ;

S2:=sqrt(sqr(X2)+sqr(Y2));

If S1

Else Writeln(‘Перша точка далі від початку координат’);

Readkey;

End.

ЗАДАЧА № 16

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

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

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

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

К = K1 × К2,

де K1 та К2 – кількості килимів, що вміщуються вздовж двох суміжних сторін кімнати.

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

Використані змінні: a, b – розміри кімнати; с – розмір килиму; К1, К2 – кількість килимів вздовж однієї та другої стінки відповідно; К – загальна кількість килимів; S – площа кімнати, що не накрита килимами.

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

Program Task_16;

Uses crt;

Var a, b, c, S:word;

K, K1, K2 :word;

Begin

Clrscr;

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

Readln(a, b);

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

Readln(c);

If (с > a) or (с > b)

Then Writeln (‘Кімнату неможливо накрити такими килимами.’)

Else

Begin

K1:=а div с; К2:=b div с;

К :=К1*К2;   S :=а*b–К*с*с;

Writeln(‘Кількість куплених килимів: ‘, К);

Writeln(‘Площа кімнати, що не накрита килимами: ‘, S);

End;

Readkey;

End.

ЗАДАЧА № 17

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

Від річкового вокзалу відійшли одночасно у протилежних напрямках теплохід та турист. Теплохід рухався зі швидкістю V1 км/год, а турист по стежці вздовж річки зі швидкістю V2 км/год. Якщо через N годин турист передумає і вирішить попливти річкою назад за теплоходом зі швидкістю V3 км/год, то чи встигне він підсісти на теплохід, який має за графіком зупинку через Y годин після початку руху і стоїть на цій зупинці Z годин? Вважати на те, що всі події відбувалися протягом однієї доби.

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

Якщо турист впродовж N годин рухався в протилежному напрямку від теплоходу, то відстань між ними в той момент, коли турист вирішив наздогнати теплохід, була наступна:

S=(V1+ V2)*N

де V1 та V2 – швидкості теплоходу та туриста відповідно.

Швидкість, з якою турист почне наздоганяти теплохід, (V3–V1) км за годину, де V3 – швидкість, з якою турист попливе навздогін теплохода. Час, який буде у туриста для наздоганяння, (Y–N + Z) годин, тому що зупинка в теплохода буде за розкладом через Y годин після початку руху, але N годин він уже плив, а Z годин теплохід буде стояти на цій зупинці. Тоді за цей час турист пройде відстань:

St=(V3–V1)×(Y–N+Z)

Вочевидь, турист встигне підсісти на теплохід тільки в тому випадку, якщо відстань St буде не менше, ніж відстань, на яку теплохід перегнав туриста.

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

Program Task_17;

Uses crt;

Var V1, V2, V3 : real;

N, Y, Z : real;

 

Begin

Clrscr;

Write(‘Введіть швидкості теплоходу та туриста: ‘);

Readln(V1, V2);

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

Readln(N);

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

Readln(V3, Y, Z);

If (V1<=0)or(V2<=0)or(V3<=0)or(N<=0)or(Y<=0)or(Z<=0)

Then Writeln(‘Помилкові вхідні дані.’)

Else

Begin

S: = (V1+V2)*N;

St: = (V3–V1)*(Y–N+Z);

If St>=S Then Writeln(‘Турист встигне на теплохід.’)

Else Writeln(‘Турист не встигне на теплохід.’);

End;

Readkey;

End.

 

ЗАДАЧА № 18

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

Жили собі дід і баба, і був у них город прямокутної форми. Довжина городу була А м, а ширина складала В м. Якось дід посварився з бабою і вирішив поділити город порівну. Тепер у діда квадратний город зі стороною С м, відрізаний скраю, а решта дісталася бабі. Визначити, чи не залишилася баба ошуканою та якої форми дістався їй город – прямокутної чи квадратної?

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

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

C2<=A×В–С2

Та це тільки на перший погляд. Насправді в даній задачі може бути велика кількість винятків.

Наприклад, якщо дідусь захоче відрізати собі город зі стороною більшою, ніж сторона загального городу, то це неможливо зробити взагалі. Якщо ж він відріже, то город, що залишиться, може мати квадратну (варіант А), прямокутну (варіант Б) або іншу форми (варіант В) (дивись малюнок):

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

Program Task_18;

Uses crt;

Var А, В, С:real;

 

Begin

Clrscr;

Write (‘Введіть розміри городу: ‘);

Readln(А, В);

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

Readln(С);

If (A<=0)or(B<=0)or(C<=0) Then Writeln (‘Помилкові вхідні дані.’)

Else

Begin

If (C>A) or (C>B)

Then Writeln(‘Дідусь не зможе відрізати город такого розміру.’)

Else

Begin

If A*B–sqr(C)<=sqr(С) Then Writeln(‘Бабуся ошукана.’)

Else Writeln(‘Бабуся не ошукана.’);

If (A<>C) and (B<>C)

Then Writeln(‘Город залишився іншої форми.’)

Else

If ((A=C)and(B/2=C))or((B=C)and(A/2=C))

Then Writeln(‘У бабусі квадратний город.’)

Else Writeln(‘У бабусі прямокутний город.’);

End;

End;

Readkey;

End.

ЗАДАЧА № 19

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

Трьом Товстунам подали на десерт кремові тістечка. Маса одного тістечка – Х кг, а маса Товстунів відповідно X1 кг, Х2 кг та Х3 кг. Перший Товстун з’їв N тістечок. Кожний наступний Товстун з’їдав у два рази більше від попереднього, але при цьому він не міг з’їсти більше половини своєї власної ваги. Скільки тістечок було з’їдено Товстунами за обідом?

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

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

Наприклад, якщо другий Товстун може з’їсти 2N тістечок, то вага цієї їжі буде 2N×Х кг. Але за умовою він не може з’їсти більше половини своєї ваги, тобто більше ніж X1/2 кг. Тому якщо вага тих тістечок, що Товстун може з’їсти, не перевищує поріг X1/2 кг, то ми до загальної кількості тістечок додаємо всі можливі, тобто 2N, якщо ж перевищує, то ми додаємо тільки ту кількість тістечок, що не дозволяє перевищити припустимий поріг, тобто X1/2/X (дозволена вага їжі поділена на вагу одного "тістечка). Якщо в цьому випадку число вийде нецілим, то це означає, що Товстун з’їв тістечко не повністю. Щоб такого не трапилось, ми робимо відкидання дробової частини після ділення за допомогою функції trunc.

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

Program Task_19;

Uses crt;

Var X, X1, X2, X3:real;

N, Counter:integer; {N – кількість тістечок, що з’їв перший Товстун; Counter – загальна кількість з’їдених тістечок}

Begin

Clrscr;

Write(‘Введіть вагу тістечка: ‘);

Readln(X);

Write(‘Введіть вагу Товстунів (1–го, 2–го та 3–го): ‘);

Readln(X1, Х2, Х3);

Write(‘Введіть кількість тістечок, що з’їв перший Товстун: ‘);

Readln(N);

If (X<=0)or(X1<=0)or(X2<=0)or(X3<=0)or(N<=0)

Then writeln(‘Помилкові вхідні дані.’)

Else

Begin

Counter:=N; {3’їв перший Товстун}

If N*2*X<=X2/2 Then Counter:=Counter+2*N

Else Counter:= Counter + trunc(X2/2/X);

If N*4*X<=X3/2 Then Counter:=Counter+4*N

Else Counter:= Counter + trunc(X3/2/X);

Writeln(‘Кількість з’їдених тістечок: ‘, Counter);

End;

Readkey;

End.

ЗАДАЧА № 20

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

Квадратний багаточлен заданий коефіцієнтами а, b, с, де а ≠ 0. Визначити, чи корені відповідного рівняння є парними числами.

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

Для розв’язання цієї задачі необхідно пригадати алгоритм знаходження коренів квадратного рівняння:

1) обчислити дискримінант;

2) якщо ми отримали від’ємне число, то коренів для розв’язку квадратного рівняння з даними коефіцієнтами а, b, с не існує;

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

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

Program Task_20;

Uses crt;

Var a, b, c, D, X1, X2:real;

{a, b, c – коефіцієнти квадратного рівняння;

D – дискримінант;

X1, X2 – корені квадратного рівняння}

Begin

Clrscr;

Write (‘Введіть коефіцієнти квадратного рівняння а, b, с: ‘);

Readln(a, b, c);

If a=0 Then writeln(‘Помилка вхідних даних.’)

Else

Begin

D:=sqr(b)–4*a*c;

If D<0>

Else

Begin

X1:=(–b–sqrt(D))/(2*a); X2:=(–b+sqrt(D))/(2*a);

Writeln(‘Корені рівняння:’);

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

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

If (round (X1) < > X1) or (round(X2) < > X2)

Then writeln(‘Корені рівняння не є цілими числами.’)

else

if (round(X1) mod 2 =0) and (round(X2) mod 2 =0)

then writeln(‘Корені рівняння парні.’)

else writeln(‘Корені рівняння непарні.’);

End;

End;

Readkey;

End.

ЗАДАЧА № 21

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

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

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

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

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

Program Task_21;

Uses crt;

Var a, b, c, x, y, S:real;

{S – допоміжна змінна для обміну місцями значень двох змінних}

Begin

Clrscr;

Write(‘Введіть розміри цеглини: ‘);

Readln(a, b, c);

Write(‘Введіть розміри отвору: ‘) ;

Readln(х, у);

If (a<=0)or(b<=0)or(c<=0)or(x<=0)or(y<=0)

Then writeln(‘Помилка вхідних даних.’)

Else

Begin

{Впорядкування розмірів цеглини}

If а>b Then Begin S:=а; а:=b; b:=S; End;

If a>c Then Begin S:=a; a:=c; c:=S; End;

If b>c Then Begin S:=b; b:=c; c:=S; End;

{Впорядкування розмірів отвору)

If x>y Then Begin S:=x; x:=y; y:=S; End;

If (a<=x) and (b<=y) Then writeln(‘Цеглина пройде у отвір.’)

else writeln(‘Цеглина не пройде у отвір.’)

End;

Readkey;

End.

1 коментар:

  1. Дякую за задачі та коментар до них, цікаво та корисна інформація, пояснено прост та зрозуміло.

    ВідповістиВидалити