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

Класс Треугольник на С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Dmitry_name
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 3
15.10.2012, 17:03     Класс Треугольник на С++ #1
Помогите пожалуйста написать три конструктора для класса "треугольник" : 1)класс задаётся либо длинами 3х сторон, 2)либо стороной и двумя прилежащими к ней углами, 3) либо двумя сторонами и углом между ними. Данные класса - длины 3х сторон и размеры 3х углов . Если нетрудно, объясните пожалуйста как с углами обращаться)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2012, 17:03     Класс Треугольник на С++
Посмотрите здесь:

C++ Создать класс треугольник
C++ Класс треугольник
класс «Треугольник» C++
C++ класс треугольник
C++ Класс треугольник
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
15.10.2012, 17:17     Класс Треугольник на С++ #2
нужно чтобы у переменной сторон и углов были разные типы, тогда можно будет перегрузить конструкторы.
Недостающие дынные заполняешь с помощью синуса, косинуса и тангенса.
skaa
Хочу в Исландию
 Аватар для skaa
1024 / 823 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
15.10.2012, 21:18     Класс Треугольник на С++ #3
Я бы сделал так:
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
#include    <math.h>
 
typedef struct {double s1;double s2;double s3;} trsss;
typedef struct {double a1;double s2;double a3;} trasa;
typedef struct {double s1;double a2;double s3;} trsas;
class   Triangle3
{
private:
  double    s1,s2,s3;
  double    a1,a2,a3;
  double    ad1,ad2,ad3;
public:
  Triangle3(trsss rsss)
  {
    s1=rsss.s1;
    s2=rsss.s2;
    s3=rsss.s3;
 
    a3=acos((s1*s1+s2*s2-s3*s3)/(2*s1*s2));
    a2=acos((s1*s1+s3*s3-s2*s2)/(2*s1*s3));
    a1=M_PI-a2-a3;
 
    ad1=a1/M_PI*180;
    ad2=a2/M_PI*180;
    ad3=a3/M_PI*180;
  }
  Triangle3(trasa rasa)
  {
    a1=rasa.a1;
    s2=rasa.s2;
    a3=rasa.a3;
    a2=M_PI-a1-a3;
 
    s1=s2*sin(a1)/sin(a2);
    s3=s2*sin(a3)/sin(a2);
 
    ad1=a1/M_PI*180;
    ad2=a2/M_PI*180;
    ad3=a3/M_PI*180;
  }
  Triangle3(trsas rsas)
  {
    s1=rsas.s1;
    a2=rsas.a2;
    s3=rsas.s3;
 
    s2=sqrt(s1*s1+s3*s3-2*s1*s3*cos(a2));
    a3=acos((s1*s1+s2*s2-s3*s3)/(2*s1*s2));
    a1=M_PI-a2-a3;
 
    ad1=a1/M_PI*180;
    ad2=a2/M_PI*180;
    ad3=a3/M_PI*180;
  }
};
void    main()
{
  trsss rsss={6.,4.,3.};
  trasa rasa={30./180.*M_PI,4.,50./180.*M_PI};
  trsas rsas={3.,90./180.*M_PI,4.};
 
  Triangle3 *t3sss=new Triangle3(rsss);
  Triangle3 *t3asa=new Triangle3(rasa);
  Triangle3 *t3sas=new Triangle3(rsas);
 
  delete t3sss;
  delete t3asa;
  delete t3sas;
}
, только надо бы добавить всякие проверки, например чтобы не были заданы стороны 1, 2 и 10 - такого треугольника не существует.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
15.10.2012, 21:43     Класс Треугольник на С++ #4
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
#include <iostream>
#include <stdexcept>
#include <cmath>
#include <sstream>
 
class Triangle
{
public:
    class Angle
    {
    public:
        explicit Angle(double const value_) : value(0.0)
        {
            if(value_ < pi && value_ > 0)
                value = value_;
            else
            {
                std::stringstream ss;
                ss << value_;
                throw(Angle_error("Angle ctor argument out of(0, pi): " + ss.str()));
            }
 
        }
        operator double() const
        {
            return value;
        }
        static double const pi;
    private:
        class Angle_error : public std::runtime_error
        {
        public:
            Angle_error(std::string const& message) : std::runtime_error(message){}
        };
        double value;
    };
 
    class Side
    {
    public:
        explicit Side(double const value_) : value(1)
        {
            if(value_ > 0)
                value = value_;
            else
            {
                std::stringstream ss;
                ss << value_;
                throw Side_error("Side ctor argument <= 0: " + ss.str());
            }
        }
        operator double() const
        {
            return value;
        }
    private:
        class Side_error : public std::runtime_error
        {
        public:
            Side_error(std::string const& message) : std::runtime_error(message){}
        };
        double value;
    };
    Triangle(Side const& a_, Side const& b_, Side const& c_) : a(a_), b(b_), c(c_),
        alpha(acos((b_ * b_ + c_ * c_ - a_ * a_) / (2 * b_ * c_))),
        beta(acos((a_ * a_ + c_ * c_ - b_ * b_) / (2 * a_ * c_))),
        gamma(acos((b_ * b_ + a_ * a_ - c_ * c_) / (2 * a_ * b_))){}
    Triangle(Side const& a_, Side const& b_, Angle const& gamma_) : a(a_), b(b_), gamma(gamma_),
        c(sqrt(a_ * a_ + b_ * b_ - 2 * a_ * b_ * cos(gamma_))),
        alpha(acos((b_ * b_ + pow((sqrt(a_ * a_ + b_ * b_ - 2 * a_ * b_ * cos(gamma_))), 2) - a_ * a_) / (2 * b_ * (sqrt(a_ * a_ + b_ * b_ - 2 * a_ * b_ * cos(gamma_)))))),
        beta(acos((a_ * a_ + c * c - b_ * b_) / (2 * a_ * c))){}
    Triangle(Side const& a_, Angle const& beta_, Angle const& gamma_) : a(a_), beta(beta_), gamma(gamma_),
        alpha(Angle::pi - beta_ - gamma_),
        c((a_ / sin(Angle::pi - beta_ - gamma_)) * sin(gamma_)),
        b((a_ / sin(Angle::pi - beta_ - gamma_)) * sin(beta_)){}
    friend std::ostream& operator<< (std::ostream& os, Triangle const& t)
    {
        return os << "sides: " << t.a << ' ' << t.b << ' ' << t.c
            << "\nangles: " << t.alpha << ' ' <<t.beta << ' ' << t.gamma;
    }
private:
    Side a, b, c;
    Angle alpha, beta, gamma;
};
 
double const Triangle::Angle::pi = 3.14159;
 
typedef Triangle::Side tside;
typedef Triangle::Angle tangle;
 
int main()
{
    try
    {
        Triangle tr(tside(6), tside(3), tside(4));
        std::cout << tr << std::endl;
        Triangle tr1(tside(8), tangle(1.5), tangle(1.1)); // угол в радианах
        std::cout << tr1 << std::endl;
    }
    catch(std::exception const& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}
Dmitry_name
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 3
15.10.2012, 22:54  [ТС]     Класс Треугольник на С++ #5
Спасибо огромное ребят)) Помогли очень))
Yandex
Объявления
15.10.2012, 22:54     Класс Треугольник на С++
Ответ Создать тему
Опции темы

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