#include <iostream>
#include <iomanip>
#ifdef __BORLANDC__
  #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);
   void Ustaw(const Ulamek &U) { Ustaw(U.Licz,U.Mian); }
   bool Wprowadz(istream &s);
   bool Wprowadz() { return(Wprowadz(cin)); }
   void Drukuj(ostream &s)const;
   void Drukuj()const { Drukuj(cout); }
   Ulamek Dodaj(const Ulamek &U)const;
   Ulamek Odejmij(const Ulamek &U)const;
   Ulamek Mnoz(const Ulamek &U)const;
   Ulamek Dziel(const Ulamek &U)const;
   double Wynik()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();
  }

bool Ulamek::Wprowadz(istream &s)
  {
   char Lamana;
   s>>ws>>Licz>>Lamana>>Mian;
   if(s.good() && Lamana=='/')
     {
      Normalizuj();
      return(true);
     }
   s.clear();
   s.ignore(INT_MAX,'\n');
   return(false);
  }

void Ulamek::Drukuj(ostream &s)const
  {
   s<<Licz<<'/'<<Mian;
  }

Ulamek Ulamek::Dodaj(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Mian+U.Licz*Mian,Mian*U.Mian));
  }

Ulamek Ulamek::Odejmij(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Mian-U.Licz*Mian,Mian*U.Mian));
  }

Ulamek Ulamek::Mnoz(const Ulamek &U)const
  {
   return(Ulamek(Licz*U.Licz,Mian*U.Mian));
  }

Ulamek Ulamek::Dziel(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: ";
      if(!A.Wprowadz())
        {
         cout<<"Blad wprowadzenia"<<endl<<endl;
         continue;
        }
      cin>>Op;
      if(!B.Wprowadz())
        {
         cout<<"Blad wprowadzenia"<<endl<<endl;
         continue;
        }
      switch(Op)
        {
         case '+': Wynik=A.Dodaj(B);   break;
         case '-': Wynik=A.Odejmij(B); break;
         case '*': Wynik=A.Mnoz(B);    break;
         case ':': Wynik=A.Dziel(B);   break;
         default:
           {
            cout<<"Blad wprowadzenia"<<endl;
            cout<<"Dozwolone operacje to + - * :"<<endl<<endl;
            continue;
           }
        }
      A.Drukuj();
      cout<<' '<<Op<<' ';
      B.Drukuj();
      cout<<" = ";
      Wynik.Drukuj();
      if(Wynik.Mianownik()) cout<<" = "<<Wynik.Wynik();
      cout<<endl<<endl;
     }
  }
