Площадь треугольника

209
18 мая 2018, 19:20

Как вычислить площадь и периметр треугольника по 3 сторонам? Проверить возможно ли его создать?

Нашел и немного переделал вот такой пример

#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "conio.h"
using namespace std;
float qwer(float x1, float x2, float y1, float y2) {
    float d;
    d = sqrt(y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1);
    return d;
}
float per(float a, float b, float c) {
    return (a + b + c) / 2;
}
int main()
{
    setlocale(LC_ALL, "Rus");
    float x[3], y[3];
    int i;
    for (i = 0; i < 3; i++) {
        cout << "Введите координаты " << i + 1 << " точки: ";
        cin >> x[i] >> y[i];
    }
    float a, b, c;
    a = qwer(x[0], x[1], y[0], y[1]);
    b = qwer(x[1], x[2], y[1], y[2]);
    c = qwer(x[2], x[0], y[2], y[0]);
    float pt;
    pt = (a, b, c);
    cout << "Площадь треугольники" << sqrt(pt*(pt - a)*(pt - b)*(pt - c)) << endl;
    _getch();
    return 0;
}

но после ввода значений выдает вот что

Введите координаты 1 точки: 1 2
Введите координаты 2 точки: 3 -1
Введите координаты 3 точки: 2 5
Площадь треугольника-nan(ind)
Answer 1
int main()
{
    double x[3], y[3];
    for (int i = 0; i < 3; i++) {
        cout << "Введите координаты " << i + 1 << " вершины: ";
        cin >> x[i] >> y[i];
    }
    cout << "Площадь треугольника "
         << fabs((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2
         << endl;
}

Если, конечно, вы ищете по трем вершинам, как в исходном коде, а не по сторонам, как в заголовке вопроса...

По сторонам:

int main()
{
    double l[3];
    for (int i = 0; i < 3; i++) {
        cout << "Введите длину " << i + 1 << " стороны: ";
        cin >> l[i];
    }
    double p = (l[0]+l[1]+l[2])/2;
    p *= (p-l[0])*(p-l[1])*(p-l[2]);
    if (p <= 0.0)
        cout << "Треугольник не существует\n";
    else
        cout << "Площадь треугольника " << sqrt(p) << endl;
}
Answer 2

Если смотреть условие задачи текстом:

Заданы длины трех сторон.

  1. Нужно проверить что треугольник существует. Треугольник не существует, если самая длинная сторона больше суммы двух других. Находите самую длинную сторону, сравниваете с суммой длин двух других. Также не помешало бы проверить, что все длины больше нуля. Хотя, если треугольник не существует, то подкоренное выражение в формуле Герона будет меньше или равно нулю, можно проверять его.
  2. Смотрите описание формулы Герона, по ней находите площадь треугольника.
  3. Находите периметр как сумму трех сторон.

Код в вопросе решает другую задачу: находит площадь по координатам трех точек. Сначала вычисляются длины сторон (a, b, c), потом используется формула Герона.

Ошибки в коде две:

  • sqrt(y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1) - квадратный корень берется только от первой скобки. Добавьте общие скобки: sqrt((y2 - y1)*(y2 - y1) + (x2 - x1)*(x2 - x1))
  • pt = (a, b, c); - здесь предполагается вызов функции вычисления полупериметра (в коде это per) для последующего использования в формуле Герона. Собственно, пропущено имя функции, должно быть так: pt = per(a, b, c);
    Или проще: pr = (a + b + c) / 2; Полупериметр у вас вычисляется один раз, вычисляется в одну строку, зачем заводить для этого отдельную функцию?
READ ALSO
нарушение доступа для чтения с бинарным файлом

нарушение доступа для чтения с бинарным файлом

Здравствуйте, третий час сижу и не могу понять, выдает ошибку при выходе из функции Get_write, помогите пожалуйста!

208
Подключение класса в cli c++

Подключение класса в cli c++

Вопрос на счет подключения своих классов в cli, есть код, и при подключении класса с интами все хорошо, но при попытке подключить со string выдает...

242
Умные указатели. C++

Умные указатели. C++

Имеется такая иерархия классов:

214
Что означает запись vector&lt;unsigned char&gt; vec(300)

Что означает запись vector<unsigned char> vec(300)

Что означает запись vector<unsigned char> vec(300)? Именно если в конструктор передается число

181