Section VII Programmation modulaire Algorithmes et résolution de problèmes 18279 FGE.
-
Upload
clement-gobert -
Category
Documents
-
view
136 -
download
0
Transcript of Section VII Programmation modulaire Algorithmes et résolution de problèmes 18279 FGE.
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
\\ InitialisationTotalHeures = 0TotalNotes = 0
\\ Traiter chaque coursPOUR 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 FINSIFINPOUR
\\ Calculer et afficher la MPCMoyenne = 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 ConvertirNoteLIRE NoteSI Note = "A+" OU Note = "a+" ALORS Valeur = 4SINON SI Note = "A" OU Note = "a" ALORS Valeur = 4SINON SI Note = "A-" OU Note = "a-" ALORS Valeur = 3.7SINON SI Note = "B+" OU Note = "b+" ALORS Valeur = 3.3SINON SI Note = "B" OU Note = "b" ALORS Valeur = 3SINON SI Note = "B-" OU Note = "b-" ALORS Valeur = 2.7SINON SI Note = "C+" OU Note = "c+" ALORS Valeur = 2.3SINON SI Note = "C" OU Note = "c" ALORS Valeur = 2SINON SI Note = "C-" OU Note = "c-" ALORS Valeur = 1.7SINON SI Note = "D+" OU Note = "d+" ALORS Valeur = 1.3SINON SI Note = "D" OU Note = "d" ALORS Valeur = 1SINON SI Note = "D-" OU Note = "d-" ALORS Valeur = 1SINON SI Note = "EC" OU Note = "ec" ALORS Valeur = 0SINON ÉCRIRE "ERREUR: note invalide" Valeur = -1FINSIÉ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
\\ InitialisationTotalHeures = 0TotalNotes = 0
\\ Traiter chaque coursPOUR 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 FINSIFINPOUR
\\ Calculer et afficher la MPCMoyenne = 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 A Module B Module C
Module D Module 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 principalDÉBUT Compte = 0 TANTQUE Compte < 10 FAIRE EXÉCUTER TraiterEmployé Compte = Compte + 1 FINTANTQUEFIN
Modules (suite)
• Les modules auxiliaires– Ce sont les modules exploités directement ou
indirectement par le module principal
Module principal
Module A Module B Module C
Module D Module 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 duflux
Entrer
Retourner
.
.
.
\\ Module auxiliaireENTRER . . .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_AENTRER ÉCRIRE "Module_A"RETOURNER
\\ Module principalDÉBUT ÉCRIRE "Allo" EXÉCUTER Module_A ÉCRIRE "Bye"FIN
12
3
45
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_BENTRER ÉCRIRE "Module_B"RETOURNER Module_A
\\ Module Module_AENTRER ÉCRIRE "Module_A" EXÉCUTER Module_BRETOURNER
\\ Module Module_CENTRER ÉCRIRE "Module_C" EXÉCUTER Module_BRETOURNER
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
ModuleTraiterEmployé
Compte 10?
Oui
Non
TraiterEmployé
Compte = Compte + 1
Début
Fin
Compte = 1
Modules simples (suite)
• Exemple (suite)
\\ Module principalDÉBUT Compte = 1 TANTQUE Compte 10 FAIRE EXÉCUTER TraiterEmployé Compte = Compte + 1 FINTANTQUEFIN
\\ 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, PaieRETOURNER
Exercice
• Étant données les équations de conversion de températures suivantes :
C = (F – 32) * 5/9F = C 9/5 + 32
• É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ÀFahrENTRER ÉCRIRE "En Celsius?" LIRE Celsius TempFahr = (Celsius * 9/5) + 32 ÉCRIRE TempFahr, "Fahrenheit"RETOURNER
Module CelÀFahrEntrer
Retourner
Écrire TempFahr
TempFahr = (Celsius * 9/5) + 32
Écrire Celsius
\\ Module FahrÀCelENTRER É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 principalDÉ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 FINSIFIN
Oui
Non
Début
Lire Code
Fin
CelÀFahr
Écrire "1 – Celsius à Fahrenheit
Code = 1?
Écrire "2 – Fahrenheit à Celsius
Oui
NonCelÀFahr
Code = 2?