/*
*	Code-53.cpp
*
*	Author: M. Reza Mozaffari
*	Physics Group, University of Qom
*	Created on: Nov. 2020
*/

#include <iostream>

using namespace std;

// a constant global variable
const int N {2};

// prototype
void print (int, double [][N]);
void add (int, double [][N], double [][N], double [][N]);
void sub (int, double [][N], double [][N], double [][N]);
void Transpose (int, double [][N], double [][N]);
double Trace (int, double [][N]);

int main ()
{
	int nx {2};
	double M1[nx][N] {{1.2, 2.3}, {3.4, 4.5}};
	print (nx, M1);
	
	double M2[nx][N] {{1.0, 2.0}, {3.0, 4.0}};
	print (nx, M2);
	
	double M3[nx][N] {};
	sub (nx, M1, M2, M3);
	print(nx, M3);
	
	Transpose (nx, M1, M3);
	print(nx, M3);
	
	cout << "trace = " << Trace (nx, M1) << "\n";
	return 0;
}

void print (int n, double A[][N])
{
	cout << "[";
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<(N-1); j++)
			cout << A[i][j] << " ";
		cout << A[i][N-1];
		if(i != (n-1))
			cout << "\n";
	}
	cout << "]\n";
}

void add (int n, double A[][N], double B[][N], double C[][N])
{
	for(int i=0; i<n; i++)
		for(int j=0; j<N; j++)
			C[i][j] = A[i][j] + B[i][j];
}

void sub (int n, double A[][N], double B[][N], double C[][N])
{
	for(int i=0; i<n; i++)
		for(int j=0; j<N; j++)
			C[i][j] = A[i][j] - B[i][j];
}

void Transpose (int n, double A[][N], double C[][N])
{
	for(int i=0; i<(n-1); i++)
	{
		C[i][i] = A[i][i];
		for(int j=i+1; j<N; j++)
		{
			C[i][j] = A[j][i];
			C[j][i] = A[i][j];	
		}
	}
	C[n-1][n-1] = A[n-1][n-1];
}

double Trace (int n, double A[][N])
{
	double res {0.0};
	for(int i=0; i<n; i++)
		res += A[i][i];
	
	return res;
}
