/*
 * =====================================================================================
 *
 *       Filename:  ulamki.c
 *    Description:  Kalkilator liczb wymiernych.
 *                  Powinien dzialac poprawnie dla dodatnich liczb.
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <stdio.h>

struct ulamek
{
   int c;
   int l;
   int m;
};


int nwd(int a,int b)
{
   int c; 
   while (b != 0)
   {
      c = a % b;
      a = b;
      b = c;
   }
   return a;
}

int nww(int a, int b)
{
   return a*b/nwd(a,b);
}

struct ulamek uprosc(struct ulamek u)
{
   int k;
   if(u.l >= u.m) 
   {
      if( u.c < 0 )  u.c = u.c - u.l/u.m;
      else u.c = u.c + u.l/u.m;
      u.l = u.l % u.m;
   }
   if (u.c == 0 && u.l < 0 && -u.l >= u.m)
   {
      u.c = u.l/u.m;
      u.l = u.l % u.m;
      u.l = - u.l;
   }
   
   if(u.m < 0) { u.m=-u.m; u.l=-u.l; }
   if(u.l < 0 && u.c != 0) { u.l=-u.l; u.c=-u.c; }
   
   k=nwd(u.l, u.m);
   if(k<0) k=-k;
   if( k != 1 ) { u.l=u.l/k; u.m=u.m/k; }
   return u;
}

void wypisz_ulamek(struct ulamek u)
{
   if(u.l > u.m) u=uprosc(u);
   if(u.c !=0 || (u.c==0 && u.l==0) ) printf("%d ",u.c);
   if(u.l !=0) printf("%d/%d", u.l, u.m );
}

struct ulamek dodaj(struct ulamek x1, struct ulamek x2)
{
   struct ulamek u;
   int p1,p2;
   
   u.c = x1.c + x2.c;
   u.m = nww(x1.m, x2.m);
   
   p1= x1.l * (u.m/x1.m);
   if( x1.c < 0 ) p1 = -p1; 

   p2= (u.m/x2.m) * x2.l;
   if( x2.l < 0 ) p2=-p2;
   u.l = p1 + p2;

   return uprosc(u);
}

struct ulamek odejmij(struct ulamek x1, struct ulamek x2)
{
   x2.c=-x2.c;
   return dodaj(x1,x2);
}

struct ulamek iloczyn(struct ulamek x1, struct ulamek x2)
{
   struct ulamek u;
   
   if( x1.c < 0 ) x1.l=-x1.l;
   if( x2.c < 0 ) x2.l=-x2.l;
   u.c=0;
   u.l=(x1.c*x1.m+x1.l) * (x2.c*x2.m+x2.l);
   u.m=x1.m*x2.m;
   return uprosc(u);
}

struct ulamek podziel(struct ulamek x1, struct ulamek x2)
{
   struct ulamek u;
   
   if( x2.c < 0 ) x2.l=-x2.l;
   
   u.c=0;
   u.m=x2.c*x2.m+x2.l;
   u.l=x2.m;
   return iloczyn(x1,uprosc(u));
}


struct ulamek wczytaj_ulamek(void)
{
   struct ulamek u;
   printf("Podaj czesc calkowita, licznik i mianownik: \n");
   scanf("%d %d %d",&u.c,&u.l,&u.m);;;;

   return uprosc(u);
}

int porownaj(struct ulamek u1, struct ulamek u2)
{
   struct ulamek u = odejmij(u1,u2);
   if( u.c == 0 && u.l == 0 ) return 0;
   if( u.c > 0 || (u.c == 0 &&  u.l > 0 )) return 1;
   return -1;
}

int main()
{
   struct ulamek x1, x2;

   x1 = wczytaj_ulamek();
   x2 = wczytaj_ulamek();

   printf("Podales nastepujace liczby:\n");
   wypisz_ulamek(x1);
   printf("\n");
   wypisz_ulamek(x2);
   printf("\n");
   printf("Wyniki podstawowych operacji\n");
   wypisz_ulamek(x1); printf(" + "); wypisz_ulamek(x2); printf(" = "); wypisz_ulamek(dodaj(x1,x2)); printf("\n");
   wypisz_ulamek(x1); printf(" - "); wypisz_ulamek(x2); printf(" = "); wypisz_ulamek(odejmij(x1,x2)); printf("\n");
   wypisz_ulamek(x1); printf(" x "); wypisz_ulamek(x2); printf(" = "); wypisz_ulamek(iloczyn(x1,x2)); printf("\n");
   wypisz_ulamek(x1); printf(" : "); wypisz_ulamek(x2); printf(" = "); wypisz_ulamek(podziel(x1,x2)); printf("\n");
   
   wypisz_ulamek(x1);
   if(porownaj(x1,x2) == 0) printf(" = ");
   else if (porownaj(x1,x2)<0) printf(" < ");
   else printf(" > ");
   wypisz_ulamek(x2); printf("\n");

   return 0;
}

