Exercice 3 - Campus des Sciences et Techniques d`Avignon

publicité
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.
14
7
1/ Comprendre du problème posé : un simple exemple permet de fixer les choses : à partir des fractions
et
75
330
343
l’algorithme doit effectuer la somme et répondre
.
1650
2/ "comment le ferais-je à la main ?" conservons l’exemple précédent : et posons la question comment arriverais-je au
14
7
343
résultat
+
=
.
75 330
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
7
14 × 22 + 7 × 5
343
+
=
=
75 330
1650
1650
a c
3/ Difficulté progressive : voici un premier raffinage pour calculer : +
b d
Déterminer de Plus Petit Commun Multiple P P CM de b et d.
Calculer nb tel que b × nb = P P CM
Calculer nd tel que d × nd = P P CM
a c
a × nb + c × nd
+ =
b 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 9 DIV 2 = 4 on pourrait faire le raffinage suivant :
Déterminer de Plus Petit Commun Multiple P P CM de b et d.
nb ←− P P CM DIV b
nd ←− P P CM DIV d
a c
a × nb + c × nd
+ ←−
b d
P P CM
Cet algorithme, s’écrit alors :
Variable a, b, c, d, P P CM, nb, nd, N UM, DEN O : entier
Début
Entrer b et d
Déterminer de Plus Petit Commun Multiple P P CM de b et d.
nb ← P P CM DIV b
nd ← P P CM DIV d
N UM ← a × nb + c × nd
DEN O ← 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
de chacun des nombres :
330
75 3
165
25 5
donc 75 = 3 × 52 et 55
5
5
11
1
1
et 75 ? La technique habituelle est de déterminer la décomposition en facteurs premiers
2
3
5 donc 330 = 2 × 3 × 5 × 11
11
Le PPCM est alors 2 × 3 × 52 × 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
75
25
5
1
3
5
5
P P CM = 1
P P CM = 1 × 3 × 2
P P CM = 1 × 3 × 2 × 5
P P CM = 1 × 3 × 2 × 5 × 5
P P CM = 1 × 3 × 2 × 5 × 5 × 11
Terminé
d
330
165
55
11
1
2
3
5
11
Quel algorithme décrit-il ce procédé ?
On teste tous les entiers de 2 jusqu’au plus grand des deux nombres (qu’il faut donc calculer) pour savoir s’il divise ou non.
On a pour cela une instruction M OD qui donne le reste de la division euclidienne, ainsi 10 MOD 4 vaut 2.
Ainsi, i divise un nombre b si b MOD i = 0.
On peut alors écrire :
// Recherche du Max des deux nombres
PPCM←−1
i ←− 2
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 i suivant, c’est à dire i ←− i + 1
sinon recommencer avec le même i sur les nombres réduits
jusqu’à i = max
2
Il reste à déterminer le MAX de b et d :
si b < d
alors M AX ←− d
sinon MAX ←− b
D’où le raffinage final du PPCM de b et d :
// Recherche du MAX de b et d
si b < d
alors MAX ←− d
sinon M AX ←− b
// Détermination du PPCM
P P CM ←− 1
i ←− 2
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
b ←− b 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
d ←− d 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 b et d
si b < d
alors MAX ←− d
sinon M AX ←− b
// Détermination du PPCM
P P CM ←− 1
i ←− 2
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
b ←− b 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
d ←− d div i
Fin
si diviseur = faux alors i ←− i + 1
jusqu’à i = max
// Calcul de la fraction résultat utilisant les valeurs initiales de b et d
nb ← M DIV b_init
nd ← M DIV d_init
N UM ← a × nb + c × nd
// 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
Téléchargement