Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2017, 21:06   #1
AndrewDude
Новичок
Джуниор
 
Регистрация: 24.09.2017
Сообщений: 2
По умолчанию [Pascal] Задача о выяснении, существует три треугольник, заданный координатами своих вершин. Проблема со сравнением вещественных чисел. Код внутри.

Доброго времени суток! Необходимо сделать проверку на существование треугольника по координатам трех его вершин в декартовой системе. Сделал вычисление его сторон, далее хотел сделать основную проверку существования типа a+b<c, но т.к. вещественные числа нельзя сравнивать решил попробовать другой способ(в коде). Этот тоже отказывается работать с некоторыми координатами. Подскажите, пожалуйста, другой способ.
Код:
program triangle;
var x1,x2,x3,y1,y2,y3,a,b,c : real;
begin
writeln ('Введите точки x1 и y1');
readln (x1,y1);
writeln ('Введите точки x2 и y2');
readln (x2,y2);
writeln ('Введите точки x3 и y3');
readln (x3,y3);
a:=sqrt(sqr(x2-x1)+sqr(y2-y1));
b:=sqrt(sqr(x3-x2)+sqr(y3-y2));
c:=sqrt(sqr(x1-x3)+sqr(y1-y3));
if(abs((b+c)-a)<0.00001)or(abs((a+c)-b)<0.00001)or(abs((a+b)-c)<0.00001)//проверка на существование
  then writeln('Треугольник построить нельзя');
  end.
Заранее благодарю.
AndrewDude вне форума Ответить с цитированием
Старый 24.09.2017, 22:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от AndrewDude Посмотреть сообщение
но т.к. вещественные числа нельзя сравнивать
вещественные числа нельзя сравнивать на точное равенство.
а вот больше-меньше - вполне даже можно.

попробуйте так:
Код:
if ((b+c)>a) and ((a+c)>b) and ((a+b)>c)//проверка на существование
  then WriteLn('треугольник построить можно')
  else WriteLn('Треугольник построить нельзя');
если код не сработает - приведите контрпример (координаты точек, при которых код не работает правильно).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.09.2017, 18:02   #3
AndrewDude
Новичок
Джуниор
 
Регистрация: 24.09.2017
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если код не сработает - приведите контрпример (координаты точек, при которых код не работает правильно).
К примеру, (0;1),(2;3),(6;7). На плоскости точки находятся на одной линии, а программа говорит о существовании треугольника(скрин).
Изображения
Тип файла: jpg Безымянный.jpg (26.9 Кб, 41 просмотров)
AndrewDude вне форума Ответить с цитированием
Старый 26.09.2017, 10:33   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от AndrewDude Посмотреть сообщение
К примеру, (0;1),(2;3),(6;7). На плоскости точки находятся на одной линии, а программа говорит о существовании треугольника(скрин).
Вы абсолютно правы. а я был не прав.
PascalABC.NET действительно так себя ведёт.

предлагаю такой вариант:
Код:
if (abs((b+c)-a)>0.000001) and (abs((a+c)-b)>0.000001) and (abs((a+b)-c)>0.000001)//проверка на существование
  then WriteLn('треугольник построить можно')
  else WriteLn('Треугольник построить нельзя');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.09.2017, 11:01   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от AndrewDude Посмотреть сообщение
но т.к. вещественные числа нельзя сравнивать
- а это еще почему? Я вообще по C++ специалист, но по-моему в любом высокоуровневом языке можно сравнивать вещественные числа. Правда, надо еще погрешность учитывать и есть еще фокусы с вещественными числами. Но это уже отдельный вопрос.
Cuprum5 на форуме Ответить с цитированием
Старый 26.09.2017, 11:21   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- а это еще почему? Я вообще по C++ специалист, но по-моему в любом высокоуровневом языке можно сравнивать вещественные числа.
сравнивать можно. вот только результат сравнения совсем не очевиден.
сходите в эту тему (раздел С++) Оператор for, посмотрите пример неработающего кода.
вот, например, образец неработающего кода на ideone - https://ideone.com/pS5aa4


Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Правда, надо еще погрешность учитывать и есть еще фокусы с вещественными числами. Но это уже отдельный вопрос.
это не отдельный вопрос. Речь как раз об этих "фокусах" и идёт.
это когда Вы в программке пишете float x=0.5; if (x==0.5) { <код> } - а <код> и не выполняется...

Последний раз редактировалось Serge_Bliznykov; 26.09.2017 в 11:34.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
У трех четырехугольников, заданных координатами своих вершин в трехмерном пространстве определите площади Nikproc Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2016 17:51
Многоугольник на плоскости задан целочисленными координатами своих N вершин в декартовой системе координат isst Паскаль, Turbo Pascal, PascalABC.NET 13 04.01.2015 18:58
Геометрическая задача - проверить, попадает ли начало координат (0,0) в заданный координатами вершин треугольник (FreePascal) Ilai Помощь студентам 12 16.10.2014 09:25
Треугольник на плоскости задан координатами своих вершин.Найти координаты точки пересечения его медиан. Silver23 Помощь студентам 2 13.01.2010 15:59