Розгалуження може містити не одну умову, а одразу декілька. Як це? Про такі розгалуження - в цьому уроці!
Ну що, розв'язали задачку про високосний рік? Попомучилися з вкладеними розгалуженнями? Завдання, справді, не з простеньких. Очевидно, що спочатку потрібно перевірити, чи поділяється число року на 4 (rik mod 4 = 0
).
Якщо це не так, тоді й думати нема чого - виводимо повідомлення, що рік не є високосним.
Якщо ж число року на 4 поділяється, тоді є варіанти.
1) Число року закінчується двома нулями, чи ні? Якщо ні, тоді рік точно високосний. Число року просто поділяється на 4 та й по всьому. Якщо так, тоді треба робити ще одну перевірку:
2) Число року поділяється на 400? Якщо ні, тоді рік не високосний, якщо так, тоді високосний.
Розплутатися в цьому мереживі розгалужень простіше, якщо подати усі ці міркування у вигляді блок-схеми:
Залишилось тільки усе це "перекласти" на мову Pascal. Розв'язання задачі доступне ТУТ.
Але не поспішайте радісно клікати на посиланні. Перегляд буде доступний тільки тим, хто вже здав на перевірку свою власну спробу розв'язати задачу :)
А чи не можна цю задачу спростити? Чи не можна зменшити якимось чином кількість розгалужень? Ще раз вчитаємося в підказку до задачі ІІ рівня: "Високосним вважається рік, число якого поділяється на 4, за винятком тих років, які поділяються на 100 і не поділяються на 400". Зверніть увагу: наприкінці цього речення ДВІ УМОВИ (1: "поділяється на 100"; 2: "не поділяється на 400"), які повинні виконуватися ОДНОЧАСНО.
З'єднати ці дві умови в одну можна за допомогою логічного оператора and
(англ. "і") і сформулювати умову так:
if (rik mod 100 = 0) and (rik mod 400 <> 0) then...
Така складена умова виконується тільки в тому випадку, якщо будуть виконуватися ОБИДВІ її частини (їх потрібно брати у дужки): якщо І ПЕРША частина умови true
, І ДРУГА частина умови true
. Якщо хоча б одна з підумов не виконується, то вважається, що УСЯ умова не виконується і тоді програма переходить на виконання команд, записаних після else
.
От тепер, використовуючи складені розгалуження, знайти найменше з трьох чисел можна значно простіше:
Задано три різних числа. Вивести найменше з них.
Якщо якесь число є найменшим, тоді воно менше за будь-яке з інших. От цим і скористаємося, складаючи складену умову. Варіантів у нас три, тому використаємо неповну форму розгалуження:
program najmenshe;
var a,b,c:real;
begin
writeln('Введіть три різних числа');
readln(a,b,c);
if (a<b) and (a<c) then writeln(a);
if (b<a) and (b<c) then writeln(b);
if (c<a) and (c<b) then writeln(c);
end.
А тепер спробуйте самостійно застосувати складену умову
Відомі довжини трьох відрізків. Перевірити, чи можна з цих відрізків скласти трикутник
За відомою вам теоремою про нерівність трикутника, кожна з його сторін повинна бути менша за суму двох інших. Це означає, що з трьох сторін a
,b
,c
і a<b+c
, і b<a+c
, і c<a+b
. То от ці нерівності й будуть елементами складеної умови
program trykutnyk;
var a,b,c:real;
begin
writeln('Введіть сторони трикутника');
readln(a,b,c);
if (a<b+c) and (b<a+c) and (c<a+b) then writeln('Трикутник існує')
else writeln('Трикутник не існує')
end.
Відомі три кута трикутника. Визначити, чи є він гострокутним
Оскільки трикутник є гострокутним, якщо усі його кути гострі, то значить, одночасна перевірка того, що усі ці кути менші за 90° і входитиме в складену умову...
program ghostrokutnyj;
var a,b,c:real;
begin
writeln('Введіть кути трикутника');
readln(a,b,c);
if a+b+c=180 then
if (a<90) and (b<90) and (c<90) then writeln('Трикутник гострокутний')
else writeln('Трикутник не гострокутний')
else writeln('Трикутник не існує')
end.
Що, забули про необхідність перевірки чи взагалі за заданими кутами можна трикутник побудувати чи ні? :D
Перевірка на існування трикутника з такими кутами, як вводить користувач, очевидно, що потрібна. Хоча, якщо реалізовувати повноцінний обробник помилок, то тоді слід передбачити ще й такі можливі дурниці як трикутник з кутами 90°, 90° і 0°
, 180°, 0° і 0°
, а також набори типу 130°, 80° і -10°
, в яких сума усіх чисел дорівнюватиме 180, але трикутника з такими кутами не існуватиме. А що там ще "пришибленому" користувачеві вашої програми стукне в голову вводити? Букви замість чисел? Розділові знаки? Як бачимо, написати повноцінний обробник помилок - це, дійсно, непросто, тому, якщо про це в умові завдання не зазначено окремо, то від вас він не вимагається.
Ну, а що стосується нашого головного розгалуження, яке безпосередньо виводить нас на відповідь до питання задачі, то, як бачите, умова if (a<90) and (b<90) and (c<90) then...
є складеною, вона складається з ТРЬОХ частин, які повинні виконуватися ОДНОЧАСНО і усі ці три частини сполучені логічним оператором and
.
До речі, при використанні логічних операторів будьте уважними й не плутайте: and і end - це РІЗНІ слова! :D
Продовжимо експерименти з трикутниками
Відомо три кути трикутника. Визначити, чи є він прямокутним.
Ця задача відрізняється від попередньої, хоча, на перший погляд, схожа на неї. Річ у тім, що прямий кут у трикутника може бути тільки ОДИН. У попередній задачі нам потрібно було, щоб УСІ кути були менші за 90°, а в цій задачі - щоб тільки ОДИН дорівнював 90°. Через це, якщо ми по аналогії з попереднім завданням напишемо if (a=90) and (b=90) and (c=90) then...
, то це буде категорично невірно: трикутника з ДВОМА прямими кутам НЕ ІСНУЄ, а з ТРЬОМА й поготів! Отже така умова не виконуватиметься НІКОЛИ!
У тому разі, коли нам потрібно, щоб з трьох елементів виконувалися не всі, а ОДИН, використовують інший логічний оператор or
(англ. "або"). Складена умова, частини якої сполучені оператором or
, вважається такою, що виконується (true
), якщо виконується ХОЧА Б ОДНА її частина.
Ще раз:
Відчули різницю?
AND → УСІ
OR → ХОЧА Б ОДИН
Якщо цього разу обійдемося без обробника помилок, то матимемо такий код:
program trykutnyk90;
var a,b,c:real;
begin
writeln('Введіть кути трикутника');
readln(a,b,c);
if (a=90) or (b=90) or (c=90) then writeln('Трикутник прямокутний')
else writeln('Трикутник не прямокутний')
end.
Оператори and
і or
можуть використовуватися й разом в одній умові. В цьому разі слід пам'ятати, що при перевірці умови в першу чергу виконується and
, а потім or
. Цей порядок аналогічний до порядку дій в арифметиці: and
аналогічне до дії множення (виконується в першу чергу), а or
аналогічне до дії додавання (виконується потім). Враховуючи це, підумови слід об'єднувати дужками в такому порядку, в якому вони мають виконуватися.
Наприклад, якщо потрібно обрати число, яке поділяється на 2 або поділяється на 3 але не поділяється на 6, тоді умова розгалуження повинна мати такий вигляд:
if ((x mod 2 = 0) or (x mod 3 = 0)) and (x mod 6 <> 0) then...
Зверніть увагу на розстановку дужок, які вказують на порядок виконання логічних операторів: спочатку відбираються числа, які поділяються на 2 або на 3 (отримуємо числа 2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21...), а потім з цих чисел залишають тільки ті, що не поділяються на 6 (2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21...). Результатом роботи такого відбору будуть числа 2, 3, 4, 8, 9, 10, 12, 14, 15, 16, 20, 21 і т.д.
Якщо дужки не поставити:
if (x mod 2 = 0) or (x mod 3 = 0) and (x mod 6 <> 0) then...
...тоді відповідно до порядку дій (1 - and
, 2 - or
) спочатку буде відібрано числа, які поділяються на 3 і не поділяються на 6 (це 3, 9, 15, 21...), а потім уже серед них будуть відбиратися числа, що поділяються на 2. Але ж серед уже відібраних усі числа непарні! Через це усі парні числа з нашого пошуку "випадуть", що призведе до отримання результату 3, 9, 15, 21..., який є НЕВІРНИМ!
Ну й на останок, складена функція:
Обчислити значення складеної функції:
Як бачимо, значення функції буде обчислюватися за формулою 2*x
якщо значення змінної x
менше -2
або більше 2
і за формулою -3*x
в усіх інших випадках (в математиці фігурна дужка означає, що умови повинні виконуватися одночасно - аналог and
, а квадратна - що хоча б одна - аналог or
). Отже, потрібно буде створити складену умову, в якій буде перевірка на виконання ОДНІЄЇ З ДВОХ умов: x<-2
або x>2
. Якщо ця складена умова виконуватиметься, тобто, якщо виконуватиметься ХОЧА Б ОДНА з її частин x<-2
чи x>2
(зрозуміло, що одночасно обидві ці умови бути виконаними не можуть!), тоді введене число множимо на 2
. Якщо складена умова не виконуватиметься, значить, настали "інші випадки", а, значить, введене число потрібно буде помножити на -3
.
program skl_funkcija;
var x,y:real;
begin
write('x=');
readln(x);
if (x<-2) or (x>2) then writeln('y=',2*x)
else writeln('y=',-3*x)
end.
Нового матеріалу в цьому уроці було небагато. Ви дізналися лише про те, що:
and
;and
буде true
тільки тоді, коли УСІ перераховані умови будуть true
;or
;or
буде true
тільки тоді, коли ХОЧА Б ОДНА з перерахованих умов буде true
;and
і or
в складеній умові можна комбінувати; у цьому разі спочатку перевіряється виконання умов, сполучених операторами and
, а потім - операторами or
; порядок комбінування умов коригується розстановкою дужок.Дано два числа - абсциса й ордината точки на координатній площині. Визначити, в якій координатній чверті розміщена ця точка.
Підказки
Ну, якщо ви з 6 класу вже не пам'ятаєте, що таке координати точки на площині, тоді вам СЮДИ. А для розв'язання задачі вам більше знадобиться ОСЬ ЦЕЙ малюнок, з якого добре видно, які знаки мають абсциса й ордината точки в якій чверті. Тобто, якщо x>0
і y>0
, то це І чверть, якщо x<0
і y>0
, то ІІ чверть і т.д.
Звісно, точки можуть лежати не тільки в координатних чвертях, а ще й на координатних осях, а також і на їх перетині. Хто зможе реалізувати перевірку УСІХ випадків розміщення точки на площині - отримає "12". Успіху!