Ex.: le type rationnel

rationnel.c

#include `<stdio.h>`

#include `<stdlib.h>`
#include `<stdbool.h>`

/* enregistrement: rationnel */

/* declaration d'un nouveau type en 2 temps */

/* 1: declaration d'une nouvelle structure */
struct StructRationnel 
{
    int num;
    int denom;
};

/* 2: declaration d'un nouveau type: la structure qu'on vient de creer */
typedef struct StructRationnel rationnel; /* la structure StructRationnel est un nouveau type: rationnel */

rationnel zero()
{
    rationnel z;
    z.num = 0;  /* le '.' definit le champ dans une variable */
    z.denom = 1;
    return z;
}

int lire_num(rationnel r)
{
   return r.num;
}

int lire_denom(rationnel r)
{
   return r.denom;
}

rationnel ecrire_num(int n, rationnel r)
{
   r.num = n;
   return r;  
}

void Erreur_rationnel()
{
    printf("Erreur d'operation dans les rationnels\n");
    exit(EXIT_FAILURE);
}

rationnel ecrire_denom(int d, rationnel r)
{
   if (d == 0)
   {
     Erreur_rationnel();
   }
   else
   {
      r.denom = d;
   }
   return r;
}

bool egal_rationnel(rationnel r1, rationnel r2)
{
   /* return r1 == r2 => Erreur! car le == n'est pas defini pour les rationnels */
   return (lire_num(r1)*lire_denom(r2) == lire_num(r2)*lire_denom(r1));
}

void affiche_rationnel(rationnel r)
{
   printf("%d/%d", lire_num(r), lire_denom(r));
}

void test_egal(rationnel r1, rationnel r2)
{
   printf("test de la fonction egal dans les rationnels\n");
   printf("r1 = ");
   affiche_rationnel(r1);
   printf(" r2 = ");
   affiche_rationnel(r2);
   if (egal_rationnel(r1,r2))
   {
     printf(" sont egaux \n");
   }
   else
   {
     printf(" sont differents \n");
   }
}

int main()
{
   rationnel r1, r2, r3, r4;
   r1 = ecrire_num(1, ecrire_denom(2, zero()));
   r2 = ecrire_num(1, ecrire_denom(4, zero()));
   r3 = ecrire_num(2, ecrire_denom(4, zero()));
   r4 = ecrire_num(-4, ecrire_denom(-7, zero()));
   printf("r1 = "); affiche_rationnel(r1); printf("\n");
   printf("r2 = "); affiche_rationnel(r2); printf("\n");
   printf("r3 = "); affiche_rationnel(r3); printf("\n");
   printf("r4 = "); affiche_rationnel(r4); printf("\n");
   test_egal(r1, r2);
   test_egal(r1, r3);
   test_egal(r1, r4);
   return (EXIT_SUCCESS);
}