// Cramer's Rule

#include <iostream>
using namespace std;

double det2(double a, double b, double c, double d);
double det3(double a, double b, double c, double d, double e, double f,
	double g, double h, double i);

int main()
{
	double m[3][4] = {0};
	double x = 0.0;
	double y = 0.0;
	double z = 0.0;
	double denom = 0.0;

	cout << "Input your matrix elements row by row:" << endl;
	
	for (int row = 0; row < 3; row++)
	{
		
		for (int col = 0; col < 4; col++)
		{
			cin >> m[row][col];
		}

	}

	denom = det3(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0],
		m[2][1], m[2][2]);
	x = det3(m[0][3], m[0][1], m[0][2], m[1][3], m[1][1], m[1][2],
		m[2][3], m[2][1], m[2][2]) / denom;
	y = det3(m[0][0], m[0][3], m[0][2], m[1][0], m[1][3], m[1][2],
		m[2][0], m[2][3], m[2][2]) / denom;
	z = det3(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3],
		m[2][0], m[2][1], m[2][3]) / denom;
	
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
	
	return 0;
}// end of main

double det2(double a, double b, double c, double d)
{
	return a * d - b * c;
}// end of det2

double det3(double a, double b, double c, double d, double e, double f,
	double g, double h, double i)
{
	double part1 = 0.0;
	double part2 = 0.0;
	double part3 = 0.0;
	
	part1 = a * det2(e, f, h, i);
	part2 = b * det2(d, f, g, i);
	part3 = c * det2(d, e, g, h);
	
	return part1 - part2 + part3;
}// end of det3
