934. Высоты треугольника

 

Вычислите высоты треугольника со сторонами 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;

}