Задача
Треугольная пирамида задана координатами своих вершин [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 |
Код программы
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 |
#include <iostream> // std::cout, std::fixed #include <iomanip> // std::setprecision //данную библиотеку подключаем для того, чтобы установить количество знаков после запятой #include <cmath> //данную библиотеку подключаем для того, чтобы была возможность извлечь корень и возвести в квадрат using namespace std; //функция рассчитывает расстояние между двумя точками с заданными координатами double distance (double x1, double y1, double z1, double x2, double y2, double z2) { return sqrt( pow(x1-x2, 2) + pow(y1-y2, 2) + pow(z1-z2, 2)); } //функция вычисляет площадь треугольника по формуле Герона double Geron (double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3) { double a,b,c,P;//стороны треугольника и полупериметр a = distance(x1,y1,z1, x2,y2,z2); b = distance(x2,y2,z2, x3,y3,z3); c = distance(x1,y1,z1, x3,y3,z3); P = (a+b+c)/2; return sqrt(P*(P-a)*(P-b)*(P-c)); } //функция вычисляет площадь полной поверхности пирамиды double square (double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double x4, double y4, double z4) { double S1,S2,S3,S4,S;//площади треугольников и площадь полной поверхности пирамиды S1 = Geron(x1,y1,z1,x2,y2,z2,x3,y3,z3); S2 = Geron(x1,y1,z1,x2,y2,z2,x4,y4,z4); S3 = Geron(x1,y1,z1,x3,y3,z3,x4,y4,z4); S4 = Geron(x2,y2,z2,x3,y3,z3,x4,y4,z4); S = S1+S2+S3+S4; return S; } int main() { double x1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4;//координаты вершин пирамиды cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> x3 >> y3 >> z3 >> x4 >> y4 >> z4; double S = square (x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4); cout << fixed << setprecision(1) << S << endl; return 0; } |
Решение задачи
Для того, чтобы найти площадь полной поверхности пирамиды, необходимо найти площади треугольников, которые являются гранями пирамиды.
Для нахождения площади треугольника можно воспользоваться формулой Герона: [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].
Найденные площади всех треугольников, из которых состоит пирамида, складываем и получаем искомую площадь полной поверхности пирамиды.
У Вас одна и та же довольно сложная формула используется неоднократно. Лучше оформить ее в виде функции. Также можно создать структуры точка, ребро, грань и работать с ними. Или хотя бы просто с точками.
В исходный код попали тэги оформления, нужно их удалить.
И лучше использовать нижние индексы — $A(x_1; y_1; z_1).$
Не нужно комбинировать h2 и strong. Вполне достаточно h2.
Зачем Вы считаете сначала периметр, а потом умножаете на 0.5, чтобы получить полупериметр? Можно ведь сразу умножить на 0.5 или разделить на 2?
Спасибо за комментарий. Все исправил.
Стало лучше, но хорошо не стало. Вы по прежнему все подготовительные операции делаете в основном коде. Можно так написать, чтобы в функцию вычисления площади передавались три точки, а она там уже сама вызывала вычисление расстояний, периметров и т.п.? Логика такая — спрашивают про площадь, значит все остальное нечего показывать в главной программе. Только ввод и вывод суммы четырех площадей. Остальное в функции.
И еще одно пока не обязательное замечание. Вы выполняете это начальное задание уже зная про ООП. Может сделать класс/структуру точки, и/или вектора, и/или треугольника?
И еще:
— Код по ссылке отличается от того, что в статье
— Первую формулу лучше разбить на три по пробелам.
— Нужно убрать кириллицу из адреса статьи.
Спасибо. Все исправил.
Я видимо не очень понятно написал
— Первую формулу лучше разбить на три по пробелам. Во так: [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» — нормально.
Спасибо. Исправил.
Отлично. Молодец