Вычислите высоты
треугольника со сторонами a, b, c.
Вход. В одной строке заданы три натуральных числа – стороны
треугольника a, b, c. Все значения не
превышают 100.
Выход. Выведите длины
высот, опущенные на соответствующие стороны ha,
hb, hc. Результат следует выводить 2 десятичными знаками.
Пример
входа |
Пример
выхода |
3 4 5 |
4.00 3.00
2.40 |
геометрия
Анализ алгоритма
По формуле
Герона найдем площадь треугольника s.
Известно, что площадь треугольника равна s = ½ * a * ha, где ha
– высота, опущенная на сторону a.
Тогда длины
высот ha, hb, hc будут соответственно равны 2s / a, 2s / b, 2s / c.
Реализация алгоритма
Читаем длины
сторон треугольника.
scanf("%lf %lf %lf",&a,&b,&c);
Вычисляем периметр и площадь треугольника.
p = (a + b + c)
/ 2;
s = sqrt(p * (p
- a) * (p - b) * (p - c));
Находим длины высот треугольника.
ha = 2 * s / a;
hb = 2 * s / b; hc = 2 * s / c;
Выводим ответ задачи.
printf("%.2lf %.2lf %.2lf\n",ha,hb,hc);
Реализация с использованием класса
#include <stdio.h>
#include <math.h>
class Triangle
{
private:
double a, b,
c;
public:
Triangle(double
a = 0, double b = 0, double
c = 0) :
a(a), b(b), c(c) {}
void
ReadSides(void)
{
scanf("%lf
%lf %lf",&a,&b,&c);
}
double
Perimeter(void)
{
return a +
b + c;
}
double Area(void)
{
double p =
Perimeter() / 2;
return
sqrt(p * (p - a) * (p - b) * (p - c));
}
double*
GetHeights(void)
{
double s =
Area();
double
*ptr = new
double[3];
ptr[0] = 2 * s / a;
ptr[1] = 2 * s / b;
ptr[2] = 2 * s / c;
return ptr;
}
};
int main(void)
{
Triangle tri;
tri.ReadSides();
double *h =
tri.GetHeights();
printf("%.2lf
%.2lf %.2lf\n",h[0],h[1],h[2]);
delete[] h;
return 0;
}
Реализация с использованием наследования
#include <stdio.h>
#include <math.h>
class Shape
{
protected:
double *ptr;
int size;
public:
Shape(int
size = 0) : size(size)
{
ptr = new double[size];
}
~Shape()
{
delete[]
ptr;
}
};
class Triangle : public
Shape
{
public:
Triangle() : Shape(3) {};
void
ReadSides(void)
{
for(int i = 0; i < size; i++)
scanf("%lf",ptr+i);
}
double
Perimeter(void)
{
double p =
0;
for(int i = 0; i < size; i++)
p += ptr[i];
return p;
}
double Area(void)
{
double p =
Perimeter() / 2;
return
sqrt(p * (p - ptr[0]) * (p - ptr[1]) * (p - ptr[2]));
}
double*
GetHeights(void)
{
double s =
Area();
double
*ptr = new
double[size];
for(int i = 0; i < size; i++)
ptr[i] = 2 * s / this->ptr[i];
return ptr;
}
};
int main(void)
{
Triangle tri;
tri.ReadSides();
double *h =
tri.GetHeights();
printf("%.2lf
%.2lf %.2lf\n",h[0],h[1],h[2]);
delete[] h;
return 0;
}