#ifndef FRACTION_H
#define FRACTION_H

class type_rationnel
{
  int a;
  int b;

  inline int Min(int Nb1, int Nb2) { return( (Nb1<Nb2) ? Nb1:Nb2); }
  inline int Max(int Nb1, int Nb2) { return( (Nb1>Nb2) ? Nb1:Nb2); }
  int Pgcd(int Nb1, int Nb2)
    {
      int Tampon;
      int Nmax = Max(Nb1, Nb2);
      int Nmin = Min(Nb1, Nb2);

      while (Nmax-Nmin != 0)
        {
          Tampon = Nmax - Nmin;
          Nmax = Max(Tampon, Nmin);
          Nmin = Min(Tampon, Nmin);
        }

      return Nmin;
    }

 public:
  type_rationnel() { a = 0; b = 1; }
  type_rationnel(int n, int d) { a = n; b = d; }

  void Simplify(void)
    {
      int Pgcd1 = Pgcd(a, b);
      a /= Pgcd1;
      b /= Pgcd1;
    }

  type_rationnel operator+(const type_rationnel& Nb2)
    {
      type_rationnel Resultat;
      Resultat.a = a*Nb2.b+b*Nb2.a;
      Resultat.b = b*Nb2.b;
      Resultat.Simplify();
      return Resultat;
    }

  type_rationnel operator-(const type_rationnel& Nb2)
    {
      type_rationnel Resultat;
      Resultat.a = a*Nb2.b-b*Nb2.a;
      Resultat.b = b*Nb2.b;
      Resultat.Simplify();
      return Resultat;
    }

  type_rationnel operator*(const type_rationnel& Nb2)
    {
      type_rationnel Resultat;
      Resultat.a = a*Nb2.a;
      Resultat.b = b*Nb2.b;
      Resultat.Simplify();
      return Resultat;
    }

  type_rationnel operator/(const type_rationnel& Nb2)
    {
      type_rationnel Resultat;
      Resultat.a = a*Nb2.b;
      Resultat.b = b*Nb2.a;
      Resultat.Simplify();
      return Resultat;
    }
};

#endif // FRACTION_H
