#include <iostream>
#ifdef __BORLANDC__
  #include <math>
  #include <limits>
#else
  using namespace std;
#endif

class Ulamek
  {
   private:
   long Licz,Mian;
   void Normalizuj();
   public:
   Ulamek(long Licznik,long Mianownik);
   void Ustaw(long Licz,long Mian);
   Ulamek operator+(const Ulamek &U)const;
   Ulamek operator-(const Ulamek &U)const;
   Ulamek operator*(const Ulamek &U)const;
   Ulamek operator/(const Ulamek &U)const;
   operator double()const { return((double)Licz/Mian); }
   double Licznik()const { return(Licz); }
   double Mianownik()const { return(Mian); }
  };

unsigned long Nwd(unsigned long a,unsigned long b)
  {
   if((!a)||(!b)) return(1);
   while(b)
     {
      unsigned long r=a%b;
      a=b;
      b=r;
     }
   return(a);
  }

Ulamek::Ulamek(long Licznik,long Mianownik):
  Licz(Licznik),Mian(Mianownik)
  {
   Normalizuj();
  }

void Ulamek::Normalizuj()
  {
   if(Mian<0)
     {
      Mian=-Mian;
      Licz=-Licz;
     }
   long n=Nwd(abs(Licz),abs(Mian));
   Licz/=n;
   Mian/=n;
  }

void Ulamek::Ustaw(long Licz,long Mian)
  {
   this->Licz=Licz;
   Ulamek::Mian=Mian;
   Normalizuj();
  }

istream &operator>>(istream &s,Ulamek &U)
  {
   char Lamana;
   long L,M;
   s>>ws>>L>>Lamana>>M;
   if(s.good() && Lamana!='/') s.clear(s.rdstate()|ios::badbit);
   else U.Ustaw(L,M);
   return(s);
  }

ostream &operator<<(ostream &s,const Ulamek &U)
  {
   return(s<<U.Licznik()<<'/'<<U.Mianownik());
  }

Ulamek Ulamek::operator+(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Mian+U.Licz*Mian,Mian*U.Mian));
  }

Ulamek Ulamek::operator-(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Mian-U.Licz*Mian,Mian*U.Mian));
  }

Ulamek Ulamek::operator*(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Licz,Mian*U.Mian));
  }

Ulamek Ulamek::operator/(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Mian,Mian*U.Licz));
  }

int main()
  {
   while(true)
     {
      Ulamek A(1,1),B(A),Wynik(A);
      char Op;
      cout<<"Podaj wyrazenie ulamkowe: ";
      cin>>A>>Op>>B;
      if(!cin.good())
        {
         cin.clear();
         cin.ignore(INT_MAX,'\n');
         cout<<"Blad wprowadzenia"<<endl<<endl;
         continue;
        }
      switch(Op)
        {
         case '+': Wynik=A+B; break;
         case '-': Wynik=A-B; break;
         case '*': Wynik=A*B; break;
         case ':': Wynik=A/B; break;
         default:
           {
            cout<<"Blad wprowadzenia"<<endl;
            cout<<"Dozwolone operacje to + - * :"<<endl<<endl;
            continue;
           }
        }
      cout<<A<<' '<<Op<<' '<<B<<" = "<<Wynik;
      if(Wynik.Mianownik()) cout<<" ("<<(double)Wynik<<')';
      cout<<endl<<endl;
     }
  }
