Section VII Programmation modulaire Algorithmes et résolution de problèmes FGE
Contenu Introduction Modules –Simples Exemples Exercice Devoir #6
Introduction Un algorithme solutionnant un problème complexe est, conséquemment, complexe lui aussi Exemple –Devoir #5 : calcul de la moyenne pondérée cumulative –Le pseudo-code est long et présente une indentation prononcée À cause des structures imbriquées –L'organigramme se propage sur plusieurs pages
Introduction (suite) Solution (pseudo-code) \\ Lire le nombre de cours à traiter ÉCRIRE "Combien de cours?" LIRE NombreCours \\ Initialisation TotalHeures = 0 TotalNotes = 0 \\ Traiter chaque cours POUR NoCours = 1 JUSQU'À NombreCours FAIRE \\ Lire les données du cours ÉCRIRE "Note du cours #", NoCours LIRE Note ÉCRIRE "Nombre d'heures du cours #", NoCours LIRE Heures \\ Convertir la note alphabétique en valeur \\ numérique correspondante SI Note = "A+" OU Note = "a+" ALORS Valeur = 4 SINON SI Note = "A" OU Note = "a" ALORS Valeur = 4 SINON SI Note = "A-" OU Note = "a-" ALORS Valeur = 3.7 SINON SI Note = "B+" OU Note = "b+" ALORS Valeur = 3.3 SINON SI Note = "B" OU Note = "b" ALORS Valeur = 3 SINON SI Note = "B-" OU Note = "b-" ALORS Valeur = 2.7 SINON SI Note = "C+" OU Note = "c+" ALORS Valeur = 2.3 SINON SI Note = "C" OU Note = "c" ALORS Valeur = 2 SINON SI Note = "C-" OU Note = "c-" ALORS Valeur = 1.7 SINON SI Note = "D+" OU Note = "d+" ALORS Valeur = 1.3 SINON SI Note = "D" OU Note = "d" ALORS Valeur = 1 SINON SI Note = "D-" OU Note = "d-" ALORS Valeur = 1 SINON SI Note = "EC" OU Note = "ec" ALORS Valeur = 0 SINON ÉCRIRE "ERREUR: note invalide" Valeur = -1 FINSI \\ Si la note fut convertie, mettre à jour les \\ sommations SI Valeur >= 0 ALORS TotalNotes = TotalNotes + Valeur * Heures TotalHeures = TotalHeures + Heures FINSI FINPOUR \\ Calculer et afficher la MPC Moyenne = TotalNotes / TotalHeures ÉCRIRE "Moyenne pondérée cumulative = ", Moyenne
Introduction (suite) Cette complexité apparente peut être atténuée à l'aide d'une technique appelée la modularité –Consiste à diviser le problème en sous- problèmes –Solutionner chaque sous-problème individuellement Un algorithme pour chaque sous-problème –Faire appel à ces algorithmes pour solutionner le problème original
Introduction (suite) Définition de module –Algorithme solutionnant une partie du problème original Exemple –Algorithme convertissant une note alphabétique (avec ou sans signe) en valeur numérique \\ Module ConvertirNote LIRE Note SI Note = "A+" OU Note = "a+" ALORS Valeur = 4 SINON SI Note = "A" OU Note = "a" ALORS Valeur = 4 SINON SI Note = "A-" OU Note = "a-" ALORS Valeur = 3.7 SINON SI Note = "B+" OU Note = "b+" ALORS Valeur = 3.3 SINON SI Note = "B" OU Note = "b" ALORS Valeur = 3 SINON SI Note = "B-" OU Note = "b-" ALORS Valeur = 2.7 SINON SI Note = "C+" OU Note = "c+" ALORS Valeur = 2.3 SINON SI Note = "C" OU Note = "c" ALORS Valeur = 2 SINON SI Note = "C-" OU Note = "c-" ALORS Valeur = 1.7 SINON SI Note = "D+" OU Note = "d+" ALORS Valeur = 1.3 SINON SI Note = "D" OU Note = "d" ALORS Valeur = 1 SINON SI Note = "D-" OU Note = "d-" ALORS Valeur = 1 SINON SI Note = "EC" OU Note = "ec" ALORS Valeur = 0 SINON ÉCRIRE "ERREUR: note invalide" Valeur = -1 FINSI ÉCRIRE Valeur
Introduction (suite) Exemple (suite) –Le module principal peut faire appel au module ConvertirNote pour solutionner le problème \\ Lire le nombre de cours à traiter ÉCRIRE "Combien de cours?" LIRE NombreCours \\ Initialisation TotalHeures = 0 TotalNotes = 0 \\ Traiter chaque cours POUR NoCours = 1 JUSQU'À NombreCours FAIRE \\ Lire et convertir la note ÉCRIRE "Note du cours #", NoCours EXÉCUTER ConvertirNote ÉCRIRE "Nombre d'heures du cours #", NoCours LIRE Heures \\ Si la note fut convertie, mettre à jour les \\ sommations SI Valeur >= 0 ALORS TotalNotes = TotalNotes + Valeur * Heures TotalHeures = TotalHeures + Heures FINSI FINPOUR \\ Calculer et afficher la MPC Moyenne = TotalNotes / TotalHeures ÉCRIRE "Moyenne pondérée cumulative = ", Moyenne
Modules Un algorithme complexe peut être divisé en modules Structure générale d'un algorithme modulaire –Algorithme divisé en modules –Un module peut faire appel à d'autres modules –Le module principal est le chef d'orchestre Module principal Module AModule BModule C Module DModule E
Modules (suite) Le module principal –C'est le point de départ du flux d'exécution –C'est aussi à la fin du module principal que le flux d'exécution se termine –Dans l'organigramme, c'est le seul module ayant les symboles Début et Fin Début Fin......
Modules (suite) Le module principal (suite) –Pour distinguer le module principal des autres modules dans les pseudo-codes, on ajoute aussi les étiquettes Début et Fin à ce module \\ Module principal DÉBUT Compte = 0 TANTQUE Compte < 10 FAIRE EXÉCUTER TraiterEmployé Compte = Compte + 1 FINTANTQUE FIN
Modules (suite) Les modules auxiliaires –Ce sont les modules exploités directement ou indirectement par le module principal Module principal Module AModule BModule C Module DModule E Modules auxiliaires
Modules (suite) Les modules auxiliaires (suite) –Pour les distinguer du module principal, les modules auxiliaires commencent par Entrer : indique que le flux d'exécution entre dans le module et se terminent par Retourner : indique que le flux d'exécution retourne au module de provenance du flux Entrer Retourner \\ Module auxiliaire ENTRER. RETOURNER
Modules (suite) Appel d'un module –Consiste à transférer le flux d'exécution à un module auxiliaire –Organigramme: symbole d'appel de module Indique le transfert du flux d'exécution vers le module spécifié Nom_du_module
Modules (suite) Appel d'un module (suite) –Pseudo-code: l'opération EXÉCUTER indique le transfert du flux d'exécution vers le module auxiliaire spécifié \\ pseudo-code. EXÉCUTER Nom_du_module.
Modules (suite) Appel d'un module (suite) –Une fois l'exécution du module auxiliaire terminé, le flux d'exécution revient à l'opération suivant l'appel D'où le symbole (ou le mot-clé) RETOURNER à la fin du module auxiliaire \\ Module Module_A ENTRER ÉCRIRE "Module_A" RETOURNER \\ Module principal DÉBUT ÉCRIRE "Allo" EXÉCUTER Module_A ÉCRIRE "Bye" FIN
Modules (suite) Retour du flux d'exécution –Dans un module auxiliaire, on n'indique pas à quel module est retourné le flux d'exécution –Car le flux peut provenir de divers autres modules \\ Module Module_B ENTRER ÉCRIRE "Module_B" RETOURNER Module_A \\ Module Module_A ENTRER ÉCRIRE "Module_A" EXÉCUTER Module_B RETOURNER \\ Module Module_C ENTRER ÉCRIRE "Module_C" EXÉCUTER Module_B RETOURNER
Modules (suite) Un module auxiliaire peut avoir les caractéristiques suivantes –Il peut recevoir des valeurs en provenance du module appelant Ce sont des paramètres –Il peut retourner un résultat au module appelant C'est une valeur de retour –Les modules sans paramètres ni valeur de retour sont dits modules simples
Modules simples Module dans sa plus simple expression –Débute par DÉBUT (pour le module principal) ou ENTRER (pour les modules auxiliaires) –Terminé par FIN (pour le module principal) ou RETOURNER (pour les modules auxiliaires) Pour les modules auxiliaires –Appelés à l'aide du symbole (pour l'organigramme) ou de l'opération EXÉCUTER (pour le pseudo-code) –Accompagnés d'un commentaire pour identifier le nom du module auxiliaire
Modules simples (suite) Exemple Heures > 40? OuiNon Paie = Heures * Taux SupPaie = Taux * (Heures - 40) Paie = RegPaie + SupPaie Entrer Écrire Nom,Numéro, Paie Retourner RegPaie = Taux * 40 Lire Nom,Numéro, Heures,Taux Module TraiterEmployé Compte 10? Oui Non TraiterEmployé Compte = Compte + 1 Début Fin Compte = 1
Modules simples (suite) Exemple (suite) \\ Module principal DÉBUT Compte = 1 TANTQUE Compte 10 FAIRE EXÉCUTER TraiterEmployé Compte = Compte + 1 FINTANTQUE FIN \\ Module TraiterEmployé ENTRER LIRE Nom, Numéro, Heures Taux SI Heure > 40 ALORS RegPaie = Taux * 40 SupPaie = Taux * (Heures-40) Paie = RegPaie + SupPaie SINON Paie = Heures * Taux FINSI ÉCRIRE Nom, Numéro, Paie RETOURNER
Exercice Étant données les équations de conversion de températures suivantes : C = ( F – 32) * 5/9 F = C 9/ Écrivez un algorithme, composé de trois modules, pouvant convertir une température d'une échelle à l'autre, au choix de l'utilisateur –Un module auxiliaire affiche en C une température lue en F –Un module auxiliaire affiche en F une température lue en C –Un module principal affiche un menu demandant quelle type de conversion à effectuer, et appelle le module auxiliaire correspondant
Exercice (suite) Modules auxiliaires \\ Module CelÀFahr ENTRER ÉCRIRE "En Celsius?" LIRE Celsius TempFahr = (Celsius * 9/5) + 32 ÉCRIRE TempFahr, "Fahrenheit" RETOURNER Module CelÀFahr Entrer Retourner Écrire TempFahr TempFahr = (Celsius * 9/5) + 32 Écrire Celsius \\ Module FahrÀCel ENTRER ÉCRIRE "En Fahrenheit?" LIRE Fahr TempCel = (Fahr - 32) * 5/9 ÉCRIRE TempCel, "Celsius" RETOURNER Module FahrÀCel Entrer Retourner Écrire TempCel TempCel = (Fahr – 32) * 5/9 Écrire Fahr
Exercice (suite) Module principal \\ Module principal DÉBUT ÉCRIRE "1 – Celsius à Fahrenheit" ÉCRIRE "2 – Fahrenheit à Celsius" LIRE Code SI Code = 1 ALORS EXÉCUTER CelÀFahr SINON SI Code = 2 ALORS EXÉCUTER FahrÀCel FINSI FIN Oui Non Début Lire Code Fin CelÀFahr Écrire "1 – Celsius à Fahrenheit Code = 1? Écrire "2 – Fahrenheit à Celsius Oui Non CelÀFahr Code = 2?
Devoir #6 Énoncé du devoir disponible sur mon site WEB (~jlemoe) Calcul de taxe sur véhicule Vous devez soumettre –Un fichier LARP (la solution) –Un fichier Visio (l'organigramme) –Un fichier Word (page titre) À remettre avant le prochain cours (voir détails dans le devoir)