plus

plus.

/* implementation de l'operateur plus dans les entiers naturels */

/*
 * Profil
 *
 * plus: entier_nat x entier_nat -> entier_nat
 *
 * Axiomes:
 * plus(0, m) = m
 * plus(succ(n), m) = plus(n, succ(m))
 *
 * Algorithme recursif:
 * fonction plus(a: entier_nat, b: entier_nat): entier_nat
 * debut
 *  | si est_nul(a)
 *  |  | alors retourner b
 *  |  | sinon retourner plus(prec(a), succ(b))
 *  | finsi
 * fin
 *
 * Algorithme iteratif:
 * fonction plus(a: entier_nat, b: entier_nat): entier_nat
 * debut
 *    m: entier_nat
 *    n: entier_nat
 *    m := a
 *    n := b
 *    tant que non est_nul(a) faire
 *        a := prec(a)
 *        b := succ(b)
 *    fintantque
 *    retourner b
 * fin
 */

#include <stdbool.h>
#include "entier_nat.h"

ENTIER_NAT plus_recursif(ENTIER_NAT a, ENTIER_NAT b)
{
  if (est_nul(a))
  {
    return b;
  }
  else
  {
    return plus_recursif(prec(a), succ(b));
  }
}

ENTIER_NAT plus_iteratif(ENTIER_NAT a, ENTIER_NAT b)
{
  ENTIER_NAT n = a;
  ENTIER_NAT m = b;

  while (! est_nul(n))
  {
     n = prec(n);
     m = succ(m);
  }
  return m;
}


/* tests */
void test_plus_recursif(ENTIER_NAT a, ENTIER_NAT b)
{
   ENTIER_NAT c;

   c = plus_recursif(a,b);
   printf("%d + %d = %d (recursif)\n", a, b, c);

}

void test_plus_iteratif(ENTIER_NAT a, ENTIER_NAT b)
{
   ENTIER_NAT c;

   c = plus_iteratif(a,b);
   printf("%d + %d = %d (iteratif)\n", a, b, c);

}

int main()
{
   test_plus_recursif(0,0);
   test_plus_recursif(0,1);
   test_plus_recursif(1,0);
   test_plus_recursif(5,5);
   test_plus_recursif(3,5);
   test_plus_recursif(4,2);
   test_plus_recursif(100,100);
   test_plus_iteratif(0,0);
   test_plus_iteratif(0,1);
   test_plus_iteratif(1,0);
   test_plus_iteratif(5,5);
   test_plus_iteratif(3,5);
   test_plus_iteratif(4,2);
   test_plus_iteratif(100,100);
}