Реализовать на языке C++ параметризованный класс «Матрица»
вектор в декартовой системе N координат. Вектор в полярных координатах.
Сложение двух матриц и присвоение результата третьей переменной-матрице осуществляется одной строкой C=A+B
Помогите написать код программы на языке C++
Пример программы:
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
| //класс вещество, содержащий температуру и массу
class Substance {
double Mass;
double Temperature;
public:
//требуется перегрузка оператора сложения для класса Substance, так как данная операция совершается в классе Matrix. Без данной перегрузки компилятор выдаст ошибку
Substance operator + (Substance c) {
Substance res;
res.Mass = this->Mass + c.Mass;
res.Temperature = (this->Temperature*this->Mass +
c.Temperature*c.Mass) / (this->Mass + c.Mass);
return res;
}
//так как метод rand_val вызывается из класса Matrix, то данный метод должен обязательно присутствовать в классе Substance
static Substance rand_val() {
Substance res;
res.Mass = (rand() % 2000) / 100.0 + 5;
res.Temperature = (rand() % 2000) / 100.0 + 10;
return res;
}
//так как метод to_str вызывается из класса Matrix, то данный метод должен обязательно присутствовать в классе Substance
void to_str(char* bufer) {
sprintf(bufer, "M=%.2lf;T=%.2lf", Mass, Temperature);
}
};
//определение шаблонного класса Matrix, который позволяет хранить матрицу из объектов, которые имеются тип T
template <class T>
class Matrix{
//определение массива элементов типа T
T m[4][4];
public:
Matrix() {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
m[i][j] = T::rand_val();
}
//запись T::rand_val() в шаблонном классе предполагает наличие у класса T публичного статического метода rand_val. Программа не может быть собрана, если у класса T нет данного метода.
void print() {
char *bufer = new char[100];
printf("Matrix\n");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
m[i][j].to_str(bufer);
printf("%s\t", bufer);
}
printf("\n");
}
printf("\n");
delete bufer;
}
//запись m[i][j].to_str(bufer) для элемента (он имеет тип T) массива m предполагает наличие метода to_str у класса T. Программа не может быть собрана, если у класса T нет данного метода.
Matrix operator + (Matrix &b) {
Matrix<T> res;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
res.m[i][j] = this->m[i][j] + b.m[i][j];
return res;
}
//операция сложения между экземплярами класса T (это - this->m[i][j] и b.m[i][j]) предполагает наличие у класса T перегруженного оператора сложения. Программа не может быть собрана, если у класса T нет данного перегруженного оператора.
};
//класс Substance имеет статический метод rand_val(), метод to_str() и перегруженный оператор сложения, поэтому он может быть использован в качестве параметра шаблонного класса Matrix.
void main() {
Matrix<Substance> m1;
m1.print();
Matrix<Substance> m2;
m2.print();
Matrix<Substance> m3 = m1 + m2;
m3.print();
} |
|