Цей матеріал стане в нагоді на уроках інформатики при вивченні мови програмування та при підготовці учнів до олімпіади з інформатики. Це наступний документ з низки "Вчимося розв'язувати задачі", який стане в нагоді вчителю та учням.
Авторами була розглянута велика кількість задач із застосуванням команд розгалуження. Деякі з них можна згрупувати за методом розв’язання, а тому вашій увазі пропонується розбиття на категорії, в якому спочатку представлена базова задача з розбором, а потім умови подібних задач.
І категорія. До цієї категорії можна віднести задачі, які у самому формулюванні умови мають алгоритм їх розв’язання. Фактично при розв’язанні цих задач учень записує мовою програмування у формалізованому вигляді словесний опис команди розгалуження. Розглянемо одну з задач.
Умова задачі. Задано значення дійсних чисел a, b, с. Подвоїти ці значення, якщо , і замінити їх абсолютним значенням, якщо це не так.
Розв’язок задачі:
1. Кожна задача починається з уведення вхідних даних. У нашому випадку потрібно ввести три числа.
2. Використовуючи команду розгалуження перевіряємо умову, що вказана в задачі, та виконуємо задані дії: подвоюємо значення змінних при справдженні умови , та замінюємо їх модулем у протилежному випадку. Звернуть увагу на те, що оскільки на кожній гілці умовного оператора вимагається виконання трьох команд присвоєння, оператори будуть складеними та вміщуватися в операторні дужки begin – end.
Фрагмент тексту програми має вигляд:
var a,b,c:real;
begin
write(‘Input number ’); {Уведення вхідних даних}
readln(a,b,c);
if (a>=b)and(b>=c) {Команда розгалуження, що відповідає умові}
then begin
a:=2*a; b:=2*b; c:=2*c;
end
else begin
a:=abs(a); b:=abs(b); c:=abs(c);
end;
writeln(‘a=’,a:8:2); {Виведення результатів}
writeln(‘b=’,b:8:2); {у відформатованому вигляді}
writeln(‘c=’,c:8:2);
readln;
end.
Задачі для самостійного розв’язання:
1. Перевірити, чи є дане дійсне число додатним (більшим нуля).
2. Визначити, чи є дане ціле число від'ємним (менше 0), додатним (більше 0) або нулем (дорівнює 0).
3. Дано два дійсних числа. Яке з них належить відрізку [-5;10]? (більше рівне -5 ТА менше рівне 10).
4. Дано два дійсних числа а та b. Якщо хоча б одне з них належить відрізку [0;15] (більше рівне 0 та менше рівне 15), знайти суму квадратів цих чисел, інакше — знайти середнє арифметичне.
5. Дано два дійсних числа а та b. Якщо тільки одне з них є додатнім, знайти суму цих чисел, якщо обидва додатні — знайти середнє арифметичне, в протилежному випадку – знайти квадрат суми цих чисел.
6. Перетворити значення двох дійсних змінних x та y за таким правилом: якщо значення x та y від’ємні, кожне з них замінити його модулем, якщо від’ємне тільки одне з них, обидва значення збільшити на 0,5, якщо ж обидва значення невід’ємні і жодне з них не належить відрізку [0.5, 2.0], обидва значення зменшити в 10 разів, в усіх інших випадках значення x та y залишити без змін.
7. Дано цілі числа k, m та дійсні числа x, y, z. При замінити модулем значення x, y або z відповідно, а два других значення зменшити на 0.5.
8. В залежності від розміру суми, розмір податку з неї розраховується за такою схемою:
Визначити, який податок буде вирахуваний із суми розміром S. Значення a, b та c задаються з клавіатури.
9. За рейтинговою системою оцінка визначається таким чином: якщо сумарний бал учня становить не менше 92% від максимального, то виставляється оцінка 12, якщо не нижче 70%, то виставляється 8, якщо не нижче 50%, то оцінка 5, в інших випадках – оцінка 2. Визначте оцінку учня, якщо він набрав N балів, а максимальне значення сумарного балу становить S.
ІІ категорія. Обчислити значення функції. Ці задачі підрозділяються на дві підгрупи:
Розглянемо приклади розв’язання таких задач.
Задача ІІ.1. Обчислити значення функції
Розв’язок задачі:
Очевидно, що обчислення можливі при виконанні двох умов: знаменник не дорівнює 0 та підкореневий вираз невід’ємний. Якщо хоч одна з умов є хибною, виведемо на екран повідомлення про помилку.
Фрагмент тексту програми має вигляд:
var x,y:real;
begin
write(‘Input number ’);
readln(x);
if (2*x-10>=0)and(sqr(x)-1<>0)
then begin
y:=sqrt(2*x-10)/(sqr(x)-1);
writeln(‘y=’,y:0:2);
end
else writeln(‘Error’);
readln;
end.
Задача ІІ.2. Дано дійсне число x. Обчислити значення функції
Розв’язок задачі:
Вибір співвідношення, за яким виконується обчислення функції, залежить від значення аргументу. Якщо x>10, то обчислюємо за першою формулою, в протилежному випадку – за другою.
Фрагмент тексту програми має вигляд:
var x,y:real;
begin
write(‘Input number ’);
readln(x);
if x>10
then y:=sin(x*x*x)
else y:=sqrt(10-x);
writeln(‘y=’,y:0:3);
readln;
end.
Задачі для самостійного розв’язання:
.
.
.
Примітка: Задачі №7 та №8 можуть бути розв’язані по різному. Найпростіший метод, це записати обчислення для кожного інтервалу аргументу у вигляді скороченого оператору розгалуження. Кількість операторів, очевидно, в цьому випадку буде дорівнювати кількості інтервалів. Однак, цей метод не дуже оптимальний за часом, оскільки за будь-яких початкових значень аргументу (навіть, коли обчислення відбудуться на першому ж інтервалі) перевірка умови буде виконуватись три (для задачі №7) або чотири (для задачі №8) рази. А тому рекомендується записувати розв’язок з використанням вкладених умовних операторів. Задача № 7 при такому підході вимагає використання двох вкладених операторів розгалуження, оскільки має три інтервали для обчислення, а задача №8, відповідно, потребує трьох операторів розгалуження. Пропонуємо Вам самостійно записати ці розв’язки. Для задачі №9 підхід може бути аналогічним.
ІІІ категорія. Знайти максимальне (мінімальне) значення з двох (трьох) чисел.
Умова задачі. Дано два числа. Знайти серед них число з найбільшим значенням.
Розв’язок задачі:
У запропонованій задачі вперше ми стикнулися з ситуацією, коли в умові не оговорені типи вхідних значень. Такі задачі зустрічаються досить часто, оскільки програмування, як прикладна дисципліна, вимагає від програміста вміння аналізувати можливі варіанти вхідних даних та обробляти усі ситуації, навіть такі, що здаються неможливими з точки зору «здорового глузду». Адже користувачем програми іноді може бути людина недосвідчена, а іноді і така, що навмисно буде намагатися привести до аварійного завершення програми.
Запропонована задача, очевидно, повинна вміти обробляти будь-які числа (цілі або дійсні), а тому всі змінні для програми має сенс вибирати дійсними, щоб надати можливість працювати як з цілими (вони є підмножиною дійсних чисел) так і з дробовими числами.
Крім того, зауважимо, що має сенс увести ще одну змінну, яка буде зберігати знайдене максимальне значення, оскільки в більшості випадків сам пошук максимуму буду підзадачею деякої іншої задачі, що використовуватиме знайдене найбільше значення для подальших обрахунків. Зверніть також увагу, що при рівних числах з точки зору програмування вони обидва є максимальними, а тому така ситуація окремо не обробляється і максимуму надається будь-яке з двох значень.
Фрагмент тексту програми має вигляд:
var x,y,max:real;
begin
write(‘Input numbers ’);
readln(x,y);
if x>y {Умову можна переформулювати, як x>=y}
then max:=x
else max:=y;
writeln(‘max=’,max:0:2);
readln;
end.
При пошуку максимуму з трьох чисел можна отримати розв’язок трьома методами. Пропонуємо подумати, який із запропонованих нижче розв’язків буде оптимальнішим за часом (менша кількість зайвих перевірок).
1 метод. Трьох чисел максимальне може бути тільки одне з них, а тому можна отримати три ситуації, які обробляються скороченими оператора розгалуження:
if (x>=y)and(x>=z) then max:=x;
if (y>=x)and(y>=z) then max:=y;
if (z>=x)and(z>=y) then max:=z;
2 метод. При пошуку максимального значення з трьох чисел можна спочатку знайти максимум з двох чисел, а потім максимум зі знайденого максимуму та третього числа. Тобто
if x>y
then max:=x
else max:=y;
if max<z
then max:=z;
3 метод. Підхід пошуку максимуму не змінюється відносно попереднього випадку, змінюється тільки форма запису:
if x>y
then {На цій гілці більшим з двох (x або y) є x}
if x>z
then max:=x
else max:=z
else {На цій гілці більшим з двох (x або y) є y}
if y>z
then max:=y
else max:=z;
Задачі для самостійного розв’язання:
Примітка: Задача №10 потребує деяких знань з математики, а саме, членами арифметичної прогресії є такі числа, для яких справджується правило: кожне наступне число відрізняється від попереднього на деяку постійну величину, що зветься знаменником арифметичної прогресії. Звідси випливає і розв’язок задачі: спочатку має сенс знайти максимальне з трьох чисел, потім найбільше з тих, що залишилися, а потім, розташувавши їх у порядку зростання, знайти різницю між першими двома та другими двома. Якщо різниці однакові, числа утворюють арифметичну прогресію.
Можливо не відразу зрозуміло, чому задача №11 потрапила у категорію задач пошуку максимуму (мінімуму), але давайте поміркуємо. Очевидно, що цеглина за заданих умов тільки тоді пройде у отвір, якщо її мінімальний вимір буде не більше мінімального виміру отвору, а її середній вимір (не мінімальний і не максимальний) не перевищує максимального розміру отвору. От вам і пошук мінімуму та максимуму!
ІV категорія. Задачі про координатну площину. Більшість цих задач пов’язана з визначенням належності точки визначеної області координатної площини.
Умова задачі. Не будемо розглядати очевидні задачі типу, якій чверті координатної площини належить задана точка, а розглянемо задачу з більш складною областю, що відмічена штриховкою. Наприклад таку:
Розв’язок задачі:
Задачі такого типу розв’язуються, виходячи з наступних міркувань: щоб точка лежала на прямій, потрібно справдження рівності, в якій координати точки підставляються у рівняння заданої прямої. Відповідно, якщо точка не лежить на прямій, рівність перетворюється на нерівність, причому нижче прямої у нерівність типу , а якщо вище, то – , де – функція, що описує рівняння прямої. Рівняння прямої можна отримати кількома методами, але найпростіший – це використання рівняння прямої, що проходить через дві точки з координатами та :
Запропонована задача дозволяє рівняння прямої взагалі отримати без вказаного співвідношення, оскільки прямі є горизонтальними або вертикальними. Для верхньої горизонталі це рівняння буде y=2, для нижньої – y=-2, для лівої вертикалі x=-2, а для правої x=3.
Точка буде лежати всередині заштрихованої області, якщо справджуються усі нерівності для чотирьох прямих. Зверніть увагу, що намальовані прямі бувають штриховими, а бувають суцільними. В першому випадку вважається, що точка, яка лежить на прямій, не належить заштрихованій області, а в другому – належить. Відповідно, в першому випадку нерівність буде строга, а в другому – нестрога.
Оскільки результатом розв’язка задачі буде відповідь «належить» або «не належить» точка вказаній області, будемо виводити на екран повідомлення «Yes» або «No» відповідно.
Фрагмент тексту програми має вигляд:
var x,y:real;
begin
write(‘Input point ’);
readln(x,y);
if (x>-2)and(x<=3)and(y>-2)and(y<=2)
then writeln(‘Yes’)
else writeln(‘No’);
readln;
end.
У якості ліній, які обмежують задану область можуть бути також графіки функції. Підхід до розв’язання такої задачі не змінюється, тільки у якості функції будуть використовуватися відповідні функціональні залежності. Нагадаємо, що круг має наступну функціональну залежність , де (a,b) – координати центра круга, а R – його радіус.
Задачі для самостійного розв’язання:
Примітка. Очевидно, що кількість простих умов в завданнях від а) до д) дорівнює кількості ліній, які обмежують область:
Усі прості умови поєднуються логічною операцією and, оскільки тільки одночасне справдження всіх умов забезпечить попадання точки всередину заштрихованої області.
Завдання є) виконується аналогічно тільки прості умови поєднуються логічною операцією or, оскільки точка в даному випадку лежить або над однією прямою, або під другою прямою, або ліворуч від, або праворуч від… Для перевірки правильності відповіді спробуйте заштрихувати області згідно умови і на перетині усіх штриховок буде видима відповідь.
Для завдань є) та е) розв’язок складніше, оскільки прямою штриховкою результату досягти не можна. Пов’язано це з тим, що фігури, які отримані лініями, є не опуклими. Для отримання відповіді в цьому випадку необхідно розбити зображення на кілька частин, кожна з яких буде опуклою фігурою. Це дозволить виконати завдання, застосовуючи метод «прямої штриховки» (прості умови, об’єднані логічною операцією and). Запропоновані завдання дозволяють розбивати фігуру на дві частини:
Для кожної з частин застосовується метод, що наведений вище, а між собою умови поєднуються логічною операцією or, оскільки точка можне належати або перший фігурі, або другій.
V категорія. Геометричні задачі. Ці задачі також можна умовно поділити на задачі кількох підгруп:
Задача V.1. Дано три числа a, b та c. З’ясувати, чи можна побудувати трикутник, довжини сторін якого дорівнюють цим числам.
Розв’язок задачі:
У задачах даної категорії вперше з’являється поняття некоректних вхідних даних. Так, наприклад, довжини сторін не можуть бути від’ємними або нульовими. А тому після уведення вхідних даних обов’язково потрібно перевірити їх коректність і, якщо дані некоректні, вивести про це повідомлення. Спроба використати беззнакові цілі типи для збереження вхідних даних не є слушною, оскільки довжини довільних трикутників можуть мати дробові значення.
Тепер розглянемо математичну модель задачі. Очевидно, що навіть маючи три додатних числа, ми не завжди зможемо побудувати трикутник з такими сторонами. З курсу математики учням відоме таке правило: трикутник можна побудувати тоді і тільки тоді, коли сума довжин двох менших сторін буде більшою за довжину третьої сторони. Часто стереотип мислення помилково підказує, що меншими повинні бути сторони a та b, а с – це найбільша сторона. І тому на прикладі цієї задачі потрібно привчати учнів розглядати всі можливі випадки і перевіряти всі умови. Для даної задачі можливі три випадки, коли найбільшою буде одна з трьох сторін і тому повний розв’язок буде містить складену умову з трьох простих умов, поєднаних логічною операцією and (одночасне справдження трьох умов). Відповідь у цій задачі, як і раніше, буде у вигляді «YES» або «NO» в залежності від того можна чи не можна побудувати трикутник.
Фрагмент тексту програми має вигляд:
var a,b,c:real;
begin
write(‘Input numbers ’);
readln(a,b,c);
if (a<=0)or(b<=0)or(c<=0) {Перевірка коректності вхідних даних}
then writeln(‘Input error’)
else if (a+b>c)and(a+c>b)and(c+b>a)
then writeln(‘YES’)
else writeln(‘NO’);
readln;
end.
Зауважимо, що теоретично відповідь можна виводити будь-якими літерами (великими чи малими), оскільки людина сприймає їх зміст однаково. Але, готуючись до машинної перевірки розв’язків, можна привчати учнів до строгості навіть у цьому, чітко оговорюючи, якими саме літерами потрібно виводити результат.
Очевидно, що фігуру можна задавати не тільки довжинами сторін. Можна ще задати її координатами вершин. У цьому випадку, використовуючи відомі формули обчислення довжини відрізка заданого координатами його кінців, можна знайти довжини сторін та звести задачу до попередньої. Згідно малюнка довжина відрізка обчислюється за формулою . Некоректних даних у цьому випадку бути не може, але точки можуть лежати на одній прямій, утворюючи вироджену фігуру. Перевірку, чи лежать точки на одній прямій ми розглянемо трохи пізніше.
Трикутник також може бути задано величинами його кутів. Некоректність вхідних даних у цьому випадку перевіряється так само, як і для довжин сторін, а можливість існування трикутника забезпечується відомим математичним співвідношенням, що сума кутів трикутника повинна дорівнювати .
Для чотирикутника перевірка відбувається так само, але математична модель трохи інша:
Задачі для самостійного розв’язання:
Тип чотирикутника визначається просто:
Задача V.2. Дано три числа a, b та c. Визначити чи є трикутник, довжини сторін якого дорівнюють заданим числам, прямокутним.
Розв’язок задачі:
Задачі даного типу є продовженням попереднього, оскільки її повний розв’язок передбачає спочатку перевірку можливості існування даного трикутника. Зверніть увагу, що теоретично задані числа можуть бути і кутами трикутника. І крім того, можна ще задавати трикутник координатами точок на площині. У перших двох випадках (сторони і кути) потрібно обов’язково перевіряти коректність вхідних даних.
Якщо трикутник існує, то визначення, чи є він прямокутним, виконується з використанням теореми Піфагора. Зауважимо при цьому, що шкільний стереотип, який наголошує, що a та b – катети, а с – гіпотенуза, є необов’язковим у програмуванні. А тому потрібно перевірити три можливих випадки справдження цього рівняння.
Фрагмент тексту програми має вигляд:
var a,b,c:real;
begin
write(‘Input numbers ’);
readln(a,b,c);
if (a<=0)or(b<=0)or(c<=0) {Перевірка коректності вхідних даних}
then writeln(‘Input error’)
else if (a+b>c)and(a+c>b)and(c+b>a) {Перевірка можливості побудови}
then if (a*a+b*b=c*c)or(a*a+c*c=b*b)or(c*c+b*b=a*a)
then writeln(‘Right triangel’)
else writeln(‘Not right triangel’)
else writeln(‘NO’);
readln;
end.
Якщо a, b, c – кути трикутника, перевірка виявляється ще простішою. В цьому випадку потрібно переконатися, що принаймні один кут (будь-який з трьох) має величину : (a=90)or(b=90)or(c=90).
Якщо ж трикутник заданий координатами своїх вершин, потрібно обчислити довжини сторін за наведеною вище формулою, а потім перевірити трикутник за довжинами сторін. Нагадуємо, що в цьому випадку при обчисленні довжин сторін достатньо сильно накопичується похибка обчислень і теорема Піфагора може не справджуватися навіть для візуально прямокутного трикутника. Тоді варто пригадати правило, на якому ми наголошували ще тоді, коли тільки починали програмувати: порівняння дійсних чисел на точну рівність не зовсім коректно. Потрібно виконувати порівняння з певною, наперед заданою точністю. Так, для розглядуваної задачі, похибка обчислень може досягати 0.0001, що приводить до наступного вигляду умови:
(abs(a*a+b*b-c*c)<=0.0001)or(abs(c*c+b*b-a*a)<=0.0001)
or(abs(a*a+c*c-b*b)<=0.0001)
Для перевірки трикутника на гострокутність та тупокутність перетворюємо рівність на нерівність, не забуваючи, що у тупокутного трикутника тільки один кут може бути тупим, а у гострокутного трикутника усі три кути – гострі (менші ). Теорема Піфагора також перетворюється на нерівність: у тупокутного трикутника сума квадратів сторін більша за квадрат третьої сторони, а у госторокутного – менше.
Перевірка трикутника на рівносторонність та рівнобічність не повинна викликати труднощів.
Задачі для самостійного розв’язання:
Задача V.3. Дано координати трьох точок на координатній площині. Визначити, чи лежать ці точки на одній прямій.
Розв’язок задачі:
Для розв’язання даного класу задач знову повернемось до рівняння прямої, що проходить через дві точки:
Очевидно, що якщо всі задані точки лежать на одній прямій, підстановка координат третьої точки в рівняння прямої повинно перетворити рівняння у рівність. Рекомендуємо при цьому позбавитись у рівнянні операції ділення нескладним алгебраїчним перетворенням:
.
Фрагмент тексту програми має вигляд:
var x1,y1,x2,y1,x3,y3:real;
begin
write(‘Input points 1 ’);
readln(x1,y1);
write(‘Input points 2 ’);
readln(x2,y2);
write(‘Input points 3 ’);
readln(x3,y3);
if (x3-x1)*(y1-y2)=(y3-y1)*(x1-x2)
then writeln(‘Straight line’)
else writeln(‘Not straight line’);
readln;
end.
Знаходження точки не на прямій перетворює рівність у нерівність. Це можна застосовувати для перевірки, чи лежать дві точки по один бік від прямої: якщо дві точки лежать по один бік прямої, нерівності повинні мати однаковий знак. Цю умову можна записати двома методами. Перший «лобовий» передбачає, що для обох нерівностей ми розглядаємо спочатку знак менше, а потім більше (або навпаки):
((x3-x1)*(y1-y2)<(y3-y1)*(x1-x2))and((x4-x1)*(y1-y2)<(y4-y1)*(x1-x2))
or((x3-x1)*(y1-y2)>(y3-y1)*(x1-x2))and((x4-x1)*(y1-y2)>(y4-y1)*(x1-x2))
А другий – компактніший – ґрунтується на тому, що добуток двох чисел однакового знаку буде завжди додатнім. Замінивши знак порівняння на знак віднімання ми отримаємо для першої половини умови від’ємний результат, а для другої – додатній. Відповідно, якщо обидві нерівності мали однаковий знак, добуток цих двох дужок буде додатним:
((x3-x1)*(y1-y2)-(y3-y1)*(x1-x2))*((x4-x1)*(y1-y2)-(y4-y1)*(x1-x2))>0
Задачі для самостійного розв’язання:
Підказка: якщо один трикутник всередині іншого, всі його вершини всередині другого трикутника; а якщо перетинаються, то всередині не більше двох вершин.
VІ категорія. Задачі на перевірку властивостей цілих чисел. Майже всі ці задачі передбачають розбиття числа на окремі цифри з наступним їх аналізом.
Умова задачі. Дано чотирицифрове натуральне число N. Перевірити, чи є це число:
Розв’язок задачі:
Ці задачі, по-перше, також вимагають перевірки коректності вхідних даних, оскільки розбиття числа на цифри залежить від їх кількості. По-друге, щоб розбити число на цифри, потрібно застосувати операції цілочисельного ділення та знаходження залишку від цілочисельного ділення числа на 10. Так, наприклад, операція N mod 10 дозволяє отримати останню цифру числа (цифру одиниць), оскільки залишок від ділення числа на 10 дорівнює саме цій цифрі, а операція N div 10 дозволяє «відкинути» цифру від числа. Не пояснюючи докладно усі команди, наведемо ті, які дозволяють отримати з чотирицифрового числа його окремі цифри (цифри нумеруються справа наліво):
c1:=N mod 10;
c2:=(N div 10) mod 10;
c3:=(N div 100) mod 10;
c4:=N div 1000;
Далі розв’язок стає очевидним, оскільки потрібно або порівняти відповідні цифри, або знайти суму деяких цифр, або перевірити властивості самих цифр.
Фрагмент тексту програми має вигляд:
var c1,c2,c3,c4:byte; N:word;
begin
write(‘Input numbers ’);
readln(N);
if (N<1000)or(N>9999) {Перевірка коректності вхідних даних}
then writeln(‘Input error’)
else begin
c1:=N mod 10;
c2:=(N div 10) mod 10;
c3:=(N div 100) mod 10;
c4:=N div 1000;
if (c1=c4)and(c2=c3 {Крайні та середні цифри рівні між собою}
then writeln(‘Palindrom’)
else writeln(‘Not palindrom’);
if c1+c2=c3+c4 {Сума перших двох цифр дорівнює сум двох останніх}
then writeln(‘Happy)
else writeln(‘Not happy);
if (c1 mod 2 = 0)and(c2 mod 2 = 0)and(c3 mod 2 = 0)and(c4 mod 2 = 0)
{кожна цифра числа є парною}
then writeln(‘Numbers parity’)
else writeln(‘Numbers not parity’);
end;
readln;
end.
Інша кількість цифр числа змінює тільки формули для отримання цифр числа, причому співвідношення змінюються тільки для старших цифр.
Задачі для самостійного розв’язання:
VІІ категорія. Задачі на розв’язання рівнянь або нерівностей. Для цих задач спочатку дуже важливою є побудова математичної моделі. Так, для лінійного рівняння потрібно розглянути наступні випадки:
Пропонуємо вам за описом математичної моделі розв’язання лінійного рівняння записати програму. А тепер розглянемо іншу часто використовувану задачу.
Умова задачі. Дано три числа a, b, c. Знайти корені квадратного рівняння
Розв’язок задачі:
Ця задача має багато підходів до розв’язання, які залежать від вхідних даних.
По-перше, якщо перший коефіцієнт дорівнює нулю, можливі дві реакції:
По-друге, якщо перший коефіцієнт не нульовий, рівняння не вироджене і розв’язується за алгоритмом, відомим з курсу шкільної математики:
Запишемо фрагмент тексту програми з урахуванням, що якщо коефіцієнт a дорівнює 0, вхідні дані вважаються некоректними:
var a,b,c,x1,x2,d:real;
begin
write(‘Input numbers ’);
readln(a,b,c);
if (a=0) {Перевірка коректності вхідних даних}
then writeln(‘Input error’)
else begin
d:=b*b-4*a*c;
if (d<0)
then writeln(‘Solution of equation no exist’)
else if d=0
then begin
x1:=-b/(2*a);
writeln(‘x=’,x:0:3);
end
else begin
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
writeln(‘x1=’,x1:0:3);
writeln(‘x2=’,x2:0:3);
end;
end;
readln;
end.
Задачі для самостійного розв’язання:
VІIІ категорія. Задачі з шаховою дошкою.
Умова задачі. Дано два числа row та col, що є номером рядка та стовпчика на шаховій дошці. Визначити, якого кольору клітинка з цими координатами.
Розв’язок задачі:
Спочатку визначимося, як задаються координати клітинки шахової дошки. На реальній шаховій дошці рядки нумеруються числами від 1 до 8 , а стовпчики задаються буквами від a до h. Оскільки в програмуванні змішувати різні типи даних досить складно, домовимося, що і рядки, і стовпчики задаються цілими числами від 1 до 8. Таким чином перевірка коректності вхідних даних тут обов’язкова.
Тепер спробуємо проаналізувати колір різних клітинок дошки. Оскільки нижня ліва клітинка з координатами (1,1) біла, то далі білі клітинки першого ряду будуть мати непарні номери стовпчиків. Відповідно клітинки першого ряду з парними номерами стовпчиків будуть чорними. У другому рядочку ситуація протилежна: клітинки з непарними номерами стовпчиків мають чорний колір, а клітинки з парними номерами – білий. Далі картина повторюється.
Підіб’ємо підсумок: рядочки з непарними номерами мають білими клітинки з непарними номерами стовпчиків, а рядочки з парними номерами навпаки. Тобто можна сказати, що у білих клітинок парність номерів рядочків і стовпчиків співпадає.
З усього вище сказаного перевірку клітинки на білий колір можна оформити двома способами:
(row mod 2 = 0)and(col mod 2 = 0) or (row mod 2 = 1)and(col mod 2 = 1)
(row mod 2 = col mod 2)
Фрагмент програми має такий вигляд:
var row,col:byte;
begin
write(‘Input numbers ’);
readln(row,col);
if (row<1)or(row>8)or(col<1)or(col>8) {Перевірка коректності вхідних даних}
then writeln(‘Input error’)
else if row mod 2 = col mod 2
then writeln(‘White’)
else writeln(‘Black’);
readln;
end.
Задачі для самостійного розв’язання:
Примітка: 1. На горизонталі однаковими є номери рядків, а на вертикалі – номери стовпчиків.
2. Різниця координат клітинок на діагоналі однакова.
3. Різниця між координатами коня в одному напрямку дорівнює 1, а в іншому 2.
IX категорія. Задачі, які потребують для свого розв’язання використання команди вибору.
Умова задачі. Дано натуральне число N , яке визначає вік людини (в роках). Додати до цього числа найменування «рік», «роки» або «років», наприклад 1 рік, 42 роки, 26 років.
Розв’язок задачі:
Після введення числа з клавіатури обов’язкова, як і раніше, перевірка коректності вхідних даних, інакше відповідь може бути отримана неправильна (подумайте чому).
Далі очевидно, що слово, яке дописується до числівника, залежить від останньої цифри числа. Якщо ця цифра «1» – дописується слово «рік», якщо цифри «2» або «3» – дописується слово «роки», в усіх інших випадках – дописується слово «років». Винятком є числа другого десятка, оскільки до них завжди дописується слово «років» незалежно від останньої цифри. Ці числа потрібно перевірити окремо командою умовного переходу.
Відповідь має три варіанти, а тому для наочності має сенс використовувати команду вибору. Зверніть увагу, що оскільки кириличний текст виводиться на консоль некоректно, для виведення застосовується транслітерація.
Фрагмент програми має такий вигляд:
var Year:byte;
begin
write(‘Input year ’);
readln(year);
if year>100 {Перевірка коректності уведення}
then writeln(‘Input.error.’)
else if (year>=10)and(year<=20)
then writeln(Year,‘ rokiv.’)
else case Year mod 10 of
1: writeln(Year,‘ rik.’);
2..4: writeln(Year,‘ roky.’);
else writeln(Year,‘ rokiv.’)
end;
readln;
end.
Задачі для самостійного розв’язання:
1 – довжини кола;
2 – площі круга;
3 – об’єму кулі;
4 – площі поверхні кулі.
1) sinx;
2) cosx;
3) tgx.
20.01 – 18.02 – Водолій
19.02 – 20.03 – Риби
21.03 – 19.04 – Овен
20.04 – 20.05 – Телець
21.05 – 21.06 – Близнюки
22.06 – 22.07 – Рак
23.07 – 22.08 – Лев
23.08 – 22.09 – Діва
23.09 – 22.10 – Терези
23.10 – 22.11 – Скорпіон
23.11 – 21.12 – Стрілець
22.12 – 18.01 – Козерог