#include <iostream>
using namespace std;
class Matrix
{
private:
double** storage;
public:
const int n;
const int m;
Matrix(int _n, int _m) :
n(_n), m(_m)
{
storage = new double* [n];
for (int i = 0; i < n; i++)
{
storage[i] = new double[m];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
storage[i][j] = 0;
}
}
}
double get_number(int i, int j)
{
return storage[i][j];
}
void set_number(int i, int j, double num)
{
storage[i][j] = num;
}
static bool Sum(Matrix a, Matrix b, Matrix* c)
{
if ((a.n != c->n|| b.n != c->n) || (a.m != c->m || b.m != c->m))
{
return false;
}
for (int i = 0; i < a.n; i++)
{
for (int j = 0; j < a.m; j++)
{
c->storage[i][j] = a.storage[i][j] + b.storage[i][j];
}
}
return true;
}
};
class Matrix_3x3 : public Matrix
{
public:
Matrix_3x3() : Matrix(3, 3){}
double determinant()
{
double d1 = get_number(0, 0) * get_number(1, 1) * get_number(2, 2);
double d2 = get_number(0, 2) * get_number(1, 1) * get_number(2, 0);
return d1 + get_number(0, 1) * get_number(1, 2) * get_number(2, 0) + get_number(0, 2) * get_number(1, 0) * get_number(2, 1) - (d2 + get_number(0, 0) * get_number(1, 2) * get_number(2, 1) + get_number(0, 1) * get_number(1, 0) * get_number(2, 1));
}
};
int main()
{
Matrix a(4, 4);
Matrix b(4, 4);
Matrix c(4, 4);
for (int i = 0; i < a.n; i++)
{
for (int j = 0; j < a.m; j++)
{
a.set_number(i, j, 1);
}
}
for (int i = 0; i < b.n; i++)
{
for (int j = 0; j < b.m; j++)
{
b.set_number(i, j, 1);
}
}
Matrix::Sum(a, b, &c);
for (int i = 0; i < c.n; i++)
{
for (int j = 0; j < c.m; j++)
{
cout << c.get_number(i, j) << " ";
}
cout << endl;
}
cout << endl;
Matrix_3x3 x;
for (int i = 0; i < x.n; i++)
{
for (int j = 0; j < x.m; j++)
{
x.set_number(i, j, 1);
}
}
for (int i = 0; i < x.n; i++)
{
for (int j = 0; j < x.m; j++)
{
cout << x.get_number(i, j) << " ";
}
cout << endl;
}
cout << endl << x.determinant();
return 0;
}