28.03.2016, 14:24. Показов 725. Ответов 0
Все добрый день.
Такое вот задание :
Реализовать все указанные интерфейсы для классов :
а)Отрезок
б)Трапеция
Функционал системы:
// - Динамическое добавление фигур пользователем.
// - Отобразить все фигуры.
// - Общая площадь всех фигур.
// - Общий периметр всех фигур.
// - Центр масс всей системы.
// - Память, занимаемая всеми экземплярами классов.
// - Сравнение фигур между собой по массе.
Я сделал,вроде бы. Прога компилится, вроде бы всё выводит.
Просто хотелось бы спросить, всё ли правильно сделано?
Я не особо в этом опытен, поэтому писал,опираясь на чутьё.
main.cpp
| 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
| #include <iostream>
#include "Line.h"
#include <conio.h>
#include <vector>
#include "Trapecia.h"
using namespace std;
int main()
{
setlocale(0, "Russian");
vector <LineSegent> arr(1);
cout << " Введите данные первого отрезка " << endl;
arr.at(0).initFromDialog();
cout << " Создать еще один отрезок ? Y / N " << endl;
char c;
cin >> c;
if (c == 'Y' || c == 'y')
{
LineSegent tmp;
tmp.initFromDialog();
arr.push_back(tmp);
}
double m = 0, p = 0;
for (unsigned int i = 0; i < arr.size(); i++)
{
m += arr.at(i).mass();
p += arr.at(i).perimeter();
}
cout << " Масса всех объектов : " << m << endl;
cout << " Периметр всех объектов : " << p << endl;
double a = (arr.at(0).position().x* arr.at(0).mass() + arr.at(1).position().x * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
double b = (arr.at(0).position().y * arr.at(0).mass() + arr.at(1).position().y * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
cout << "Центр масс всей системы равен : x = " << a << " | y = " << b << endl;
cout << " Площадь всех объектов равна : " << arr.at(0).square() + arr.at(1).square() << endl;
cout << " Объекты занимают " << arr.at(0).size() << endl;
cout << " \n ******Трапеция ****** " << endl;
vector <Hexagon> ar(1);
cout << " Введите данные первого отрезка " << endl;
ar.at(0).initFromDialog();
cout << " Создать еще один отрезок ? Y / N " << endl;
cin >> c;
if (c == 'Y' || c == 'y')
{
Hexagon tmp;
tmp.initFromDialog();
ar.push_back(tmp);
m = 0; p = 0;
for (unsigned int i = 0; i < ar.size(); i++)
{
m += ar.at(i).mass();
p += ar.at(i).perimeter();
}
cout << " Масса всех объектов : " << m << endl;
cout << " Периметр всех объектов : " << p << endl;
double a = (ar.at(0).position().x* ar.at(0).mass() + ar.at(1).position().x * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
double b = (ar.at(0).position().y * ar.at(0).mass() + ar.at(1).position().y * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
cout << "Центр масс всей системы равен : x = " << a << " | y = " << b << endl;
cout << " Площадь всех объектов равна : " << ar.at(0).square() + ar.at(1).square() << endl;
cout << " Объекты занимают " << ar.at(0).size() << endl;
}
cin >> a;
_getch();
return 0;
} |
|
Line.cpp
| 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
| #include "Line.h"
int LineSegent::countSegments = 0;
double LineSegent::mass()
{
return mass_A + mass_B;
}
Vector2D LineSegent::position()
{
Vector2D res;
res.x = (dotA.x * mass_A + dotB.x * mass_B) / (mass_A + mass_B);
res.y = (dotA.y * mass_A + dotB.y * mass_B) / (mass_A + mass_B);
return res;
}
double LineSegent::square()
{
return 0.0;
}
double LineSegent::perimeter()
{
return 0.0;
}
void LineSegent::initFromDialog()
{
cout << " \n\n\n";
cout << " Нужно ввести имя объекта " << endl;
char str[20];
cin >> str;
name = str;
cout << " Нужно ввести координату x точки A : " << endl;
cin >> dotA.x;
cout << " Нужно ввести координату y : точки А: " << endl;
cin >> dotA.y;
cout << " Нужно ввести координату x точки В : " << endl;
cin >> dotB.x;
cout << " Нужно ввести координату y : точки В: " << endl;
cin >> dotB.y;
cout << " Нужно ввести массу точки A : " << endl;
cin >> mass_A;
cout << " Нужно ввести массу точки В : " << endl;
cin >> mass_B;
countSegments++;
}
const char * LineSegent::classname()
{
return name;
}
unsigned int LineSegent::size()
{
return sizeof(LineSegent) * countSegments;
}
void LineSegent::draw()
{
cout << " Имя Отрзка : " << classname() << endl;
cout << " Масса отрезка равна : " << mass() << endl;
cout << " Периметр отрезка равен : " << perimeter() << endl;
cout << " Координаты цетра масс : x = " << position().x << " y = " << position().y << endl;
cout << " Площадь отрезка равна : " << square() << endl;
cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
}
bool LineSegent::operator==(const PhysObject & ob) const
{
return true; // тут в общем такая тема ) это нельзя сделать , ну у меня не получилось , ибо аргумет - объект чисто абстрактного класса который сделать нельзя )
}
bool LineSegent::operator<(const PhysObject & ob) const
{
return false;// таже история )
} |
|
Line.h
| 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
| #pragma once
#include <iostream>
#include <vector>
#include "intf.h"
using namespace std;
class Hexagon;
class LineSegent : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
Vector2D dotA;
Vector2D dotB;
double mass_A;
double mass_B;
char * name;
static int countSegments;
public:
friend Hexagon;
double mass();
Vector2D position();
double square();
double perimeter();
void initFromDialog();
const char* classname();
unsigned int size();
void draw();
bool operator== (const PhysObject& ob) const;
bool operator< (const PhysObject& ob) const;
}; |
|
Trapecia.cpp
| 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
| #include "Trapecia.h"
int Hexagon::countHexagons = 0;
double Hexagon::mass()
{
return A.mass() + B.mass() + C.mass() + D.mass();
}
double length(double Ax, double Ay, double Bx, double By)
{
return sqrt(Ax * Bx + Ay * By);
}
Vector2D Hexagon::position()
{
Vector2D a;
a.x = (A.position().x - C.position().x) / 2;
a.y = (A.position().y - C.position().y) / 2;
return a;
}
double Hexagon::square()
{
return pow(length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y), 2);
}
double Hexagon::perimeter()
{
return length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y)
+ length(B.dotA.x, B.dotA.y, B.dotB.x, B.dotB.y)
+ length(C.dotA.x, C.dotA.y, C.dotB.x, C.dotB.y)
+ length(D.dotA.x, D.dotA.y, D.dotB.x, D.dotB.y);
}
void Hexagon::initFromDialog()
{
cout << " \n\n\n";
cout << " Нужно ввести имя объекта " << endl;
char str[20];
cin >> str;
Name = str;
cout << " сторона A : " << endl;
A.initFromDialog();
cout << " сторона B : " << endl;
B.initFromDialog();
cout << " сторона C : " << endl;
C.initFromDialog();
cout << " сторона D : " << endl;
D.initFromDialog();
}
const char * Hexagon::classname()
{
return Name;
}
unsigned int Hexagon::size()
{
return sizeof(Hexagon) * countHexagons;
}
void Hexagon::draw()
{
cout << " Имя Отрзка : " << classname() << endl;
cout << " Масса отрезка равна : " << mass() << endl;
cout << " Периметр отрезка равен : " << perimeter() << endl;
cout << " Координаты цетра масс : x = " << position().x << " y = " << position().y << endl;
cout << " Площадь отрезка равна : " << square() << endl;
cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
}
bool Hexagon::operator==(const PhysObject & ob) const
{
return false;
}
bool Hexagon::operator<(const PhysObject & ob) const
{
return false;
} |
|
Trapecia.h
| 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
| #pragma once
#pragma once
#include "intf.h"
#include "Line.h"
#include <math.h>
class Hexagon : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
LineSegent A;
LineSegent B;
LineSegent C;
LineSegent D;
static int countHexagons;
char * Name;
public:
double mass();
Vector2D position();
double square();
double perimeter();
void initFromDialog();
const char* classname();
unsigned int size();
void draw();
bool operator== (const PhysObject& ob) const;
bool operator< (const PhysObject& ob) const;
}; |
|
intf.h (interface.h)
| 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
| #pragma once
class GeoFig {
public:
// Площадь.
virtual double square() = 0;
// Периметр.
virtual double perimeter() = 0;
};
// Вектор
class Vector2D {
public:
double x, y;
};
// Интерфейс "Физический объект".
class PhysObject {
public:
// Масса, кг.
virtual double mass() = 0;
// Координаты центра масс, м.
virtual Vector2D position() = 0;
// Сравнение по массе.
virtual bool operator== (const PhysObject& ob) const = 0;
// Сравнение по массе.
virtual bool operator< (const PhysObject& ob) const = 0;
};
// Интерфейс "Отображаемый"
class Printable {
public:
// Отобразить на экране
// (выводить в текстовом виде параметры фигуры).
virtual void draw() = 0;
};
// Интерфейс для классов, которые можно задать через диалог с пользователем.
class DialogInitiable {
// Задать параметры объекта с помощью диалога с пользователем.
virtual void initFromDialog() = 0;
};
// Интерфейс "Класс"
class BaseCObject {
public:
// Имя класса (типа данных).
virtual const char* classname() = 0;
// Размер занимаемой памяти.
virtual unsigned int size() = 0;
}; |
|
Добавлено через 28 минут
Почему-то выводит площадь и периметр фигур 0.