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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
2Bee
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 6
#1

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

17.06.2014, 13:35. Просмотров 1199. Ответов 0
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане.
Перейдем сразу к сути задачи, без долгих прелюдий. Задача звучит следующим образом:

Рассматриваемые пирамиды имеют треугольник в основании, то есть являются тетраэдрами.
Требуется по заданным длинам рёбер пирамиды найти её объём.
Ограничения: длины рёбер - целые положительные числа, не превосходящие 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);
}
Заранее очень благодарен
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 13:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение объема треугольной пирамиды при известных ребрах (C++):

Создать функцию нахождения площади поверхности и объема правильной треугольной пирамиды - C++
Создать функцию нахождения площади поверхности и объема правильной треугольной пирамиды по заданным сторонам основания и высоте....

Вычислить площадь треугольной пирамиды. Функции - C++
Вычислить площадь треугольной пирамиды с помощью функции. С клавиатуры вводить &quot;а&quot; и &quot;b&quot;. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Определить площадь полной поверхности треугольной пирамиды - C++
треугольная пирамида задана координатами А(х1,y1,z1),А(х2,y2,z2),А(х3,y3,z3),А(х4,y4,z4) надо определить площадь полной поверхности...

Нахождение площади параллелограмма, треугольника и объема параллелепипеда, тетраэдра по координатам вершин - C++
Нахождение площади параллелограмма, треугольника и объема параллелепипеда, тетраэдра по координатам вершин. Задается пользователем:...

Описание объекта "Куб". Нахождение его площади и объема - C++
Всем доброго времени суток! К лабораторной работе нужно написать программу, которая сначала описывает объект &quot;Куб&quot;, затем рассчитывает его...

Вычисление объема цилиндра - ошибки при компиляции - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; float vcil(float h, float r) { return(M_PI*r*r*h); } using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 13:35
Привет! Вот еще темы с ответами:

Вычисление объема правильной треугольной пирамиды - Pascal ABC
Составьте программу вычисления объема правильной треугольной пирамиды, у которой сторона основания равна А, а плоский угол при вершине...

Составьте программу вычисления объема правильной треугольной пирамиды - Turbo Pascal
Составьте программу вычисления объема правильной треугольной пирамиды...,сторона основания которой равна А,а двугранный угол при боковом...

Вычисление объема правильной треугольной пирамиды по стороне и двугранному углу - Turbo Pascal
Подруга попросила помочь, надо сделать ей задачи. Суть самой задачи: Составьте программу вычисления объема правильной треугольной...

Сумма чисел на ребрах пирамиды - Алгебра
В каждой вершине треугольной пирамиды написано число. На каждом ребре написана сумма чисел, стоящих на его концах. Известно, что сумма...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru