#include <iostream>
using namespace std;
template <typename T>
class Matrix {
protected:
T **a;
int size1, size2;
public:
Matrix(int n, int m) {
if (n <= 0 || m <= 0) {
cout << "Помилка: негативні або нульові розміри матриці!" << endl;
size1 = size2 = 1;
} else {
size1 = n;
size2 = m;
}
a = new T*[size1];
for (int i = 0; i < size1; i++) {
a[i] = new T[size2];
}
}
Matrix() : size1(1), size2(1) {
a = new T*[1];
a[0] = new T[1];
}
~Matrix() {
for (int i = 0; i < size1; i++) {
delete[] a[i];
}
delete[] a;
}
T* operator [](const int i) {
return a[i];
}
Matrix operator+(const Matrix& x) const {
if (size1 != x.size1 || size2 != x.size2) {
cout << "Розміри матриць не збігаються для додавання" << endl;
}
Matrix m3(size1, size2);
for (int i = 0; i < size1; i++) {
for (int j = 0; j < size2; j++) {
m3.a[i][j] = a[i][j] + x.a[i][j];
}
}
return m3;
}
Matrix operator-(const Matrix& x) const {
if (size1 != x.size1 || size2 != x.size2) {
cout << "Розміри матриць не збігаються для віднімання"<< endl;
}
Matrix m3(size1, size2);
for (int i = 0; i < size1; i++) {
for (int j = 0; j < size2; j++) {
m3.a[i][j] = a[i][j] - x.a[i][j];
}
}
return m3;
}
Matrix operator*(const Matrix& x) const {
if (size2 != x.size1) {
cout << "Неможливо множити матриці, розміри не збігаються"<< endl;
}
Matrix c(size1, x.size2);
for (int i = 0; i < size1; i++) {
for (int j = 0; j < x.size2; j++) {
c.a[i][j] = 0;
for (int k = 0; k < size2; k++) {
c.a[i][j] += a[i][k] * x.a[k][j];
}
}
}
return c;
}
friend ostream& operator<<(ostream& os, const Matrix& m) {
for (int i = 0; i < m.size1; i++) {
for (int j = 0; j < m.size2; j++) {
os << m.a[i][j] << " ";
}
os << endl;
}
return os;
}
friend istream& operator>>(istream& is, Matrix& m) {
for (int i = 0; i < m.size1; i++) {
for (int j = 0; j < m.size2; j++) {
is >> m.a[i][j];
}
}
return is;
}
int getSize1() const { return size1; }
int getSize2() const { return size2; }
};
template <typename T>
class SquareMatrix : public Matrix<T> {
public:
SquareMatrix(int n) : Matrix<T>(n, n) {}
T calculateTrace() const {
if (this->getSize1() != this->getSize2()) {
cout << "Матриця не є квадратною" << endl;
}
T trace = 0;
for (int i = 0; i < this->getSize1(); i++) {
trace += this->a[i][i];
}
return trace;
}
};
int main() {
Matrix<double> a(2, 2);
cin >> a;
Matrix<double> b(2, 2);
cin >> b;
Matrix<double> c = a + b;
cout << c;
Matrix<double> d = a - b;
cout << d;
Matrix<double> e = a * b;
cout << e;
SquareMatrix<double> sqMatrix(3);
cin >> sqMatrix;
cout << "Слід матриці: " << sqMatrix.calculateTrace() << endl;
return 0;
}