#include <iostream>
#include <math.h>
using namespace std;
template <typename T>
class Matrix {
T *data;
int N;
public:
Matrix (char n) {
double tmp;
cout<<"Input size of martix "<<n<<endl;
cin>>N;
tmp=sqrt(N);
if ((int)(tmp*10)%10!=0) throw 2;
data=new T[N];
if (N>1) N=sqrt(N);
}
Matrix(int n) {
data=new T[n*n];
N=n;
}
~Matrix() {
delete[] data;
N=0;
}
T Get(int i, int j) { return data[i*N+j]; }
void Set(int i,int j, T d) { data[i*N+j]=d; }
Matrix& operator=(Matrix& o) {
if (&o==this) return *this;
N=o.N;
if (data!=NULL) delete[] data;
data = new T[N*N];
for (int i=0; i<N*N; i++)
data[i]=o.data[i];
return (*this);
}
friend Matrix& operator+(Matrix& a, Matrix& b) {
if (a.Dim()!=b.Dim()) throw 4;
int N=a.Dim();
static Matrix *c;
if (&c!=NULL) delete c;
c = new Matrix(N);
for(int i=0; i<N*N; i++)
c->data[i]=a.data[i]+b.data[i];
return *c;
}
friend Matrix& operator-(Matrix& a, Matrix& b) {
if (a.Dim()!=b.Dim()) throw 4;
int N=a.Dim();
static Matrix *c;
if (&c!=NULL) delete c;
c = new Matrix(N);
for(int i=0; i<N*N; i++)
c->data[i]=a.data[i]-b.data[i];
return *c;
}
friend Matrix& operator*(Matrix& a, Matrix& b) {
if (a.Dim()!=b.Dim()) throw 4;
int N=a.Dim();
static Matrix *c;
if (&c!=NULL) delete c;
c = new Matrix(N);
for(int i=0; i<N; i++)
for(int j=0; j<N; j++){
c->data[i*N+j]=0;
for(int k=0; k<N; k++)
c->data[i*N+j]+=a.data[i*N+k]*b.data[k*N+j];
}
return *c;
}
void Sum(Matrix &a, Matrix &b) {
if (a.Dim()!=b.Dim()) throw 4;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
data[i*N+j]=a.data[i*N+j]+b.data[i*N+j];
}
void Razn(Matrix &a, Matrix &b) {
if (a.Dim()!=b.Dim()) throw 4;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
data[i*N+j]=a.data[i*N+j]-b.data[i*N+j];
}
void Proizv(Matrix &a, Matrix &b) {
if (a.Dim()!=b.Dim()) throw 4;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
data[i*N+j]=0;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++){
data[i*N+j]=0;
for(int k=0; k<N; k++)
data[i*N+j]+=a.data[i*N+k]*b.data[k*N+j];
}
}
int Dim(void) { return N; }
};
template <class T1>
void Input(Matrix<T1> &m) {
int i,j,n;
T1 d;
n=m.Dim();
for(i=0; i<n; i++)
for(j=0; j<n; j++) {
cout<<"["<<i<<"]["<<j<<"]=";
cin>>d;
m.Set(i,j,d);
}
}
template <class T1>
void Print(Matrix<T1> &m) {
int i,j,n;
n=m.Dim();
for(i=0; i<n; i++) {
for(j=0; j<n; j++) cout<<m.Get(i,j)<<'\t';
cout<<endl;
}
}
main()
{
try{
/* int count=0;
cout << "1 - int, 2 - double, 3 - char"
switch(a)
{
case 1:
;
case 2:
a++;
case 3:
a++;
}*/
Matrix<int> a('a');
cout<<"a=\n";
Input(a);
Matrix<int> b('b');
cout<<"b=\n";
Input(b);
Matrix<int> c(a.Dim());
cout<<"\na=\n";
Print(a);
cout<<"b=\n";
Print(b);
c=a+b;
cout<<"a+b\n";
Print(c);
c=a-b;
cout<<"a-b\n";
Print(c);
c=a*b;
cout<<"a*b\n";
Print(c);
}
catch (int Errcode) {
if (Errcode==2) cout<<"Matrix can't have that size";
if (Errcode==4) cout<<"Can't operate with matrix with different sizes";
}
catch (...) {
cout<<"\nUnknown error";
}
}