DEUG MIAS-2, 2000-2001
Informatique
Institut Galilée

TD 4

Le but de ce TD est de mettre en place une structure de données pour coder les rationnels dans une base b, ainsi qu’une collection d’opérations pour les manipuler. Pour çà, on abordera progressivement le cas des entiers naturels, puis des entiers relatifs et enfin celui des rationnels.

Pour stocker un entier naturel, on utilise la structure suivante :

Const N = 100 ;
Const Base = 12 ;
type Tchiffre = 0..Base-1 ;
type Tnaturel = enregistrement
                  debut,fin : entier ;
                  tab : tableau (1..N) de Tchiffre ;
                fin enregistrement ;

1.	Préliminaires

Soit n un entier naturel. On rappelle que la représentation de n en base b est l’unique suite finie (a0,..,ap) d’éléments de {0 ;... ;b-1} telle que n = a0b0 + a1b1 + ... + apbp. Avec ces notations, on dit que a0 est le chiffre de poids faible, et que ap est le chiffre de poids fort de la représentation de n en base b.

a)	Ecrire une fonction Naturel(n : entier) : Tnaturel qui renvoie le nombre correspondant à n. On conviendra que debut marque le chiffre de poids faible et fin le chiffre de poids fort. On écrira 2 versions de cette fonction : une itérative, et une récursive.

b)	Ecrire les fonctions EgalZero(n : Tnaturel) : boolean, et EgalUn(n : Tnaturel) : boolean, Egal(n1,n2 : Tnaturel) : boolean, et Sup(n1,n2 : Tnaturel) : Boolean (vrai si n1>n2)

2.	Opérations élémentaires

a)	L’addition

i)	Ecrire une fonction Add (n1,n2 : Tnaturel) : Tnaturel qui renvoie la somme de n1 et n2.

ii)	Ecrire une fonction Dec (n : Tnaturel) : Tnaturel qui ôte 1 à n et renvoie le résultat et une fonction Inc (n : Tnaturel) : Tnaturel qui ajoute 1 à n. En déduire une version récursive de Add. Commenter cette version. Est elle plus efficace ? pourquoi ?

b)	La soustraction

i)	Ecrire une fonction Sub(n1,n2 : Tnaturel) : Tnaturel itérative.

ii)	Déduire de a) ii) une version récursive de cette fonction. Commenter son efficacité.

c)	La multiplication

i)	Ecrire une version itérative de la fonction Mul (n1,n2 : Tnaturel) : Tnaturel qui renvoie n1*n2.

ii)	En écrire une version récursive qui fait intervenir Add. Laquelle de ces 2 fonctions est la plus efficace ? la plus simple à écrire ? Conclure sur l’intérêt de la récursivité.

d)	Ecrire une fonction Divi (n1,n2 : Tnaturel) : Tnaturel qui renvoie le quotient dans la division euclidienne de n1 par n2. Cette fonction sera récursive. De même, écrire une version récursive de la fonction Modulo (n1,n2 : Tnaturel) : Tnaturel qui renvoie le reste de la division euclidienne de n1 par n2.

3.	factorielle, puissance

a)	Ecrire une version récursive de fact(n : Tnaturel) : Tnaturel qui renvoie n!. En écrire une version itérative.

b)	Ecrire une version itérative de puissance (n,p : Tnaturel) : Tnaturel qui renvoie np. En écrire une version récursive. Comment modifier cette dernière version pour limiter le nombre d’appels récursifs ?
Indication : remarquer que si p=2k, np = n2k = nk*nk, et si p=2k+1, np = n2k+1 = nk*nk*n.

c)	Dérouler les 2 versions récursives de puissance avec n=2 et p=8. Que remarque on ?

4.	Les entiers relatifs

On code les entiers relatifs de la façon suivante :

type Tsigne = (plus,moins) ;
type Trelatif = enregistrement
                  signe : Tsigne ;
                  va : Tnaturel ; {pour valeur absolue}
                fin enregistrement

Ecrire une fonction Relatif(z : entier) : Trelatif, qui renvoie le relatif correspondant à z. Réécrire les fonctions Add, Sub, Mul, Divi, et Modulo Sur Trelatif. On réutilisera les fonctions précédentes.

5.	Les rationnels

Les rationnels seront codés de la façon suivante :

type Trationnel = enregistrement
                    a,b : Trelatif ; {pour a/b}
                  fin enregistrement

a)	Ecrire une fonction Rationnel (a,b : entier) : Trationnel, en utilisant la fonction du 4.

b)	Ecrire une fonction pgcd (a,b : Trelatif) : Trelatif, en déduire une fonction 
Simplifier (r : Trationnel) : Trationnel, qui ecrit r=a/b, avec a et b minimaux.

c)	En utilisant b) et 4., Ecrire les fonctions d’addition, soustraction, multiplication et division sur les rationnels.

d)	On souhaite avoir un début d’écriture décimale d’un rationnel.

i)	Montrer que a/b = a div b + (a mod b)/b. Conséquence sur l’écriture décimale ?
En déduire une procédure PartieEntière(r :Trationnel) qui affiche la partie entière de a/b ie a div b.

ii)	On s’intéresse à la partie flottante (ie (a mod b)/b). On la note p/q
Montrer que son premier chiffre est [p*Base] div q.
En déduire un algorithme itératif qui affiche ses n premiers chiffres

iii)	Déduire de i) et ii) une procédure Afficher (r : Trationnel ; precision :entier) qui affiche l’écriture décimale de r avec precision chiffres après la virgule.

6.	Une application

On défini la suite u par un = 1/(0!) + 1/(1!) + 1/(2!) + 1/(3!) + ... + 1/(n!), où n est un entier naturel. On montre que u converge vers e.

a)	Ecrire une fonction terme(n : Tnaturel) : Trationnel, qui renvoie 1/(n!).

b)	Ecrire une fonction U(n : Tnaturel) : Trationnel, qui renvoie un.

c)	En utilisant 5. d) iii), ecrire une procédure E(n : Tnaturel) qui affiche l’écriture décimale du nième terme de u.