/*
 *	Autor: Krzysztof Trynkiewicz, rok I inf.stos.
 *	mail: chris.trynkiewicz@gmail.com
 *	Program operuje na ulamkach
 *	Version: 1.0
 *	Last modified: 29-05-07
*/

	/* Includes */
	#include <string>
	//#include <stdio>
	//#include <conio>
	//#include <stdlib>
	#include <iostream>


enum {
	PLUS, MINUS, MNOZENIE, DZIELENIE
};
	/* --- Koniec Includes */

using namespace std;

class Ulamek{

	public:

		Ulamek(); 
		~Ulamek();
		void UstLicz(int nowy);
		void UstMian(int nowym);
		void Pobierz(int nrulamka);
		int Licz();
		int Mian();
		void Ulamek::Skroc();
		int Ulamek::d;
		int Ulamek::NWD(int dzielnik, int dzielna);
		Ulamek Ulamek::operator +(Ulamek d);
		Ulamek Ulamek::operator -(Ulamek d);
		Ulamek Ulamek::operator *(Ulamek d);
		Ulamek Ulamek::operator /(Ulamek d);
		Ulamek Ulamek::Ulamek_operuj(int operacja, Ulamek a, Ulamek b);
		int licz;
		int mian;
};

Ulamek::Ulamek(){

}

//dekonstruktor
Ulamek::~Ulamek(){
//nic
}

//fcje ustawiajace licznik i mianownik
void Ulamek::UstLicz(int nowy){
	licz=nowy;
}
void Ulamek::UstMian(int nowym){
	mian=nowym;
	//jesli mianownik <0 to zamieniamy znaki
	if(mian<0){
		licz*=-1;
		mian*=-1;
	}
}

//fcja pobiera wartosci od uzytkownika
void Ulamek::Pobierz(int nrulamka){
	// restart zmiennych
	int nowy=0, nowym=0;
	cout << "\nPodaj licznik ulamka nr " << nrulamka << ": ";
	cin >> licz;
	cout << "\nPodaj mianownik ulamka nr " << nrulamka << ": ";
	cin >> mian;
	// zamien znaki jesli mianownik ujemny
	if(mian<0){
		mian*=-1;
		licz*=-1;
	}
}

//fcje zwracajace wartosci licznika i mianownika
int Ulamek::Licz(){
	return(licz);
}
int Ulamek::Mian(){
	return(mian);
}

//fcja skracajaca uzywajaca NWD
void Ulamek::Skroc(){
	int skr=0; // pomocnicza
	if(mian>licz)
		skr=NWD(mian, licz);
	else if(mian<licz)
		skr=NWD(licz, mian);
	else
		skr=NWD(licz, mian);
	licz /= skr; // skracamy licz
	mian /= skr; // skracamy mian
	// zamien znaki jesli mianownik ujemny
	if(mian<0){
		mian*=-1;
		licz*=-1;
	}
}

//NWD
int Ulamek::NWD(int dzielnik, int dzielna){
	if(dzielna==0)
		return(dzielnik);
	else{
		return(NWD(dzielna, dzielnik%dzielna));
	}
}

//definiujemy nowe operatory: +, -, *, /
Ulamek Ulamek::operator +(Ulamek d){
	Ulamek zwrot;
	zwrot.licz=(licz*d.mian) + (d.licz * mian);
	zwrot.mian= d.mian * mian;
	return(zwrot);
}

Ulamek Ulamek::operator -(Ulamek d){
	Ulamek zwrot;
	zwrot.licz=(licz * d.mian) - (d.licz * mian);
	zwrot.mian= d.mian * mian;
	return(zwrot);
}

Ulamek Ulamek::operator *(Ulamek d){
	Ulamek zwrot;
	zwrot.licz= d.licz * licz;
	zwrot.mian= d.mian * mian;
	return(zwrot);
}

Ulamek Ulamek::operator /(Ulamek d){
	Ulamek zwrot;
	zwrot.licz= licz * d.mian;
	zwrot.mian= d.licz * mian;
	// zamieniamy znaki jesli sie zmienily
	if(zwrot.mian<0){
		zwrot.licz*=-1;
		zwrot.mian*=-1;
	return(zwrot);
	}
}

//funkcja obslugujaca powyzsze operacje
Ulamek Ulamek::Ulamek_operuj(int operacja, Ulamek a, Ulamek b){
	Ulamek bla;
	switch(operacja){
	case PLUS:
		return (a + b);
	case MINUS:
		return (a-b);
	case MNOZENIE:
		return (a*b);
	case DZIELENIE:
		return(a/b);
	}
	bla.UstLicz(1);
	bla.UstMian(1);
	return(bla);
}


int main(){

	/* Przedstawienie */
	printf("\n\tAutor: Krzysztof Trynkiewicz, I rok inf.stos.\n\tmail: chris.trynkiewicz@gmail.com || trynkiewicz@ibis.if.uj.edu.pl\n");
	printf("\tProgram obsluguje ulamki\n\n");
	/* --- Koniec Przedstawienia */

	/* Program */
	
	Ulamek a;
	Ulamek b;
	Ulamek c;
	int op;
	char opchar;
	a.Pobierz(1);
	b.Pobierz(2);
	cout<< "\nPodaj operacje: +, -, /, *\n";
	cin >> opchar;
	switch(opchar){
	case '+':
		op=PLUS;
		break;
	case '-':
		op=MINUS;
		break;
	case '*':
		op=MNOZENIE;
		break;
	case '/':
		op=DZIELENIE;
		break;
	default: //nieznany operator
		cout << "Nieznany operator\n";
		return(0);
	}
	if((a.mian==0) || (b.mian==0)){
		cout<<"Dzielenie przez 0?";
	}else{
		c=a.Ulamek_operuj(op, a, b);
		cout<<"\n";
		cout<<"Przed skroceniem: " << c.licz << "/" << c.mian << endl;
		c.Skroc();
		cout<<"Po skroceniu: " << c.licz << "/" << c.mian << endl;
	}
	
	
	/* --- Koniec Programu */

	return 0;
}
