#include <iostream>


using namespace std;


// Deklaration 

class Ratio{
    private:
	long zaehler;
	long nenner;
	bool negativ;
	long ggT(long a, long b);
	void kuerzen();
    public:
	
	// Drei Konstruktoren
	Ratio(long z, long n);
	Ratio(long z, long n, bool neg);
	Ratio();
	
	float kommazahl();
	Ratio operator* (Ratio bruch2);
	Ratio operator/ (Ratio bruch2);
	Ratio operator+ (Ratio bruch2);
	Ratio operator- (Ratio bruch2);
	friend ostream& operator<< (ostream &os, Ratio bruch);
};



// Implementierung

long Ratio::ggT(long a, long b)
{
	if (b == 0)
	{
		return(a); 
	}
	else return(ggT(b,a % b));
}

Ratio Ratio::operator*(Ratio bruch2)
{
	Ratio ergebnis;
	ergebnis.zaehler = zaehler * bruch2.zaehler;
	ergebnis.nenner = nenner * bruch2.nenner;
	ergebnis.negativ = negativ ^ bruch2.negativ;
	ergebnis.kuerzen();
	return(ergebnis);
}

Ratio Ratio::operator/(Ratio bruch2)
{
	Ratio ergebnis;
	ergebnis.zaehler = zaehler * bruch2.nenner;
	ergebnis.nenner = nenner * bruch2.zaehler;
	ergebnis.negativ = negativ ^ bruch2.negativ;
	ergebnis.kuerzen();
	return(ergebnis);
}

Ratio Ratio::operator+(Ratio bruch2)
{
	Ratio ergebnis;
	ergebnis.zaehler = (zaehler * bruch2.nenner * ((negativ)?-1:1) ) + (nenner * bruch2.zaehler * ((bruch2.negativ)?-1:1) );
	ergebnis.nenner = nenner * bruch2.nenner;
	if(ergebnis.zaehler < 0)
	{
		ergebnis.zaehler *= -1;
		ergebnis.negativ = true;
	}
	ergebnis.kuerzen();
	return(ergebnis);
}

Ratio Ratio::operator-(Ratio bruch2)
{
	Ratio ergebnis;
	ergebnis.zaehler = (zaehler * bruch2.nenner * ((negativ)?-1:1) ) - (nenner * bruch2.zaehler * ((bruch2.negativ)?-1:1) );
	ergebnis.nenner = nenner * bruch2.nenner;
	if(ergebnis.zaehler < 0)
	{
		ergebnis.zaehler *= -1;
		ergebnis.negativ = true;
	}
	ergebnis.kuerzen();
	return(ergebnis);
}

ostream & operator<< (ostream & os, Ratio bruch)
{
	if(bruch.negativ) os << "-";
	os << bruch.zaehler << "/" << bruch.nenner;
	return(os);
}

Ratio::Ratio(long z , long n )
{
    zaehler = z;
    nenner = n;
    negativ = false;
    kuerzen();
}

Ratio::Ratio(long z , long n, bool neg )
{
	zaehler = z;
	nenner = n;
	negativ = neg;
	kuerzen();
}

Ratio::Ratio()
{
	zaehler = 1;
	nenner = 0;
	negativ = false;
}

void Ratio::kuerzen()
{
	long teiler = ggT(zaehler, nenner);
	zaehler = zaehler / teiler;
	nenner = nenner / teiler;
}

float Ratio::kommazahl()
{
	return( (float)zaehler / (float)nenner);
}

int main()
{
	Ratio bruch1(2,15);
	Ratio bruch2(7,5);
	Ratio bruch3(3,7);
	Ratio bruch4(1,2,true);
	Ratio bruch5(1,3);
	cout << "( " << bruch1 << " / " << bruch2 << " ) + " << bruch3 << " * (" << bruch4 << " + " << bruch5 << " ) = " ;
	Ratio erg = (bruch1 / bruch2) + (bruch3*(bruch4 + bruch5));
	cout << erg << " = " << erg.kommazahl() << endl;
    	return(0);
}
