Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Задача 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.

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

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





Поделиться с друзьями:


Дата добавления: 2016-11-18; Мы поможем в написании ваших работ!; просмотров: 1557 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Так просто быть добрым - нужно только представить себя на месте другого человека прежде, чем начать его судить. © Марлен Дитрих
==> читать все изречения...

2463 - | 2219 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.013 с.