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