Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 15.02.2020
Сообщений: 25

Вычислить площадь треугольников с помощью формулы Герона

21.02.2020, 16:38. Показов 4606. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проверьте код, пожалуйста. Не понимаю, почему не работает, вроде все адекватно описано и расписано. Вот задание с кодом:

Два треугольника заданы координатами своих вершин A, B и С. Вычислить площадь треугольников с помощью формулы Герона и определить, какой треугольник имеет большую площадь. При решении задачи использовать следующие данные: для первого треугольника А(1;1), B(4;2), C(2;3,5); для второго треугольника A(1;2), B(4;1), C(3;3,5). Вычисление длин сторон треугольника и его площади по формуле Герона оформить в одной функции.
Указание:
Длина отрезка, соединяющего точки P(X1,Y1) и Q(X2,Y2) вычисляется по формуле https://www.cyberforum.ru/cgi-bin/latex.cgi?\left|\bar{PQ} = sqrt(({{x}_{2}-{x}_{1}})^{2}+({{y}_{2}-{y}_{1}})^{2})\right|
По формуле Герона площадь треугольника со сторонами a, b, c равна https://www.cyberforum.ru/cgi-bin/latex.cgi?S = sqrt(p(p-a)(p-b)(p-c)), где p - полупериметр треугольника, т. е. p = (a + b + c)/2. В программе предусмотреть вывод необходимой текстовой информации и проверку существования треугольника.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <cmath>
 
using namespace std;
 
float area(float S, float s);
 
int main(){
    float S, A, B, C, a, b, c, s;
    
    cout << "Area this is triangle = " << area(S, s);
    
    return 0;
}
 
float area(float S, float s){
    int A, B, C, a, b, c;
    int Ax = 1, Ay = 1, Bx = 4, By = 2, Cx = 2, Cy = 3.5;
    int ax = 1, ay = 2, bx = 4, by = 1, cx = 3, cy = 3.5;
    double p, p1;
    
    if ((A < B + C) && (B < A + C) && (C < A + B))
        cout << "First triangle exsits" << endl;
    else
        cout << "First triangle doesn't exists" << endl;
 
    if((a < b + c) && (b < a + c) && (c < a + b))
        cout << "Second triangle exsits" << endl;
    else
        cout << "Second triangle doesn't exsits" << endl;
    
    A = abs(sqrt(pow((Bx - Ax),2) + (pow((By - Ay),2))));
    B = abs(sqrt(pow((Cx - Bx),2) + (pow((Cy - By),2))));
    C = abs(sqrt(pow((Ax - Cx),2) + (pow((Ay - Cy),2))));
    
    a = abs(sqrt(pow((bx - ax),2) + (pow((by - ay),2))));
    b = abs(sqrt(pow((cx - bx),2) + (pow((cy - by),2))));
    c = abs(sqrt(pow((ax - cx),2) + (pow((ay - cy),2))));
    
    p = (A + B + C) / 2;
    p1 = (a + b + c) / 2;
    
    S = sqrt(p * (p - A) * (p - B) * (p - C));
    s = sqrt(p * (p - a) * (p - b) * (p - c));
    
    cout << "Area first triangle: " << S << endl;
    cout << "Area second triangle: " << s << endl;
    
    if(S > s){
        cout << "The area of the first triangle is larger than the second" << endl;
    }
    else if(S < s){
        cout << "The area of the second triangle is larger than the first" << endl;
    }
    else{
        cout << "The area of the triangles are equal" << endl;
    }
    return S, s;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2020, 16:38
Ответы с готовыми решениями:

Вычислить площади треугольников с помощью формулы Герона
два треугольника заданы координатами своих вершин A, B и C.вычислить площади треугольников с помощью формулы Герона и определить , какой...

Вычислить площади треугольников с помощью формулы Герона и определить, какой треугольник имеет большую площадь
Два треугольника заданы координатами своих вершин. Вычислить площади треугольников с помошю формулы Герона и определить, какой треугольник...

Вычислить площади треугольников с помощью формулы Герона
Два треугольника заданы координатами своих вершин. Вычислить площади треугольников с помощью формулы Герона и определить, какой треугольник...

18
 Аватар для Recrut_rf
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,438
21.02.2020, 17:08
KProgramGirl, во первых
Цитата Сообщение от KProgramGirl Посмотреть сообщение
return S, s;
вернёт s (которое малое). Чтобы вернуть из функции больше одной переменной, нужно либо оборачивать их в структуру и её возвращать, либо передавать в функцию эти переменные по ссылке (или указатель на эти переменные).

во вторых:
Цитата Сообщение от KProgramGirl Посмотреть сообщение
if ((A < B + C) && (B < A + C) && (C < A + B))
лично мне не понятно, что вы имели ввиду в условии A < B + C, да, я могу посмотреть приоритеты операций (наизусть их не помню), но вдруг вы ошиблись. Лично я в данном (и подобных) выражении использовал бы скобки, чтобы явно указать приоритет операций.

У меня пока всё. Остальное не смотрел.
1
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
21.02.2020, 18:28
почему у вас расчет длин сторон треугольников идет после проверки существования? вы сравниваете не соотношения длинн сторон, а мусор.
также в случае не существования одного из тругольников нет смысла продолжать вычисления после вывода сообщения можно завершать выполнение функции

Добавлено через 3 минуты
исходя из задания вообще нет смысла возвращать из функции значения, но судя по всему координаты вершин надо передать в фукцию.
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
22.02.2020, 15:35
Цитата Сообщение от Annemesski Посмотреть сообщение
исходя из задания вообще нет смысла возвращать из функции значения
Вы так считаете ?

KProgramGirl, в функции не нужно повторять строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <cmath>
 
using namespace std;
 
double TriangleArea(double x1, double y1, double x2, double y2, double x3, double y3)
{   
    double a, b, c, p, eps=1e-9;
    a=fabs(sqrt(pow(x1-x2,2)+pow(y1-y2,2))); // или a=hypot(x1-x2,y1-y2); 
    b=fabs(sqrt(pow(x2-x3,2)+pow(y2-y3,2))); // или b=hypot(x2-x3,y2-y3);
    c=fabs(sqrt(pow(x1-x3,2)+pow(y1-y3,2))); // или c=hypot(x1-x3,y1-y3);
    
    if (a<b+c-eps && b<a+c-eps && c<a+b-eps)
    {
        p=(a+b+c)/2.;
        return sqrt(p*(p-a)*(p-b)*(p-c));
    }
    return 0;   
}
 
int main()
{
    
    double A1x=1., A1y=1., B1x=4., B1y=2., C1x=2., C1y=3.5, S1, eps=1e-9;
    double A2x=1., A2y=2., B2x=4., B2y=1., C2x=3., C2y=3.5, S2;
    
    S1=TriangleArea(A1x,A1y,B1x,B1y,C1x,C1y);
    if (S1<=eps) cout << "First triangle doesn't exist\n";
    else cout << "Area 1 = " << S1 << "\n";
    
    S2=TriangleArea(A2x,A2y,B2x,B2y,C2x,C2y);
    if (S2<=eps) cout << "Second triangle doesn't exist\n"; 
    else cout << "Area 2 = " << S2 << "\n";
    
    if(S1>eps && S2>eps)
    {
        if(S1>S2+eps) cout << "Area 1 > Area 2\n";
        else if (S1<S2-eps) cout << "Area 1 <  Area 2\n";
        else cout << "Area 1 = Area 2\n";
    }
  
system("pause");
return 0;
}
1
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
22.02.2020, 23:42
Yetty,
Вы так считаете ?
Задание: Вычислить площадь треугольников с помощью формулы Герона и определить, какой треугольник имеет большую площадь.

Да, явного указания, типа: вывести площадь большего треугольника или чего-то подобного нет.

К стати, а зачем Вам этот эпсилон? Ведь треугольник у которого одна из сторон точно равна сумме двух других существует и является вырожденным, да, он имеет нулевую площадь, но он существует, а Ваша программа говорить что нет.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.02.2020, 01:00
Проверку существования треугольника можно сделать на этапе вычисления площади. Если число, из которого надо извлекать корень, положительно, то треугольник существует.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.02.2020, 02:05
Цитата Сообщение от Annemesski Посмотреть сообщение
зачем Вам этот эпсилон
почитайте как сравниваются числа типа double
Цитата Сообщение от Annemesski Посмотреть сообщение
он имеет нулевую площадь, но он существует
как Вы собрались выполнить
Цитата Сообщение от KProgramGirl Посмотреть сообщение
проверку существования треугольника
Цитата Сообщение от palva Посмотреть сообщение
Проверку существования треугольника можно сделать на этапе вычисления площади
какой в этом смысл, если в коде проверка делается ещё раньше и при отрицательном ответе не происходит вычисление
Цитата Сообщение от palva Посмотреть сообщение
числа, из которого надо извлекать корень
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.02.2020, 03:39
Цитата Сообщение от Yetty Посмотреть сообщение
какой в этом смысл, если в коде проверка делается ещё раньше и при отрицательном ответе не происходит вычисление
Программа станет проще. Проверку существования можно будет осуществить одним сравнением. Правда, если треугольника не существует, что окажется, что мы произведем больше вычислений, нежели чем при том способе проверки, который приведен в программе. Отрицательное число может получиться только в результате ошибок округления, когда точки лежат на одной прямой, а вычисления дали не теоретический ноль, а немного меньшее число. Я так понимаю, что это довольно редкое событие.
Цитата Сообщение от Annemesski Посмотреть сообщение
да, он имеет нулевую площадь, но он существует
Тогда непонятно, почему в задаче предлагают выяснять существование. По вашему определению любые три точки плоскости образуют треугольник, который существует.

Добавлено через 51 минуту
Чтобы выяснить, что треугольник существует (не вырождается в отрезок) не нужно вычислять длины и квадратные корни. Раз уж нам даны координаты точек, то достаточно проверить на не ноль величину (bx-ax)*(cy-ay)-(by-ay)*(cx-ay) Как доказать это просто -- не знаю. Но модуль этой величины как раз и равен удвоенной площади треугольника.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
23.02.2020, 10:11
Цитата Сообщение от palva Посмотреть сообщение
По вашему определению любые три точки плоскости образуют треугольник, который существует.
Вообще нет. Если a < b+c (для всех сторон) треугольник существует. Если a > b+c, треугольник не существует. Если a = b+c, треугольник является вырожденным. Другое дело, что для чисел с плавающей точкой точное равенство все равно невозможно.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
23.02.2020, 12:01
Цитата Сообщение от elenayagubova Посмотреть сообщение
Если a > b+c, треугольник не существует.
Теоретически это невозможная ситуация. Вспомните, как вычислялись a, b, c. Это попарные расстояния между двумя точками. Хотя в реальности она возможна, поскольку возникает погрешность при их вычислении. Поэтому, в частности, недостаточно сравнивать расстояния. При извлечении корня в формуле Герона может возникнуть небольшое отрицательное значение, хотя проверка неравенствами пройдет. Конечно, это бывает крайне редко, но для просчета старта космической ракеты я бы эту проверку в любом случае включил.

Сама задача крайне нелепая. Но такой уж у нас теперь уровень образования.

Нелепая, хотя бы потому что здесь требуется проверка плавающего вычисленного значения на равенство. Препод как раз должен был объяснять, почему это некорректно.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
23.02.2020, 12:19
palva, а, точно ведь, тогда, конечно,
Цитата Сообщение от palva Посмотреть сообщение
Сама задача крайне нелепая.
Тут можно и без неравенства треугольника тогда: проверять, что третья точка не лежит на прямой, образованной первыми двумя(если вырожденный треугольник мы за треугольник не считаем), но погрешности, конечно, все равно никуда не денутся. Я бы проверяла уже на этапе извлечения корня, именно потому, что
Цитата Сообщение от palva Посмотреть сообщение
При извлечении корня в формуле Герона может возникнуть небольшое отрицательное значение, хотя проверка неравенствами пройдет
0
23.02.2020, 12:36

Не по теме:

Цитата Сообщение от elenayagubova Посмотреть сообщение
Тут можно и без неравенства треугольника тогда: проверять, что третья точка не лежит на прямой, образованной первыми двумя
Имхо, задача на конкретные формулы, т.е. проверка существования - через длины сторон. Проще всего конечно сделать через псевдоскалярное произведение, как указали в посте 8.

0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.02.2020, 14:52
Цитата Сообщение от palva Посмотреть сообщение
Сама задача крайне нелепая
условие задачи полностью корректно
Цитата Сообщение от palva Посмотреть сообщение
Нелепая, хотя бы потому что здесь требуется проверка плавающего вычисленного значения на равенство.
во-первых не требуется, во-вторых в коде нет проверок на равенство
Цитата Сообщение от elenayagubova Посмотреть сообщение
для чисел с плавающей точкой точное равенство все равно невозможно
конечно же это не так
C++
1
2
3
double a=4.3, b=4.3;
if (a==b) cout << "YES\n";
else cout << "NO\n";
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
23.02.2020, 14:56
Цитата Сообщение от Yetty Посмотреть сообщение
конечно же это не так
Скажу по-другому: на это нельзя положиться. Длины вычисляются как квадратные корни, а не задаются в программе, сравнивать затем их с помощью == некорректно.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.02.2020, 15:10
elenayagubova, формулируйте что хотели сказать более точно, не забывайте что сообщения на форуме читают и новички. вещественные числа полученные в результате вычислений сравниваются с помощью малого числа. но есть вычисления при которых это излишне.
я так и не разобрал, что Вы с pavla говорили насчёт нелепости задачи ?
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
23.02.2020, 15:28
Цитата Сообщение от Yetty Посмотреть сообщение
я так и не разобрал, что Вы с pavla говорили насчёт нелепости задачи ?
Три точки всегда образуют треугольник. Частный случай - вырожденный треугольник, если точки лежат на одной прямой, и площадь такого треугольника нулевая. Т.е. тут в принципе возможно только два случая: a < b+c или a == b+c, так что проверка неравенства треугольника сводится к проверке условия a!=b+c Даже если считать, что это тот самый случай, когда треугольник не существует, точная проверка здесь невозможна, можно только сказать, что площадь треугольника близка к нулю. А тогда должно быть указание - если площадь меньше некоторого eps, считаем, что треугольник не существует.
А полноценно проверять на существование можно треугольники с заданными точными значениями длинами сторон.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.02.2020, 16:42
elenayagubova, я так понимаю Вы уходите в обсуждение вырожденного треугольника. но зачем ? если в условии специально не оговорено, треугольник предполагается невырожденным, т.е. треугольник - геометрическая фигура образованная тремя отрезками, которые соединяют три точки не лежащие на одной прямой.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
23.02.2020, 16:48
Yetty, в условии есть
Цитата Сообщение от KProgramGirl Посмотреть сообщение
В программе предусмотреть вывод необходимой текстовой информации и проверку существования треугольника.
С точки зрения геометрии, если даны точки, треугольник существует в любом случае, кроме вырожденного (и тот в общем случае тоже может считаться существующим). Так что проверка существования здесь по идее и сводится к проверке на вырожденность.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
23.02.2020, 16:57
Цитата Сообщение от elenayagubova Посмотреть сообщение
Так что проверка существования здесь по идее и сводится к проверке на вырожденность.
если точки разные, это правильно. именно и это и происходит в коде:
Цитата Сообщение от Yetty Посмотреть сообщение
if (a<b+c-eps && b<a+c-eps && c<a+b-eps)
если a=b+c получаем 0<-eps условие false. треугольник не существует. так к чему все эти Ваши сообщения после кода ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2020, 16:57
Помогаю со студенческими работами здесь

Вычислить площади треугольников по формуле Герона и определить, какой треугольник имеет большую площадь
Два треугольника заданы своими сторонами А, В, С. Вычислить площади треугольников по формуле Герона и определить, какой треугольник имеет...

Вычислить площади 2-х треугольников формулой Герона и определить, какой треугольник имеет большую площадь
Два треугольника заданы координатами своих вершин. Вычислить площади треугольников с помощью формулы Герона и определить, какой треугольник...

Вычислить площади треугольников по формуле Герона
Два треугольника заданы своими сторонами a, b и c (т.е. заданы длины сторон a, b и c). Вычислить площади треугольников по формуле Герона и...

Вычислить площади двух треугольников, и определить, какой из треугольников имеет большую площадь
Два треугольника заданные координатами своих вершин a, b, c. Вычислить площади треугольников, используя формулы Герона, и определить, какой...

Определить площади двух треугольников, заданных длинами сторон (через клавиатуру), по формуле Герона. Полупериметр вычислять с помощью функции
Привет всем, ребят кому не сложно помогите,написать програму на Си++ для института только учусь чето пробовал не получаеться 3 написал а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru