Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Банк олимпиадных заданий.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
374.86 Кб
Скачать

Ограничения

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

Во-первых, в данной задаче необходимо ввести ограничение на несовпадение точек A (x1; y1), B (x2; y2) и С (х3; у3). Т.е. во входных данных не должно существовать одинаковых точек.

Во-вторых, возможны случаи когда точки A (x1; y1), B (x2; y2) и С (х3; у3) лежат на одной прямой. В данном случае теряется смысл построения перпендикуляра к отрезку, целесообразным становится сообщить об этом пользователю и прекратить работу программы. Если действительно входные данные (точки) лежат на одной прямой, то по той же вышеуказанной формуле нахождения косинуса угла можно выявить такой момент, добавив условие на равенство модуля косинуса хотя бы одного угла единице. Как уже было замечено для данной проверки необходимо и достаточно проверить лишь один угол.

Алгоритм решения:

Вводим координаты трех точек A (x1; y1) , B (x2; y2) и С (х3; у3)

Проверяем точки на совпадение(((x1=x2) and (y1=y2)) or ((x2=x3) and (y2=y3)) or ((x1=x3) and (y1=y3)))

Находим длины отрезков АС, AB, BC (АС:=sqr(x1-x3)+sqr(y1-y3))

Находим косинусы углов b1:=(AB+BC-AC)/(2*sqrt(AB*BC));

Проверяем равны ли они 1(или хотя бы один из них – принадлежат ли они одной прямой) if (abs(a1)=1) then

Проверяем отрицательные или положительные косинусы углов => если >0,то«на продолжение», иначе «на отрезок»

program otrezok ; var x1,x2,x3,y1,y2,y3,AC,AB,BC,a1,b1:real; k,k1:text; begin

{Считывание данных из файла} assign (k, 'S.txt'); {привязка переменной k к файлу S} reset(k); {открываем существующий файл S.txt} readln(k,x1,y1); {ввод координат начала отрезка, точки А} readln(k,x2,y2); {ввод координат конца отрезка, точки В} readln(k,x3,y3); {ввод координат точки С} close(k); {закрыть текстовый файл c переменной k}

{Проверка точек на совпадение}

if (((x1=x2) and (y1=y2)) or ((x2=x3) and (y2=y3)) or ((x1=x3) and (y1=y3))) then

begin

assign(k1, 'S1.txt');

rewrite(k1);

writeln('Введены неверные данные');

writeln(k1,'Введены неверные данные');

close(k1);

end else

{Поиск косинусов углов при отрезке по теореме косинусов}

begin АС:=sqr(x1-x3)+sqr(y1-y3); { нахождение длины отрезка АС}

АВ:=sqr(x2-x1)+sqr(y2-y1); { нахождение длины отрезка АВ} ВС:=sqr(x3-x2)+sqr(y3-y2); { нахождение длины отрезка ВС} b1:=(AB+BC-AC)/(2*sqrt(AB*BC)); { косинус угла АВС} a1:=(AC+AB-BC)/(2*sqrt(AC*AB)); { косинус угла ВАС}

if (abs(a1)=1) then { если косинус хотя бы одного угла равен 1}

{Проверка точек на принадлежность одной прямой}

begin

assign(k1, 'S1.txt');

rewrite(k1);

writeln('Точки лежат на одной прямой');

writeln(k1,'Точки лежат на одной прямой');

close(k1);

end else

begin if (a1 < 0) or (b1 < 0) then {если косинусы углов отрицательные}

{Вывод результатов} begin assign(k1, 'S1.txt'); rewrite(k1); writeln('на продолжение'); writeln(k1,'на продолжение');

close(k1); end else { если косинусы углов положительные} begin assign(k1, 'S1.txt'); rewrite(k1); writeln ('на отрезок'); writeln(k1,'на отрезок'); close(k1); end; end;

end;

end.

Тестирование задачи

Координаты точек A, B, C.

Ответ

1 2

1 2

3 3

Введены неверные данные

2 2

3 4

5 8

Точки лежат на одной прямой

0 0

-3 2

-5 0

На продолжение

4 4 7 3 9 5

На продолжение

1 4

5 -1

-1 -1

На отрезок

4 8

1 2

3 3

На отрезок

Элементы вычислительной геометрии