Форум программистов, компьютерный форум CyberForum.ru

Нахождение объема треугольной пирамиды при известных ребрах - C++

Восстановить пароль Регистрация
 
2Bee
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 6
17.06.2014, 13:35     Нахождение объема треугольной пирамиды при известных ребрах #1
Доброго времени суток, уважаемые форумчане.
Перейдем сразу к сути задачи, без долгих прелюдий. Задача звучит следующим образом:

Рассматриваемые пирамиды имеют треугольник в основании, то есть являются тетраэдрами.
Требуется по заданным длинам рёбер пирамиды найти её объём.
Ограничения: длины рёбер - целые положительные числа, не превосходящие 1000.
При вводе: В первой строке находятся 6 чисел через пробел - длины рёбер пирамиды ABCD.
Порядок рёбер: AB, AC, AD, BC, BD, CD.
При выводе: Вывести одно вещественное число с четырьмя знаками после запятой - объём
пирамиды.


Тесты, которые должна проходить программа в обязательном порядке:
1. Ввод: 1 1 1 1 1 1; Вывод (для проверки): 0.1179
2. Ввод: 1000 1000 1000 3 4 5; Вывод: 1999.9937
3. Ввод: 1000 3 4 1000 1000 5; Вывод: 1999.9937
4*. Ввод: 5 6 7 8 9 10; Вывод: 34.1824
5. Ввод: 7 5 7 5 7 5; Вывод: 20.8210
6*. Ввод: 123 145 167 134 156 169; Вывод: 368583.4040
7*. Ввод: 463 429 325 501 454 336; Вывод: 7571768.1067
8. Ввод: 300 599 898 300 599 300; Вывод: 51788.4394
9. Ввод: 300 898 599 599 300 300; Вывод: 51788.4394
Тесты, помеченные звездочкой и выделенные жирным, моя программа не проходит.

Почему не проходит? Причина проста: я, собственно, не вижу способа нахождения объема для этих трех пирамид и, соответственно, не могу составить алгоритм. С этой проблемой я и обращаюсь к вам, надеюсь, вы мне поможете. Тесты составлены моим преподавателем, он утверждает, что существует универсальный способ нахождения объема треугольной пирамиды через боковое ребро и одно из ребер основания, и установил последний срок сдачи - 30 июня. Но я ума не приложу, что это за формула такая, да и времени всего-навсего 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream> 
#include <cmath> 
using namespace std; 
double streug(double x,double y,double z); 
double apofema (double x1, double y1);
double rvpis (double x2, double y2, double z2);
double visota (double x3, double y3);
double ropis (double x4, double y4, double z4, double f1);
double mediana (double x5, double y5, double z5);
int main() 
{ int AB,AC,AD,BC,BD,CD,flagrebro=0;
 
 double s1,s2,r,m,h,v,sabc,sacd,sabd,sbcd,ABCH,ACDH,ABDH,BCDH,BADH,BCAH,CABH,CBDH,CADH,DABH,DCBH,DACH; 
 scanf(" %d %d %d %d %d %d", &AB,&AC,&AD,&BC,&BD,&CD);
 //cin>>AB>>AC>>AD>>BC>>BD>>CD; 
 //1-ый способ: программа находит 3 равных ребра, выходящих из одной вершины, если ребра равны, то высота пирамиды падает в центр описанной окружности
 if (((AB==AC)&&(AB==AD)&&(AB==BC)&&(AB==BD)&&(AB=CD))||(AB==AC)&&(AB==AD))
 {s1=streug(BC,BD,CD);
r=ropis(BC,BD,CD,s1);
h=visota(AB,r);
flagrebro=1;}
 else if ((flagrebro==0)&&(AB==BC)&&(AB==BD))
 {s1=streug(AC,CD,AD);
 r=ropis(AC,CD,AD,s1);
 h=visota(BC,r);
  flagrebro=1;}
else if ((flagrebro==0)&&(CD==BC)&&(CD==AC))
 {s1=streug(AD,BD,AB);
 r=ropis(AD,BD,AB,s1);
 h=visota(CD,r);
flagrebro=1;}
 else if ((flagrebro==0)&&(CD==AD)&&(CD==BD))
 {s1=streug(AB,AC,BC);
 r=ropis(AB,AC,BC,s1);
h=visota(CD,r);
 flagrebro=1;}
else if (flagrebro==0)
//считаем все площади и все возможные апофемы треугольников
{sabc=streug(AB,AC,BC); sacd=streug(AD,AC,CD); sabd=streug(AB,AD,BD); sbcd=streug(BC,CD,BD);
 ABCH=apofema(sabc,BC); ACDH=apofema(sacd,CD); ABDH=apofema(sabd,BD);
 BCDH=apofema(sbcd,CD); BADH=apofema(sabd,AD); BCAH=apofema(sabc,AC);
 CABH=apofema(sabc,AB); CBDH=apofema(sbcd,BD); CADH=apofema(sacd,AD);
 DABH=apofema(sabd,AB); DCBH=apofema(sbcd,BC); DACH=apofema(sacd,AC);}
 //2-й способ, если не сработал первый: находим 2 одинаковых ребра, выходящих из одной вершины, имеем равнобедренный треугольник
 // медиана==высоте => можно провести медиану треугольника в основании, получим треугольник состоящий из двух медиан и ребра, найдем его площадь, найдем высоту
if ((flagrebro==0)&&(AB==AC))
{s1=sbcd;
m=mediana(BD,CD,BC);
s2=streug(ABCH,m,AD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AB==BC))
{s1=sacd;
m=mediana(AD,CD,AC);
s2=streug(BCAH,m,BD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AC==BC))
{s1=sabd;
m=mediana(AD,BD,AB);
s2=streug(CABH,m,CD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AD==AC))
{s1=sbcd;
m=mediana(BC,BD,CD);
s2=streug(ACDH,m,AB);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AD==CD))
{s1=sabc;
m=mediana(AB,BC,AC);
s2=streug(DACH,m,BD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AC==CD))
{s1=sabd;
m=mediana(AB,BD,AD);
s2=streug(CADH,m,BC);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(BD==BC))
{s1=sacd;
m=mediana(AC,AD,CD);
s2=streug(BCDH,m,AB);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(BD==CD))
{s1=sabc;
m=mediana(AC,AB,BC);
s2=streug(DCBH,m,AD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(BC==CD))
{s1=sabd;
m=mediana(AD,AB,BD);
s2=streug(CBDH,m,AC);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AD==AB))
{s1=sbcd;
m=mediana(BC,CD,BD);
s2=streug(ABDH,m,AC);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AD==BD))
{s1=sabc;
m=mediana(BC,AC,AB);
s2=streug(DABH,m,CD);
h=apofema(s2,m);}
else if ((flagrebro==0)&&(AB==BD))
{s1=sacd;
m=mediana(CD,AC,AD);
s2=streug(BADH,m,BC);
h=apofema(s2,m);}
 v=(h*s1)/3;
 cout<<endl;
  printf("%.4lf", v);
return 0;} 
 
double streug(double x,double y,double z) 
//ф-я для вычисления площади 3-ника по его сторонам 
 { double p,s; 
 p=(x+y+z)/2; s=sqrt(p*(p-x)*(p-y)*(p-z)); 
 return (s);}
double apofema (double x1, double y1)
//функция для вычисления высоты треугольника или так называемой апофемы через площадь треугольника
{double hx;
hx=((x1*2)/y1);
return (hx);}
double rvpis (double x2, double y2, double z2)
//функция для нахождения вписанной в треугольник окружности
{double p,r1;
p=(x2+y2+z2)/2; r1=sqrt(((p-x2)*(p-y2)*(p*z2))/p);
return (r1);}
double visota (double x3, double y3)
//нахождение высоты через теорему Пифагора
{double hh;
hh=sqrt((x3*x3)-(y3*y3));
return (hh);}
double ropis (double x4, double y4, double z4, double f1)
//функция для нахождения радиуса описанной окружности треугольника
{double r2;
r2=(x4*y4*z4)/(4*f1);
return (r2);}
double mediana (double x5, double y5, double z5)
//функция для нахождения медианы
{double m;
m=sqrt(2*(x5*x5)+2*(y5*y5)-(z5*z5))/2;
return (m);
}
Заранее очень благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 13:35     Нахождение объема треугольной пирамиды при известных ребрах
Посмотрите здесь:

C++ Вычисление объема цилиндра - ошибки при компиляции
C++ Описание объекта "Куб". Нахождение его площади и объема
написать программку, которая будет рассчитывать какое количество рулонов потребуется и сколько метров обоев выкинется при известных данных C++
Создать массив, в котором присутствуют только совпадающие элементы двух известных одномерных массивов C++
Создать одномерный массив, в котором находятся повторяющиеся элементы двух известных массивов C++
C++ Создать функцию нахождения площади поверхности и объема правильной треугольной пирамиды
C++ Определить площадь полной поверхности треугольной пирамиды
Нахождение площади параллелограмма, треугольника и объема параллелепипеда, тетраэдра по координатам вершин C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru