Exercice 3 - Campus des Sciences et Techniques d`Avignon

Voici enfin un exemple plus compliqué qui permet de mettre en lumière les points 3 et 4. Enoncé : concevoir un alogrithme
qui permette de faire la somme de deux fractions après les avoir réduites au même dénominateur, mais
attention, avec un dénominateur optimisé et pas le simple produit des deux dénominateurs.
Rappelons que plus encore dans cet exemple que les précédents, l’intérêt est plus de décortiquer l’analyse du problème que
d’écrire du code qui sera un peu plus compliqué. Pour les curieux je donne tout de même le code par la suite.
1/ Comprendre du problème posé : un simple exemple permet de fixer les choses : à partir des fractions 14
75 et 7
330
l’algorithme doit effectuer la somme et répondre 343
1650.
2/ "comment le ferais-je à la main ?" conservons l’exemple précédent : et posons la question comment arriverais-je au
résultat 14
75 +7
330 =343
1650.
D’abord je chercherais le plus petit multiple commun des deux dénominateurs (ici 2×3×5×5×11 = 1650).
Ensuite je déterminerais par quel nombre multiplier 75 pour obtenir 1650 c’est 22,puis par quel nombre multiplier 330
pour obtenir 1650 c’est 1650/330 = 5.
Il n’y a plus qu’à faire le calcul : 14
75 +7
330 =14 ×22 + 7 ×5
1650 =343
1650
3/ Difficulté progressive : voici un premier raffinage pour calculer :a
b+c
d
Déterminer de Plus Petit Commun Multiple P P CM de bet d.
Calculer n
b
tel que b×n
b
=P P CM
Calculer n
d
tel que d×n
d
=P P CM
a
b+c
d=a×n
b
+c×n
d
P P CM
4/ Des modules indépendants : évidemment, à ce moment de l’analyse, on ne cherche pas encore à résoudre le problème
(pas si simple) du PPCM ; on verra plus tard ! C’est un module indépendant.
Tout ce qui suit est une illustration du point numéro 3, c’est à dire l’entrée progressive dans la difficulté (raffinages successifs).
En utilisant la division entière DIV qui donne par exemple 9DIV 2 = 4 on pourrait faire le raffinage suivant :
Déterminer de Plus Petit Commun Multiple P P CM de bet d.
n
b
P P CM DIV b
n
d
P P CM DIV d
a
b+c
da×n
b
+c×n
d
P P CM
Cet algorithme, s’écrit alors :
Variable a, b, c, d, PP CM, nb, nd, NUM, DENO : entier
Début
Entrer b et d
Déterminer de Plus Petit Commun Multiple P P CM de bet d.
n
b
P P CM DIV b
n
d
P P CM DIV d
NUM a×n
b
+c×n
d
DENO P P CM
Ecrire(
Le resultat est : ’,NUM,’ / ’,’DENO)
Fin
1
Il ne reste plus qu’à se pencher sur le problème du PPMC. Mais attention, l’algorithme que je propose est beaucoup plus
compliqué que ne le suggère la simplicité du problème. Il est probablement prématuré d’en parler ici, le voici tout de même.
Comment calculer le PPCM de 330 et 75 ? La technique habituelle est de déterminer la décomposition en facteurs premiers
de chacun des nombres :
75 3
25 5
5 5
1
donc 75 = 3 ×5
2
et
330 2
165 3
55 5
11 11
1
donc 330 = 2 ×3×5×11
Le PPCM est alors 2×3×5
2
×11 = 825
Il semble donc qu’on cherche les diviseurs de chacun quand on en trouve un, on multiplie le PPCM par celui-ci et on "réduit"
le nombre. On comprendra peut-être mieux avec le schéma suivant, partant de P P CM = 1 :
b P P CM = 1 d
75 3 P P CM = 1 ×3×2 330 2
25 5 P P CM = 1 ×3×2×5 165 3
5 5 P P CM = 1 ×3×2×5×5 55 5
1P P CM = 1 ×3×2×5×5×11 11 11
Termi1
Quel algorithme décrit-il ce procédé ?
On teste tous les entiers de 2jusqu’au plus grand des deux nombres (qu’il faut donc calculer) pour savoir s’il divise ou non.
On a pour cela une instruction MOD qui donne le reste de la division euclidienne, ainsi 10 MOD 4vaut 2.
Ainsi, idivise un nombre bsi bMOD i= 0.
On peut alors écrire :
// Recherche du Max des deux nombres
PPCM1
i2
répéter
si i divise b
alors
réduire b
PPCM PPCM ×i
si i divise d alors réduire aussi d
sinon si i divise d
alors
PPCM = PPCM ×i
réduire d
si i n’a divisé ni b ni d alors passer au isuivant, c’est à dire ii+ 1
sinon recommencer avec le même i sur les nombres réduits
jusqu’à i = max
2
Il reste à déterminer le MAX de bet d:
si b < d alors MAX d
sinon MAX b
D’où le raffinage final du PPCM de bet d:
// Recherche du MAX de bet d
si b < d alors MAX d
sinon MAX b
// Détermination du PPCM
P P CM 1
i2
répéter
diviseur = faux // on n’a pas trouvé de diviseur, si ça ne change pas on pourra incrémenter i
// si i divise b multiplier le PPCM par i et réduire b
si b mod i = 0
alors
début
diviseur vrai // on n’incrémentera donc pas i
bb div i
P P CM P P CM×i
si d mod i = 0 alors d d div i // réduire aussi d
fin
sinon si d mod i = 0 // si i divise d multiplier le PPCM par i et réduire d
alors
Début
diviseur vrai // on n’incrémentera donc pas i
P P CM P P CM ×i
dd div i
Fin
si diviseur = faux alors i i + 1
jusqu’à i = max
Vous trouverez page suivante un algorithme définitif réponadant au problème posé :
3
variable a,b,c,d,nb,nd,M,MAX,PPCM,NUM : entier
variable b_init, b_init :entier // b et d seront modifiés, il faut les mémoriser
variable diviseur : booleen
Début
// saisie des valeurs
Ecrire(’entrer a =’)
Lire(a)
Ecrire(’entrer b =’)
Lire(b)
Ecrire(’entrer c =’)
Lire(c)
Ecrire(’entrer d =’)
Lire(d)
// mémorisation des valeurs avant modif dont on aura besoin à la fin
b_init b
c_init c
// Recherche du MAX de bet d
si b < d alors MAX d
sinon MAX b
// Détermination du PPCM
P P CM 1
i2
répéter
diviseur = faux // on n’a pas trouvé de diviseur, si ça ne change pas on pourra incrémenter i
// si i divise b multiplier le PPCM par i et réduire b
si b mod i = 0
alors
début
diviseur vrai // on n’incrémentera donc pas i
bb div i
P P CM P P CM×i
si d mod i = 0 alors d d div i // réduire aussi d
fin
sinon si d mod i = 0 // si i divise d multiplier le PPCM par i et réduire d
alors
Début
diviseur vrai // on n’incrémentera donc pas i
P P CM P P CM ×i
dd div i
Fin
si diviseur = faux alors i i + 1
jusqu’à i = max
// Calcul de la fraction résultat utilisant les valeurs initiales de bet d
nb M DIV b_init
nd M DIV d_init
NUM a×n
b
+c×n
d
// Ecriture du résultat
Ecrire(
la fraction recherchee est : ’,NUM,’ / ’, PPCM)
fin
4
Voilà beaucoup de travail pour un tout petit problème. Cet algorithme n’est sans doute pas le meilleur. Essayez pour le
moment de comprendre qu’il fait bien ce qu’on lui demande, et comprenez que son écriture a été facilitée par l’approche
progressive de la difficulté. N’hésitez pas, éventuellement à l’avenir à essayer d’en concevoir un autre. Pour le reste, c’est en
concevant vous mêmes des algorithmes et en lisant et "décortiquant" d’autres algorithmes que vous progresserez
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !