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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
zewer
1133 / 824 / 83
Регистрация: 07.01.2011
Сообщений: 6,019
#1

Создать объявление класса и разработать программу-драйвер, которая продемонстрирует работу класса. - C++

23.03.2011, 01:03. Просмотров 1410. Ответов 13
Метки нет (Все метки)

Класс Triangle (треугольник). Класс хранит Декартовы координаты трех углов треугольника. Конструктор принимает три группы координат. Должны быть предусмотренные функции-элементы, которые вычисляют периметр и площадь, а также функция, которая проверяет или треугольник является прямоугольным.
написать нужно на С++
спасибо наперед
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2011, 01:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать объявление класса и разработать программу-драйвер, которая продемонстрирует работу класса. (C++):

Разработать программу-драйвер, которая продемонстрирует работу производного класса - C++
Создать объявление классов согласно варианту. Разработать программу-драйвер, которая продемонстрирует работу производного класса. ...

Объявление объекта класса fstream в качестве статической компоненты другого класса - C++
Доброго времени суток. Есть задание, в котором говорится "...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...

Объявление объекта одного класса в описании другого класса - C++
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой объект уже существует. И почему при...

Объявление дружественного класса внутри класса - C++
class A{ friend class B{ B(A &a); } } Подскажите пожалуйста, такое возможно или нет, я хотел чтобы...

Разработать шаблон класса реализующего работу с матрицами переменной размерности. - C++
Разработать шаблон класса реализующего работу с матрицами переменной размерности. Тип эле- мента задается как параметр шаблона. Написать...

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
LaГushan
124 / 124 / 14
Регистрация: 12.03.2011
Сообщений: 227
23.03.2011, 11:16 #2
Ну вот примерный класс
C++
1
2
3
4
5
6
7
8
9
10
class Triangle
{
public:
    double x1,y1,x2,y2,x3,y3;
    Triangle(double x1,double y1,double x2,double y2,double x3,double y3):
    x1(x1),y1(y1),x2(x2),y2(y2),x3(x3),y3(y3){}
    double per(); //Периметр
    bool Ifpryam(); //Является ли прямоугольным
    double S(); //Площадь
};
А вот тут как раз формулы
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.03.2011, 13:13 #3
А что, прям обязательно драйвер? В кернел-мод???
IrineK
Заблокирован
24.03.2011, 00:35 #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
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
142
143
144
145
#include <iostream>
#include <math.h>
using namespace std;
 
class Vector
{
private: 
    double _xA,_yA,_xB,_yB;
    double _dX,_dY;
    
public:
    Vector(double xA, double yA, double xB, double yB):
      _xA(xA),_yA(yA),_xB(xB),_yB(yB),_dX(xB-xA),_dY(yB-yA){} 
    Vector():_xA(0),_yA(0),_xB(0),_yB(0),_dX(0),_dY(0) {}
    ~Vector(){}
 
    void SetVector(double xA, double yA, double xB, double yB)
    {   _xA=xA;_yA=yA;_xB=xB;_yB=yB;
        _dX = xB-xA; _dY = yB-yA;
    }
 
    double GetVectorDX(){return _dX;}
    double GetVectorDY(){return _dY;}
        
    Vector &operator =(Vector& MN)
    {   if(&MN!=this)
        {   _xA=MN._xA;
            _yA=MN._yA;
            _xB=MN._xB;
            _yB=MN._yB;
            _dX=MN._dX;
            _dY=MN._dY;
        }
        return *this;
    }
 
    double Length()
    {   return sqrt(_dX*_dX + _dY*_dY);
    }
 
    friend double ScalarProduct(Vector &a, Vector &b)
    {   return a._dX*b._dX+a._dY*b._dY;
    }
 
    friend double Angle(Vector &a, Vector &b)
    {   return acos(ScalarProduct(a,b)/(a.Length()*b.Length()));
    }
 
};
 
 
class Triangle
{
private:
    Vector _AB,_AC,_BC;
 
public:
        Triangle(double xA, double yA, double xB, double yB, double xC, double yC):
            _AB(xA,yA,xB,yB), _AC(xA,yA,xC,yC), _BC(xB,yB,xC,yC){}
        Triangle():_AB(0,0,0,0),_AC(0,0,0,0), _BC(0,0,0,0) {}
        ~Triangle(){}
 
    void SetTriangle(double xA, double yA, double xB, double yB, double xC, double yC)
    {   Vector AB(xA,yA,xB,yB);
        Vector AC(xA,yA,xC,yC);
        Vector BC(xB,yB,xC,yC);
        _AB = AB;
        _AC = AC;
        _BC = BC;
        bool find = this->FoundErr();
    }
 
    bool FoundErr()
    {   double a =_BC.Length(),b = _AC.Length(),c = _AB.Length();
        if(a*b*c==0)
        {   cout<<"ERROR: zero side\n";
            return true;
        }
        else if(a+b<=c || a+c<=b || b+c<=a)
        {   cout<<"ERROR: one side too long\n";
            return true;
        }
        return false;
    }
 
    double Square()
    {   bool find = this->FoundErr();
        if(!find)
            return 0.5*fabs(_AB.GetVectorDX()*_AC.GetVectorDY()-_AC.GetVectorDX()*_AB.GetVectorDY());
        return 0;
    }
 
    bool isRectangular()
    {   bool find = this->FoundErr();
        if(!find)
            if(ScalarProduct(_AB,_AC)==0 || ScalarProduct(_AB,_BC)==0 
                || ScalarProduct(_BC,_AC)==0) return true;
        return false;
    }
 
    bool isEquilateral()
    {   bool find = this->FoundErr();
        if(!find)
        {
            if(_AB.Length()==_AC.Length() && _AC.Length()==_BC.Length()) return true;
        }
        return false;
    }
 
    bool isIsosceles()
    {   bool find = this->FoundErr();
        if(!find)
            if(_BC.Length()==_AC.Length() || _BC.Length()==_AB.Length() 
                || _AC.Length()==_AB.Length()) return true;
        return false;
    }
};
 
int main()
{   Vector L0;
    cout<<"Length of 0 vector: "<<L0.Length()<<endl;
    L0.SetVector(1,1,5,5);
    cout<<"Length of set vector: "<<L0.Length()<<endl;
 
    Vector L1(1,1,-5,-5);
    cout<<"Scalar Product: "<<ScalarProduct(L0,L1)<<endl;
    cout<<"Angle (Pi): "<< Angle(L0,L1)<<endl;
 
    Triangle T0;
    cout<<"Square of 0 triangle: "<<T0.Square()<<endl;
    T0.SetTriangle(5,0,0,5,0,0);
    cout<<"Square of set triangle T0: "<<T0.Square()<<endl;
    cout<<"Is rectangular: "<<T0.isRectangular()<<endl;
    cout<<"Is isosceles: "<<T0.isIsosceles()<<endl;
    cout<<"Is Equilateral: "<<T0.isEquilateral()<<endl;
 
    Triangle T1(1,1,5,5,9,1);
    cout<<"\nSquare of another triangle T1: "<<T1.Square()<<endl;
    cout<<"Is rectangular: "<<T1.isRectangular()<<endl;
    cout<<"Is isosceles: "<<T1.isIsosceles()<<endl;
    cout<<"Is Equilateral: "<<T1.isEquilateral()<<endl;
    
    cin.get();
    return 0;
}
Осталось только периметр дописать.
zewer
1133 / 824 / 83
Регистрация: 07.01.2011
Сообщений: 6,019
24.03.2011, 00:39  [ТС] #5
ууууууууу
спасибо большое, ток дело в том, что ми ету тему ище не учили, и вобше твоя моя не понимать что ето такое, но все равно спс)
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
24.03.2011, 00:40 #6
IrineK, какой ужас! Координаты вершин треугольника дублируются (в прилежащих ребрах).
Класс, который по сути является отрезком, почему то назван вектором.
IrineK
Заблокирован
24.03.2011, 00:46 #7
Координаты вершин треугольника дублируются (в прилежащих ребрах).
private: Vector _AB,_AC,_BC;
Дает возможность легко обсчитывать треугольник.

почему то назван вектором
double _dX,_dY;
Это - координаты вектора, то бишь направленного отрезка.

какой ужас!
Нервишки-то пошаливают. Отдыхать пора.
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
24.03.2011, 01:08 #8
Цитата Сообщение от IrineK Посмотреть сообщение
Дает возможность легко обсчитывать треугольник.
В чем удобство? Такой способ хранения позволяет создать треугольник, у которого одна сторона длинне суммы других. А для отлова таких ситуаций, был написан костыль: FoundErr()
А что ты будешь делать, если ребра вообще не состыкованы друг с другом?
IrineK
Заблокирован
24.03.2011, 01:13 #9
Вообще-то FoundErr() был написан для отлова ситуации: все три точки - на одной прямой.
Но, поскольку сравниваются double, предпочтение было отдано знаку <=

ВЫ - автор двух утверждений. Первое:
координаты вершин треугольника дублируются
Второе:
создать треугольник, у которого одна сторона длинне суммы других.
Явное противоречие.
slice
35 / 78 / 4
Регистрация: 04.11.2010
Сообщений: 249
24.03.2011, 01:15 #10
Цитата Сообщение от IrineK Посмотреть сообщение
Явное противоречие.
В чем оно заключается?
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.03.2011, 02:13 #11
slice, в том, что если координаты дублируются, т.е. отрезки, концами которых являются точки с данными координатами, стыкуются и, соответственно, образуют треугольник, то эти отрезки будут удовлетворять неравенству треугольника. Уж извините, что так вышло, закон природы, ничего не попишешь.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.03.2011, 06:03 #12
Цитата Сообщение от IrineK Посмотреть сообщение
автор двух утверждений. Первое:
координаты вершин треугольника дублируются
Имеется в виду, что координаты задаются для каждого ребра, а следовало сделать индексы в массив координат. Да и треугольник лучше задавать не тремя векторами, а тремя индексами точек. Это и безопаснее и эффективнее и ваапще.
IrineK
Заблокирован
24.03.2011, 11:11 #13
Благодарю за плодотворную дискуссию. В результате строка 80 была заменена на:
C++
1
cout<<"ERROR: three points in one line\n";
что более соответствует действительности.
В класс Vector добавлены операции сложения/вычитания, поворота, что дает возможность эффективно манипулировать объектами (добавлены графические модули)

Создан класс Quadrangle. С помощью векторов легко проводится классификация, что упрощает анализ.

В целом, приложение создается для решения физических и геометрических задач, так что Vector является его естественной основой. Как метко подмечено silent_1991:
Уж извините, что так вышло, закон природы, ничего не попишешь.
zewer
1133 / 824 / 83
Регистрация: 07.01.2011
Сообщений: 6,019
05.04.2011, 22:45  [ТС] #14
нужна помошь, не могу решит ошибку, ссилка на прогу:
http://upload.com.ua/get/902494983/laboratory_4.rar
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2011, 22:45
Привет! Вот еще темы с ответами:

Создать класс Money и разработать указанные элементы класса - C++
Нужно написать программу за таким типом.

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов - C++
Возникли сложности при решении задачи. Буду признателен тем, кто поможет. Задание: Составить описание класса. Объявить объекты класса...

Разработать программу библиотечного абонемента с использованием класса queue - C++
Задание. Разработать модель работы библиотечного абонемента. Создать необходимые классы. Информационная запись о книге в библиотеке...

Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса - C++
В курсаче по ООП сказано создать для класса виртуальный метод,возвращающий уникальный идентификатор класса. Вопрос в том, что это такое?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.04.2011, 22:45
Ответ Создать тему
Опции темы

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