Інструкція If. Then. Else

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

Задача 53. 53. Використовуючи команду розгалуження скласти програму знаходження модуля числа.

То наш розв’язок мав би вигляд:

program module;

var а: real;

begin

readln (a);

if а < 0 then а:= –a;

writeln (‘ Модуль введеного числа ’, a);

readln

end.

В загальному вигляді конструкція розгалуження має вигляд:

if < умова > then < дія1 >

else < дія2 >;

В загальному випадку після слова then, так само як і після слова else може стояти не одна дія, а декілька. В цьому випадку всі команди, що йдуть після відповідного слова слід брати в операторні дужки begin... end. Якщо в деякому розгалуженні має місце нове розгалуження, то кажуть, що таке розгалуження є складним або вкладеним. Необхідно пам’ятати ще два правила:

n перед командою else крапку з комою ні в якому випадку ставити не можна;

n команда else завжди стосується останнього оператора if, для якого немає команди else.

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

Для прикладу розв’яжемо повністю класичну задачу з шкільного курсу інформатики, яку ми вже згадували раніше.

Задача 54. 54. Скласти програму розв’язання квадратного рівняння.

Розв’язання: В загальному вигляді квадратне рівняння має вигляд:

ax 2 + bx + c = 0

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

program kwur;

label 10,20,30;

var a,b,c,d,x1,x2: real;

begin

writeln(‘ Програма розв’’язує квадратнi рiвняння! ’);

writeln(‘ Загальний вигляд квадратного рiвняння: ’);

writeln(‘ Ax*x + B*x + C = 0 ’);

writeln(‘ Введiть коефiцiєнти: ’);

10: write(‘A = ’);readln(a);

if a = 0 then begin

writeln(‘Цей випадок роз’’вяжiть самi. ’);

goto 10;

end;

20: write(‘B = ’);readln(b);

if b = 0 then begin

writeln(‘ Цей випадок розв’’яжiть самi. ’);

goto 20;

end;

30: write(‘C = ’);readln(c);

if c = 0 then begin

writeln(‘ Цей випадок розв’’яжiть самi. ’);

goto 30;

end;

d:= b*b - 4*a*c;

if d > 0 then begin

writeln(‘ Рiвняння має два коренi: ’);

x1:= (-b-sqrt(d))/(2*a);

x2:= (-b+sqrt(d))/(2*a);

writeln(‘x1 = ’,x1:2:2, ‘ x2 = ’,x2:2:2);

end

else if d = 0 then begin

writeln(‘ Рiвняння має один корiнь: ’);

x1:= -b/(2*a);

writeln(‘x = ’,x1:2:2);

end

else writeln(‘ Дане рiвняння коренiв не має. ’);

readln;

end.

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

Задача 55. 55. На площині задано три точки своїми координатами. Чи лежать точки на одній прямій.

Розв’язання: Розв’язок здається напрошується: знайти відстань між всіма трьома точками і якщо сума двох з них дорівнює третій, то точки лежать на одній прямій, в противному випадку – ні. Що ж, перевіряємо:

program pixel3;

var x1,x2,x3,y1,y2,y3: integer;

d1,d2,d3: real;

begin

writeln('Координати точки А:');

write('Ха = ');readln(x1);

write('Ya = ');readln(y1);

writeln('Координати точки B:');

write('Хb = ');readln(x1);

write('Yb = ');readln(y1);

writeln('Координати точки C:');

write('Хc = ');readln(x1);

write('Yc = ');readln(y1);

{ Перевірка на підставі описаного вище способу }

d1:= sqrt(sqr(x1-x2)+sqr(y1-y2));

d2:= sqrt(sqr(x1-x3)+sqr(y1-y3));

d3:= sqrt(sqr(x2-x3)+sqr(y3-y3));

if (d1 = d2 + d3) or (d2 = d1 + d3) or (d3 = d1+d2)

then writeln('На однiй прямiй.')

else writeln('Не на однiй прямiй.');

readln

end.

Але давайте подумаємо, чи не можна розв’язати задачу іншим способом? Виявляється можна, для цього потрібно просто пам’ятати рівняння прямої, що проходить через дві точки виражене через координати, яке вивчалось на уроках геометрії. Ви можете сказати: так то через дві точки, а в нас їх аж три! Вірно, тим краще! Чому – спробуйте здогадатись самі і лише після цього приступайте до самостійної реалізації запропонованого способу. Якщо ж ні – то вам пропонується другий варіант розв’язання, детально розібравшись з яким ви, мабуть, вже не забудете рівняння прямої. Отже, спосіб другий:

program pixel3а;

var x1,x2,x3,y1,y2,y3: integer;

begin

writeln('Координати точки А:');

write('Ха = ');readln(x1);

write('Ya = ');readln(y1);

writeln('Координати точки B:');

write('Хb = ');readln(x2);

write('Yb = ');readln(y2);

writeln('Координати точки C:');

write('Хc = ');readln(x3);

write('Yc = ');readln(y3);

{ Перевірка на підставі рівняння прямої }

if (х1 – х2)*(х3 – х2) – (у1 – у2) * (у3 – у2) = 0

then writeln('На однiй прямiй.')

else writeln('Не на однiй прямiй.');

readln

end.

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

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

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

Розглянемо ще одну цікаву задачу, яка також легко розв’язується з застосуванням рівняння прямої.

Задача 56. 56. Два відрізки задано координатами своїх кінців. Визначити, чи перетинаються дані відрізки.

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

Для точок С і D відносно прямої АВ:

((Xc-Xa)(Xb-Xa) - (Yc-Ya)(Yb-Ya))Ч((Xd-Xa)(Xb-Xa) - (Yd-Ya)(Yb-Ya))<0

Для точок A і B відносно прямої CD:

((Xa-Xc)(Xd-Xc) - (Ya-Yc)(Yd-Yc))Ч((Xb-Xc)(Xd-Xc) - (Yb-Yc)(Yd-Yb))<0

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

program line2;

var x1,x2,x3,x4,y1,y2,y3,y4: integer;

begin

writeln('Координати точки А:');

write('Ха = ');readln(x1);

write('Ya = ');readln(y1);

writeln('Координати точки B:');

write('Хb = ');readln(x2);

write('Yb = ');readln(y2);

writeln('Координати точки C:');

write('Хc = ');readln(x3);

write('Yc = ');readln(y3);

writeln('Координати точки D:');

write('Хd = ');readln(x4);

write('Yd = ');readln(y4);

if (((x3-x1)*(x2-x1)-(y3-y1)*(y2-y1))*((x4-x1)*(x2-x1)-(y4-y1)*(y2-y1))<=0) and

(((x1-x3)*(x4-x3)-(y1-y3)*(y4-y3))*((x2-x3)*(x4-x3)-(y2-y3)*(y4-y3))<=0)

then writeln('Перетинаються.')

else writeln('Не перетинаються');

readln

end.

Інструкція Case

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

Задача 57. 57. В залежності від отриманої учнем оцінки вивести на екран відповідне повідомлення.

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

program ocenka1;

var o: integer;

begin

write(‘Введiть отриману оцiнку: ’);

readln(o);

if o = 5 then writeln(‘Молодець! Вiзьмеш дома цукерку.’)

else if o = 4 then writeln(‘Непогано! Але без цукерок!’)

else if o = 3 then writeln(‘Мiг би й краще!’)

else if o = 2 then writeln(‘Мабуть ти забув про школу.’)

else writeln(‘Пробач, але такої оцiнки не ставлять.’);

readln

end.

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

в залежності від значення змінної зробити вибір, а саме:

при значенні1 – вивести повідомлення1;

при значенні2 – вивести повідомлення2;

...

при значенніn – вивести повідомленняn.

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

...

case o of

{ вибір від значення змінної о }

<01>: <дія1>; { при одному значенні – одна дія }

<02>: <дія2>; { при другому – друга дія }

<03>: <дія3>; { при третьому значенні – третя дія }

<04>: <дія4>; { при четвертому значенні – четверта дія }

end;

{ кінець вибору }

...

Якщо після якогось значення змінної потрібно виконувати не одну дію, а декілька, то всі оператори, що відносяться до даного випадку беруться в операторні дужки begin... end. Крім того, конструкція case передбачає варіант виконання дій у тому випадку, коли змінна не набула жодного з вказаних у операторі вибору значень – цьому призначено, як і при організації умовного оператора команду else. Знову ж таки, перед гілкою else крапку з комою ставити забороняється.

Ви вже, напевне, самі звернули увагу, що для команди case обов’язково в кінці ставиться end, тобто в нас з’явилась ще одна “нерозлучна солодка парочка”.

Отже спробуємо розв’язати останню задачу при допомозі команди вибору.

program ocenka2;

var o: integer;

begin

write(‘Введiть отриману оцiнку: ’);

readln(o);

case o of

5: writeln(‘Молодець! Вiзьмеш дома цукерку.’);

4: writeln(‘Непогано! Але без цукерок!’);

3: writeln(‘Мiг би й краще!’);

2: writeln(‘Мабуть ти забув про школу.’)

else writeln(‘Пробач, але такої оцiнки не ставлять.’);

end; { case }

readln

end.

Зверніть увагу наскільки в порівнянні з попереднім варіантом більш зрозумілою стала наша програма.

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

Задача 58. 58. Скласти програму, що моделює торгівлю на базарі.

Розв’язання: Припусти, що ми захотіли купити на базарі взуття. Будемо видавати на екран відповідні повідомлення в залежності від діапазону цін продавців.

program bazar;

var sk: integer;

begin

writeln(‘Скiльки коштують цi дирявi валяночки? ’);

readln(sk);

case sk of

1..10: writeln(‘Мабуть куплю, якщо не знайду дешевшi.’);

11..50: writeln(‘Трохи дорогувато!’);

51..100: writeln(‘Вони що у вас, золотi?’)

else writeln('Мабуть менi почулось!');

end; { case }

readln

end.

Цей нескладний приклад ми привели лише для того, щоб показати використання діапазонів значень при організації вибору. Слід наголосити, що змінні в діапазонах повинні обов’язково бути перераховуваних типів, крім того значення змінної не може перевищувати тип word. Саме тому допускається використання змінних лише відповідних цілочисельних типів та змінних типу char.

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

З більш складнішими прикладами застосування команди вибору ми познайомимось трохи пізніше.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: