mult

mult.c

/*

 * Profil
 *
 * mult: entier_nat x entier_nat -> entier_nat
 *
 * Exemple
 *
 * 3*4 = 3+3*3 = 3+3+3*2 = 3+3+3+3*1 = 3+3+3+3+3*0 = 3+3+3+3+0 = 12
 *
 * Axiomes:
 * mult(n, 0) = 0
 * mult(n, succ(m)) = plus(n, mult(n,m))
 *
 * Algorithme recursif:
 * fonction mult(a: entier_nat, b: entier_nat): entier_nat
 * debut
 *  | si est_nul(b)
 *  |  | alors retourner zero()
 *  |  | sinon retourner plus(a, mult(a,prec(b))
 *  | finsi
 * fin
 *
 * Algorithme iteratif:
 * fonction mult(a: entier_nat, b: entier_nat): entier_nat
 * debut
 *    resultat: entier_nat
 *    resultat := 0
 *    tant que non est_nul(b) faire
 *        resultat := plus(resultat, a)
 *        b := prec(b)
 *    fintantque
 *    retourner resultat
 * fin
 */

#include `<stdbool.h>`

#include "entier_nat.h"
#include "plus.h"

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

ENTIER_NAT mult_iteratif(ENTIER_NAT a, ENTIER_NAT b)
{
    ENTIER_NAT resultat = zero();

    while (! est_nul(b))
    {
     resultat = plus_iteratif(resultat, a);
     b = prec(b);
    }
    return resultat;
}


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

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

}

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

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

}

int main()
{
   test_mult_recursif(0,0);
   test_mult_recursif(0,1);
   test_mult_recursif(1,0);
   test_mult_recursif(5,5);
   test_mult_recursif(3,5);
   test_mult_recursif(4,2);
   test_mult_recursif(100,100);
   test_mult_iteratif(0,0);
   test_mult_iteratif(0,1);
   test_mult_iteratif(1,0);
   test_mult_iteratif(5,5);
   test_mult_iteratif(3,5);
   test_mult_iteratif(4,2);
   test_mult_iteratif(100,100);
}