e-olymp 944. Площадь пирамиды

Задача

Треугольная пирамида задана координатами своих вершин [latex] A(x_1; y_1; z_1), [/latex] [latex] B(x_2; y_2; z_2), [/latex] [latex] C(x_3; y_3; z_3), [/latex] [latex] S(x_4; y_4; z_4). [/latex] Определить площадь полной поверхности пирамиды.

Входные данные

В четырех строках заданы координаты [latex] x, y, z [/latex] вершин пирамиды. Все числа целые, не превышающие по модулю 100.

Выходные данные

Вывести полную поверхность пирамиды с точностью до десятых.

Тесты

Входные данные Выходные данные
1 -3 0 0 69,8
0 6 0
3 0 0
0 2 5
2 2 4 8 159,1
2 -6 9
5 -4 0
1 3 0
3 5 0 1 107,3
4 1 7
-9 0 4
6 2 8

Код программы

Решение задачи

Для того, чтобы найти площадь полной поверхности пирамиды, необходимо найти площади треугольников, которые являются гранями пирамиды.
Для нахождения площади треугольника можно воспользоваться формулой Герона: [latex] S = \sqrt{p \cdot(p-a) \cdot(p-b) \cdot(p-c)} [/latex],где [latex] p [/latex]-полупериметр треугольника, [latex] a,b,c [/latex] — стороны треугольника. Чтобы воспользоваться формулой Герона, необходимо предварительно найти длины сторон треугольников, используя формулу нахождения длин отрезков по координатам концов отрезка: [latex] |AB|=\sqrt{(x_b-x_a)^2+(y_b-y_a)^2+(z_b-z_a)^2} [/latex], где [latex] А,В [/latex] — концы отрезка, [latex] x_a, y_a,z_a [/latex] — координаты [latex] А [/latex], [latex] x_b, y_b,z_b [/latex] — координаты [latex] В [/latex].
Найденные площади всех треугольников, из которых состоит пирамида, складываем и получаем искомую площадь полной поверхности пирамиды.

Ссылки

e-olymp
ideone

8 thoughts on “e-olymp 944. Площадь пирамиды

  1. У Вас одна и та же довольно сложная формула используется неоднократно. Лучше оформить ее в виде функции. Также можно создать структуры точка, ребро, грань и работать с ними. Или хотя бы просто с точками.

    В исходный код попали тэги оформления, нужно их удалить.

  2. И лучше использовать нижние индексы — $A(x_1; y_1; z_1).$
    Не нужно комбинировать h2 и strong. Вполне достаточно h2.
    Зачем Вы считаете сначала периметр, а потом умножаете на 0.5, чтобы получить полупериметр? Можно ведь сразу умножить на 0.5 или разделить на 2?

    • Спасибо за комментарий. Все исправил.

  3. Стало лучше, но хорошо не стало. Вы по прежнему все подготовительные операции делаете в основном коде. Можно так написать, чтобы в функцию вычисления площади передавались три точки, а она там уже сама вызывала вычисление расстояний, периметров и т.п.? Логика такая — спрашивают про площадь, значит все остальное нечего показывать в главной программе. Только ввод и вывод суммы четырех площадей. Остальное в функции.
    И еще одно пока не обязательное замечание. Вы выполняете это начальное задание уже зная про ООП. Может сделать класс/структуру точки, и/или вектора, и/или треугольника?

    И еще:
    — Код по ссылке отличается от того, что в статье
    — Первую формулу лучше разбить на три по пробелам.
    — Нужно убрать кириллицу из адреса статьи.

  4. Я видимо не очень понятно написал
    — Первую формулу лучше разбить на три по пробелам. Во так: [latex] A(x_1; y_1; z_1),[/latex] [latex]B(x_2; y_2; z_2),[/latex] [latex]C(x_3; y_3; z_3), S(x_4; y_4; z_4).[/latex] Тогда будут работать автоматические переносы.
    — Нужно убрать кириллицу из адреса статьи. Я имел в виду, что это «http://cpp.mazurok.com/e-olymp-944-площадь-пирамиды/» не очень хорошо, а это «http://cpp.mazurok.com/e-olymp-944» — нормально.

Добавить комментарий