#include <iostream>

using namespace std;

class PhanSo{
private:
	int tu;
	int mau;
public:
	//loi
	//chuyen kieu = constructor va dung template 
	
	template <typename T1>
	PhanSo(T1 t=0,T1 m=1);
	PhanSo(T1 t,T1 m){
		cout<<"Phan so da duoc tao\n";
		this->tu=(t);
		this->mau=(m);
	}
	
	
	//chuyen kieu = constructor ko dung template
//	PhanSo(int t=0,int m=1){
//		cout<<"Phan so da duoc tao\n";
//		this->tu=(t);
//		this->mau=(m);
//	}
	void set();      		//ham nhap phan so
	void get();				// ham xuat phan so
	
	//   overloading operator
	friend istream &operator>>(istream &,PhanSo &);
	friend PhanSo operator+(const PhanSo &,const PhanSo &);    	
	friend PhanSo operator-(const PhanSo &,const PhanSo &);
	friend PhanSo operator*(const PhanSo &,const PhanSo &);
	friend PhanSo operator/(const PhanSo &,const PhanSo &);
};

void PhanSo::set(){
	cin>>*this; 			// toan tu cin da duoc nap chong  !!
	
}
void PhanSo::get(){
	if(this->tu==0)
		cout<<"0\n";
	else if(this->mau==1 )
		cout<<this->tu<<endl;
	else if(this->mau==0)
		cout<<"Phan So khong hop le vi mau so bang khong!\n";
	else 
		cout<<this->tu<<"/"<<this->mau<<endl;
}

istream &operator>>(istream &in,PhanSo &ps){
	cout<<"Nhap tu so: ";
	in>>ps.tu;
	cout<<"Nhap mau so: ";
	in>>ps.mau;
	return in;
}

PhanSo operator+(const PhanSo &c,const PhanSo &d){
	PhanSo kq;
	kq.tu=(c.tu*d.mau) + (d.tu*c.mau);
	kq.mau=c.mau*d.mau;
	return kq;
}

PhanSo operator-(const PhanSo &a,const PhanSo &b){
	PhanSo kq;
	kq.tu=(a.tu*b.mau) - (b.tu*a.mau);
	kq.mau=a.mau*b.mau;
	return kq;
}

PhanSo operator*(const PhanSo &a,const PhanSo &b){
	PhanSo kq;
	kq.tu=a.tu*b.tu;
	kq.mau=a.mau*b.mau;
	return kq;
}

PhanSo operator/(const PhanSo &a,const PhanSo &b){
	PhanSo kq;
	kq.tu=(a.tu*b.mau) ;
	kq.mau=a.mau*b.tu;
	return kq;
}

int main(){
	PhanSo x;
	PhanSo y;
	PhanSo z(4,5);
	cout<<"Khoi tao x!\n";
	x.set();
	x.get();
	cout<<"Khoi tao y!\n";
	y.set()	;
	y.get();
	cout<<"Khoi tao z: ";
	z.get();
	char ope;				 //bien luu phep toan muon tinh 
	cout<<"Nhap phep toan muon tinh voi x va y(+,-,*,/): ";
	cin>>ope;
	switch (ope){
		case '+':{
			z=x+y;
			z.get();
			break;
		}
		case '-':{
			z=x-y;
			z.get();
			break;
		}
		case '*':{
			z=x*y;
			z.get();
			break;
		}
		case '/':{
			z=x/y;
			z.get();
			break;
		}
	}
	
			
	
	
}







