Chapitre 4: La Modularité PDF
Document Details
Uploaded by Deleted User
ALSDS_SiTayeb/Balla
Tags
Summary
This document provides an overview of modularity in programming, emphasizing the benefits of breaking down complex problems into smaller, more manageable modules. It outlines the foundational concepts, methodologies, and the structure of modules, highlighting how modular design improves code readability and maintainability.
Full Transcript
Chapitre 4: La Modularité Sommaire Titre N°Slide Titre N°Slide 4.5 LE PASSAGE DES PARAMÈTRES...
Chapitre 4: La Modularité Sommaire Titre N°Slide Titre N°Slide 4.5 LE PASSAGE DES PARAMÈTRES 54 4.1 CONCEPTS FONDAMENTAUX DE LA 2 MODULARITÉ 4.6 EXEMPLE DE DECOUPAGE MODULAIRE 58 4.2 DEMARCHE MODULAIRE ET 18 FORMALISME 4.7 LES FONCTIONS ETPROCEDURES 75 4.3 LES FONCTIONS UTILISATEURS 31 STANDARDS 4.3.1 STRUCTURE D’UNE FONCTION 32 4. 8 OBJETS LOCAUX ET OBJETS GLOBAUX 79 4.3.2 APPEL D’UNE FONCTION. 35 4.9 LES EFFETS DE BORD 83 4.3.3 DECLARATION D’UNE FONCTION. 36 4.10 MODULES INTERNES ET MODULES 4.4 LES PROCÉDURES UTILISATEURS 44 85 EXTERNES 4.4.1 STRUCTURE D’UNE PROCEDURE 45 4.11 COMMENT CATALOGUER UN MODULE ? 86 4.4.2 APPEL D’UNE PROCEDURE 48 4.12 LE CONCEPT DE BIBLIOTHEQUE 96 (Application : Exemple en Pascal) 4.4.3 DECLARATION D’UNE PROCEDURE 49 4.13 INTRODUCTION À LA RÉCURSIVITÉ 107 ALSDS_SiTayeb/Balla 1 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ « Diviser pou régner » Problème simple il n'y a pas de difficulté particulière à construire l'algorithme. Problème complexe une approche très méthodique est indispensable sinon risque d’aboutir à des coûts de développement très onéreux. ALSDS_SiTayeb/Balla 2 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Dans un programme, on peut parfois constater qu'une même suite d'actions revient plusieurs fois. Il est alors judicieux de n'écrire cette suite qu'une seule fois, et de l'utiliser autant de fois que nécessaire D'autre part, on peut observer que certains groupes d'actions se rapportent à des traitements différents. Il est alors souhaitable de représenter chacun d'eux de manière séparée dans un sous-programme, ce qui permet d'améliorer la compréhension et la lisibilité du programme (de l'algorithme). On perçoit alors un programme comme un programme principal et un ensemble de sous-programmes (modules). ALSDS_SiTayeb/Balla 3 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ La modularité qui est la base de la programmation structurée répond à 2 objectifs fondamentaux : 1. Transformer un problème, parfois extrêmement complexe, en « n » problèmes simples que l'on résoudra séparément 2. Trouver la solution d'un problème une seule fois, car dès qu'un module, qui effectue un travail bien particulier, est construit, testé et enregistré on pourra le réutiliser. ALSDS_SiTayeb/Balla 4 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Ainsi, les modules sont utilisés pour deux raisons essentielles : quand un même traitement doit être réalisé plusieurs fois dans un programme (ou qu'il est utilisé dans plusieurs programmes) : on écrit un sous-programme (module) pour ce traitement et on l'appelle à chaque endroit où l'on en a besoin. pour organiser le code, améliorer la conception et la lisibilité des gros programmes. En effet, le découpage en sous-programmes permet de traiter séparément les difficultés. Il existe des sous-programmes standards ou prédéfinis et des sous- programmes que le programmeur doit construire appelé sous-programmes utilisateurs ALSDS_SiTayeb/Balla 5 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ En résumé, afin de gagner du temps et d’écrire des algorithmes plus courts et plus structurés on regroupe un ou plusieurs blocs, qui réalisent un travail bien précis, dans un MODULE, auquel on donne un NOM et que l’on peut ensuite « appeler » chaque fois qu’on le désire, en faisant seulement référence à son nom et sans avoir, bien entendu, à le reconstruire. La modularité présente des avantages qui font qu’il est donc intéressant même recommandé d’avoir recours à la modularité systématiquement dans la construction de nos solutions. ALSDS_SiTayeb/Balla 6 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ La conception des algorithmes se fait de façon naturelle grâce à la démarche descendante, par affinage progressif. 1. On découpe d’abord notre problème en modules logiquement cohérents, 2. Ensuite on construit séparément chacun des modules, qu’ils soient appelés (ce module est appelé par un autre module) ou appelants (ce module appelle d’autres modules), de même que l’algorithme principal, comme si c’étaient des problèmes indépendants les uns des autres (on a vu plus haut qu’ils peuvent même être confiés à des développeurs différents). ALSDS_SiTayeb/Balla 7 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Cette démarche permet de simplifier l’étape de conception. Chaque module sera construit selon la démarche préconisée auparavant (analyse, algorithme, déroulement, programmation et mise au point). ALSDS_SiTayeb/Balla 8 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Pour utiliser un module, nous n’avons plus à savoir comment il est construit mais seulement ce qu’il fait Le rôle que vous attribuerez à chaque module est très important , car si ce dernier est mal défini, ambiguë ou incomplet votre module sera totalement inutilisable donc INUTILE ALSDS_SiTayeb/Balla 9 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Le découpage va nous contraindre à mettre en relief les grandes idées sur la manière d’appréhender le problème et à les structurer. Puis chaque idée sera à son tour découpée en « sous-idées », il ne nous restera qu’à agencer l’ensemble qui constituera la solution de notre problème. Concrètement, chaque idée ou sous-idées donnera lieu à un module, et leur agencement constituera d’autres modules et notre algorithme principal. ALSDS_SiTayeb/Balla 10 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Le développeur gagne du temps dans la conception, car: Il peut construire progressivement une bibliothèque des modules. Ensuite, pour les utiliser, il suffit de déclarer cette bibliothèque. Plusieurs développeurs peuvent travailler en parallèle et dans des endroits géographiquement différents, ce qui est pratiquement impossible sans la modularité. ALSDS_SiTayeb/Balla 11 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Avantages : Meilleure lisibilité. Diminution du risque d’erreurs Possibilité de tests sélectifs Réutilisation de modules existants Simplicité de modification Favorisation du travail en équipe … ALSDS_SiTayeb/Balla 12 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ De plus, cette démarche nous fera gagner du temps et au fur et à mesure que nous enrichissons notre bibliothèque de modules, on pourra utiliser dans de nouveaux problèmes des modules que l’on a réalisés pour d’autres problèmes et qui se trouvent dans notre bibliothèque de modules, sans avoir à les reconstruire à nouveau. Nous gagnerons donc en efficacité et par la même en temps et donc en argent. ALSDS_SiTayeb/Balla 13 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ ALGORITHME ALGO-1 ALGORITHME ALGO-1 Déclarations MODULE A Déclarations Modules A, B, C DEBUT MODULE B DEBUT Bloc A Appel Module A MODULE C Bloc B Appel Module B Bloc C Appel Module C Bloc A Appel Module A Bloc B Appel Module B Bloc A Appel Module A FIN FIN ALSDS_SiTayeb/Balla 14 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Module A Variables... ALGORITHME Exemple DEBUT Variables … - Quand l’appel à un module est Module A - DEBUT - rencontré, l’exécution du - FIN module appelant est suspendu - jusqu’à ce que le module appelé -- Appel Module A soit totalement exécuté, puis - l’exécution du module appelant - repart immédiatement après - FIN l’appel Appel d'un module ALSDS_SiTayeb/Balla 15 Chapitre 4: La modularité 4.1. CONCEPTS FONDAMENTAUX DE LA MODULARITÉ Un module est considéré comme étant une boite noire exécutant une tâche Type du module donnée. Sur le plan syntaxique un module a le même schéma qu’un (0, N) entrées (0 ,N)sorties Nom du algorithme. Il est défini par : son nom, module son rôle, son type et ses interfaces c- a-d les données qu’il reçoit en entrée et Rôle du module les données qu’il retourne à celui qui l’a appelé ALSDS_SiTayeb/Balla 16 Chapitre 4: La modularité Interface L’interface est constituée des entrées / sorties du module, c’est elle qui permet d’établir le lien entre le module et son environnement, formé des autres modules du logiciel à construire. Fonction N : Entier : Entier NBCH Fonction NBCH (N: Entier ) : Entier Rôle : Donne le nb de chiffres de N Variable i : Entier DEBUT // Appel de la fonction Algorithme Exepmle1 NC 0 Variables N, NP : entier //NP : nombre de positions de N Tant Que N DIV 10 0 Faire Fonction NBCH (N:entier):entier DTQ ….. Corps de la fonction NBCH NC NC + 1 Debut N N DIV 10 Lire (N) NP NBCH (N) FTQ Ecrire (Le nombre de position est de : ‘, NP) NBCH i Fin FIN ALSDS_SiTayeb/Balla 17 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME COMMENT PROCEDER ? 1ère ETAPE : COMPREHENSION DU PROBLEME POSE 2ième ETAPE : ANALYSE DU PROBLEME - CONCEPTION a) Découper le problème. b) Construire les modules 3ième ETAPE : REALISATION ALSDS_SiTayeb/Balla 18 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Découper le problème. Faire ressortir les modules à construire. Il y des modules qui sont évidents et que l’on peut détecter rapidement et des modules secondaires qui ne sont pas apparents au premier abord. Ne perdez pas votre temps, ni votre énergie, à vouloir à tout prix recenser tous les modules nécessaires. Commencez par les modules apparents et enrichissez votre découpage au fur et à mesure que d’autres modules vous paraissent utiles. Le découpage est parfois implicite, c'est-à-dire qu’une simple lecture attentive du sujet vous aidera à recenser les modules à construire mais, dans d'autres cas, cela nécessitera un effort d'analyse et de créativité. ALSDS_SiTayeb/Balla 19 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Découper le problème (suite). Le découpage est parfois implicite, c'est-à-dire qu’une simple lecture attentive du sujet vous aidera à recenser les modules à construire mais, dans d'autres cas, cela nécessitera un effort d'analyse et de créativité. Aussi, n’oubliez pas de justifier votre découpage. Vous pouvez, à la limite, vous passer de cela si votre découpage est tellement évident qu’il ne nécessite aucun commentaire, sinon il faut l’accompagner des explications nécessaires qui permettront au lecteur de comprendre votre approche pour résoudre le problème. ALSDS_SiTayeb/Balla 20 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Pour chaque module : 1. Dessiner le module 2. Définir son interface ( noms et types des paramètres formels ainsi que leur mode de passage) 3. Lui donner un nom. Prenez un nom explicite, qui permettra par sa simple lecture de savoir ce qu’il fait. 4. Préciser sa nature (procédure ou fonction) 5. Préciser ce qu'il fait (le QUOI ?). Le rôle du module a une importance fondamentale, car si ce dernier est vague, ambiguë ou incomplet, le module ne sera d’aucune utilité. ALSDS_SiTayeb/Balla 21 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Construire les modules On prend un à un les modules ( et l’algorithme principal) de notre découpage, et on procède à son : Analyse Algorithme Déroulement ( importance du jeu d’essai) Vous noterez que ces étapes sont pratiquement les mêmes que celles de nos premiers exercices. ALSDS_SiTayeb/Balla 22 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Réalisation Traduire les algorithmes dans un langage donné Programmer et Tester SEPAREMENT les modules et les mettre sous forme de modules externes (et de bibliothèque(s)) Programmer et Tester le programme principal ALSDS_SiTayeb/Balla 23 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Remarque : Au niveau de la conception il n’y a aucun ordre de construction des modules et de l’algorithme principal. Par contre au niveau de la réalisation nous sommes obligés de respecter un certain ordre de réalisation (on commencera par les modules qui n’appellent aucun autre module et on remonte ) ALSDS_SiTayeb/Balla 24 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Qualité d’un module La réutilisation ultérieure. Penser toujours à généraliser au maximum vos modules. L'indépendance. Pour cela, il faut éviter, sauf obligation, de mettre des lectures ou des écritures dans un module et d'utiliser des variables globales dans un module (c'est le meilleur moyen d'éviter les effets de bord). La simplicité. Un module doit remplir UNE tâche précise. (Importance du rôle) ALSDS_SiTayeb/Balla 25 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Remarque : Il est possible que lorsque l’on va construire un module, on détecte d’autre modules qui vont servir à sa construction. Donc tout au long de notre analyse, on gardera en esprit l’approche modulaire. ALSDS_SiTayeb/Balla 26 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Lorsque le module n'a qu'une sortie et de plus c'est une donnée élémentaire il est dénommé FONCTION, dans le cas contraire c'est une PROCEDURE (c'est à dire 0 à n sorties de n'importe quel type). FONCTION 0 ou N entrées Nom du 1 sortie ( Donnée élémentaire) module Rôle du module ALSDS_SiTayeb/Balla 27 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME Lorsque le module n'a qu'une sortie et de plus c'est une donnée élémentaire il est dénommé FONCTION, dans le cas contraire c'est une PROCEDURE (c'est à dire 0 à n sorties de n'importe quel type). PROCEDURE 0 ou N entrées Nom du O ou N sorties module Rôle du module ALSDS_SiTayeb/Balla 28 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME FONCTION FONCTION A : Entier N : Entier : Entier : Entier PPCM FIBO B : Entier Rôle : Donne le PPCM de A et B Rôle : Donne le Nième élément de la suite de Fibonacci EXEMPLES FONCTION FONCTION N : Entier N : Entier : Entier : Booléen FACTO PREM Rôle : Calcule la factorielle de l’entier N Rôle : Vérifie si l’entier N est premier ou non ALSDS_SiTayeb/Balla 29 Chapitre 4: La modularité 4.2. DEMARCHE MODULAIRE ET FORMALISME EXEMPLES PROCEDURE A, B, C : Réel X1, X2 : Réel EQU2D N: Entier Rôle : Donne le nombre de solutions ainsi que les racines X1 et X2 d’une équation du second degré de coefficients A,B,C ALSDS_SiTayeb/Balla 30 Chapitre 4: La modularité 4.3. LES FONCTIONS UTILISATEURS Une fonction est un module (sous-programme) qui fournit un résultat unique (donnée élémentaire) à partir de 0 à n paramètres d'entrées. La fonction est définie dans un TYPE FONCTION 0 ou N entrées Nom du 1 sortie ( Donnée élémentaire) module Rôle du module ALSDS_SiTayeb/Balla 31 Chapitre 4: La modularité 4.3.1 STRUCTURE D’UNE FONCTION Entête de la FONCTION Nom_de_fonction (paramètres formels d’entrée) : Type du résultat fonction Déclarations Partie déclarations DEBUT - Corps de - la fonction - Nom_de_fonction résultat de la fonction FIN ALSDS_SiTayeb/Balla 32 Chapitre 4: La modularité 4.3.1 STRUCTURE D’UNE FONCTION STRUCTURE D’UNE FONCTION EN PASCAL En-tête de fonction Liste de Identificateur Function Identificateur : paramètres de Type Liste de paramètres ; Var ( Identificateur : Identificateur ) de Type APPEL D’UNE FONCTION , L’appel d’une fonction se fait en citant son nom suivi de la liste des paramètres réels dans une expression ALSDS_SiTayeb/Balla 33 Chapitre 4: La modularité 4.3.1 STRUCTURE D’UNE FONCTION Le corps de la fonction peut contenir toutes les déclarations et structures algorithmiques. Le résultat doit toujours être transmis dans le nom de la fonction et cette affectation est généralement la dernière action de la fonction. La liste des paramètres formels décrit les objets fournis à la fonction ainsi que leurs types et leur mode de passage (cette notion est étudiée ci après). ALSDS_SiTayeb/Balla 34 Chapitre 4: La modularité 4.3.2 APPEL D’UNE FONCTION L’appel d’une fonction se fait en référençant son nom à droite du symbole d’affectation, dans une condition ou dans un appel de procédure ou de fonction. ALGORITHME explePREM EXEMPLE Variables N : Entier Res : Boolean Fonction PREM (N : Entier) : Boolean Fonction PREM (N:entier): Boolean …. Corps de la fonction … Variable i : Entier; DEBUT Debut //PREM Lire(N) i2 Res PREM(N) //Appel de la fonction PREM (Résultat c’est vrai ou faux) TANT QUE (N MOD i 0) ET (I N DIV 2)) premier’) Fin //PREM FIN ALSDS_SiTayeb/Balla 35 Chapitre 4: La modularité EXEMPLE 4.3.2 APPEL D’UNE FONCTION Program explePREM; Begin //principal Uses Wincrt; Repeat Var N : Integer; Write('Donner N>0: '); Res : Boolean; Readln(N); //------------------------------------ Res := PREM(N); //Appel PREM (Res vrai ou faux) Function PREM (N:Integer): Boolean; //Role : teste si un nombre est premier ou non If (Res) Then Writeln(N, ' est premier') Var Else Writeln(N, ' n''est pas premier'); i : Integer; writeln; Begin //PREM Until Readkey=Chr(27); i := 2; While (N Mod i 0) And (I N Div 2)); Readln; End; //PREM End. //Fin Pgm //------------------------------------ ALSDS_SiTayeb/Balla 36 Chapitre 4: La modularité 4.3.3 DECLARATION D’UNE FONCTION Au moment de l’appel d’une fonction : 1. Les paramètres formels (ou muets) de la fonction prennent les valeurs des paramètres effectifs ( ou actuels) du module appelant, 2. Le traitement du module est effectué 3. et ensuite le résultat qui se trouve dans le nom de la fonction est mis dans un objet ou écrit ou il devient un argument d’une autre fonction ou d’une procédure comme nous l’avons vu plus haut. Pour cela : ALSDS_SiTayeb/Balla 37 Chapitre 4: La modularité 4.3.3 DECLARATION D’UNE FONCTION a) Tous les paramètres d’entrée doivent être alors effectifs au moment de l’appel. C'est-à-dire qu’ils contiennent une valeur, sinon c’est illogique car que va faire un module si on lui fournit n’importe quoi ? b) De plus l’ordre, le nombre et le type des paramètres doivent être identiques et compatibles. C’est aussi évident car chaque paramètre effectif (actuel) va être mis dans le paramètre formel (muet) correspondant et ils doivent avoir le même type. ALSDS_SiTayeb/Balla 38 Chapitre 4: La modularité 4.3.3 DECLARATION D’UNE FONCTION Type du résultat = Déclarations d’entêtes de fonctions type de la fonction FONCTION PPCM (A,B : ENTIER) : ENTIER FONCTION FIBO (N : ENTIER) : ENTIER FONCTION PREMIER (N : ENTIER) : BOOLEEN FONCTION FACTO (X : ENTIER) : ENTIER Paramètres Appel de fonctions formels Ecrire (‘Le PPCM de ‘,i,’ ‘,j ,’ est : ’,PPCM(i , j)) Paramètres réels Ecrire (‘Le ‘ ,n,’ ième terme de la suite est : ’,FIBO(N)) SI PREMIER (I*J +25) ALORS … Appel de la fonction ALSDS_SiTayeb/Balla 39 Chapitre 4: La modularité 4.3.3 DECLARATION D’UNE FONCTION ATTENTION Le nombre de paramètres réels doit être égal à celui des paramètres formels. L’ordre des paramètres réels doit être celui des paramètres formels Il doit y avoir compatibilité de types entre les paramètres formels et réels FONCTION PPCM (A, B : ENTIER) : ENTIER Lire (i, j) // i et j et Res doivent être de type ENTIER Res PPCM (i, j) Ecrire (‘Le PPCM de : ’, i, ‘ ’, j , ‘ est : ’, Res) ALSDS_SiTayeb/Balla 40 Chapitre 4: La modularité Exemple 1 Calcul de la factorielle d'un nombre. FONCTION ANALYSE : Entier : Entier N! = 1*2*3*4*…..*(N-2)* (N-1)*N FACTO N! = N*(N-1)! Rôle : Calcule la factorielle de l’entier N ALGORITHME expleFacto FONCTION FACTO (N: entier) : Entier variable N , Res: entier Variables F, i : entier (* Var locales*) Fonction FACTO… DEBUT …. F 1 DEBUT POUR i ALLANT de 2 A N FAIRE Lire(N) F F*i Res FACTO (N) FACTO F (*Retour du résultat*) Ecrire (Res) FIN FIN ALSDS_SiTayeb/Balla 41 Chapitre 4: La modularité Exemple2 Calcul du nombre d’arrangements de 2 nombres pris p à p donné par la formule suivante : Solution : FONCTION n : Entier : Entier p : Entier ARRANGE Rôle : Donne le nombre d’arrangements de n objets pris p à p ALSDS_SiTayeb/Balla 42 Chapitre 4: La modularité Exemple 2 (suite) ANALYSE Arrange = facto (n) div facto (n-p) Algorithme Arrange = facto (n) div facto (n-p) FONCTION ARRANGE (n, p : entier) : Entier Fonction Facto …. DEBUT ARRANGE (Facto(n) Div Facto(n – p)) FIN ALSDS_SiTayeb/Balla 43 Chapitre 4: La modularité Exemple 2 (suite) ALGORITHME FONCTION 8 8 ARRANGE (X,Y) X n ARRANGE 56 2 2 Y p ARRANGE (X,Y) ALSDS_SiTayeb/Balla 44 Chapitre 4: La modularité 4.4. LES PROCEDURES UTILISATEURS Une procédure est un module (sous-programme) qui fournit 0 à N résultat à partir de 0 à N paramètres d'entrées. PROCEDURE 0 ou N entrées Nom du 0 ou N Sorties procédure Rôle de la procédure ALSDS_SiTayeb/Balla 45 Chapitre 4: La modularité 4.4.1 STRUCTURE D’UNE PROCEDURE Entête de la PROCEDURE Nom_de_Procédure (paramètres formels d’Entrées/Sorties) procédure Déclarations Partie déclarations DEBUT - - Corps de la procédure - - FIN ALSDS_SiTayeb/Balla 46 Chapitre 4: La modularité 4.4.1 STRUCTURE D’UNE PROCEDURE (suite) Le corps de la procédure peut contenir toutes les déclarations et structures algorithmiques. La liste des paramètres formels décrit les paramètres d’entrée et de sortie ainsi que leurs types et leur mode de passage. Le passage des paramètres est identique à celui des fonctions mais TOUS les paramètres de sortie doivent être définis avec un passage par variable. ALSDS_SiTayeb/Balla 47 Chapitre 4: La modularité 4.4.1 STRUCTURE D’UNE PROCEDURE (suite) STRUCTURE D’UNE PROCEDURE EN PASCAL En-tête de Procédure Procedure Liste de Identificateur paramètres Liste de paramètres ; Var ( Identificateur : Identificateur ) de Type , ALSDS_SiTayeb/Balla 48 Chapitre 4: La modularité 4.4.2 APPEL D’UNE PROCEDURE L’appel d’une procédure se fait en citant son nom suivi de la liste des paramètres réels comme une instruction L’appel d’une procédure est en fait une action primitive, il est composé du nom de la procédure suivi entre parenthèse de la liste des paramètres effectifs d’entrée et de sortiee1 séparés par des virgules. Comme pour les fonctions le nombre, l’ordre et le type des paramètres effectifs doivent être identiques à ceux des paramètres formels. Exemple : EQU2D (e, f, g, Nr, S1, S2) ALSDS_SiTayeb/Balla 49 Chapitre 4: La modularité 4.4.3 DECLARATION D’UNE PROCEDURE (exemple) Ecrire un algorithme qui permet de résoudre une équation du second degré dont les coefficients A , B , C sont lus au clavier. PROCEDURE Var X1, X2 : Réel A , B, C : Réel EQU2D Var Ns : Entier Rôle : Donne le nombre de solutions (Ns) ainsi que les racines X1 et X2 d’une équation du second degré de coefficients A, B, C ALSDS_SiTayeb/Balla 50 Chapitre 4: La modularité Exemple Analyse Calcul de Delta = B*B – 4*A*C SI (Delta < 0) Alors Ns 0 SINON SI (Delta = 0) alors DSI Ns 1 X1 - B / (2*A) X2 X1 FSI SINON DSIN Ns 2 X1 (- B - SQRT (Delta))/ (2*A) X2 (- B + SQRT (Delta))/ (2*A) FSIN ALSDS_SiTayeb/Balla 51 Chapitre 4: La modularité Exemple PROCEDURE EQU2D (A, B, C : réel; Var Ns: entier; Var XI, X2: réel) Variable Delta : réel DEBUT Delta SQR (B) - 4*A*C SI (Delta >0) ALORS SINON DSI DSIN Xl (- B - SQRT (Delta))/ (2*A) SI (Delta = 0) ALORS X2 (- B + SQRT (Delta))/ (2*A) DSI Ns 2 X1 - B/(2*A) FSI X2 X1 Ns 1 FSI SINON Ns 0 FIN FSIN ALSDS_SiTayeb/Balla 52 Chapitre 4: La modularité ALGORITHME exempleProc Variables e, f, g, S1, S2 : réel Nr : entier //Déclaration de la procédure Procedure EQU2D(A, B, C : réel; Var Ns: entier; Var XI, X2: réel) …. Corps de la procedure …. DEBUT //Programme principal Ecrire (' Donner les paramètres A, B et C : ‘) Lire (e, f, g) EQU2D (e, f, g, Nr, S1, S2) Selon Nr 0 : Ecrire ('Pas de solutions’ ) 1 : Ecrire ('Une racine double X1 = X2 = ', S1) 2 : Ecrire ('Deux racines distinctes, X1 =', S1,' et X2 =’,S2) FinSelon FIN //Fin du programme ALSDS_SiTayeb/Balla 53 Chapitre 4: La modularité EXEMPLE ALGORITHME PROCEDURE -1.0 2.0 3.0 -1.0 2.0 3.0 e f g A B C 16.0 delta 3.0 - 1.0 2 S1 S2 Ns X1 X2 Nr ALSDS_SiTayeb/Balla 54 Chapitre 4: La modularité 4.5. LES PASSAGES DES PARAMETRES Le passage des paramètres est aussi un concept qu’il faut maîtriser sinon on risque de perdre le contrôle du fonctionnement des modules surtout au niveau du déroulement de nos algorithmes. Il existe deux modes de passage des paramètres : Le mode de passage par valeur Le mode de passage par référence ou par variable ALSDS_SiTayeb/Balla 55 Chapitre 4: La modularité 4.5. LES PASSAGES DES PARAMETRES Lorsqu’un paramètre est fourni à un module et que l’on souhaite que le module nous restitue la même valeur que le paramètre avait à l’entrée, on effectuera un passage par valeur des paramètres. Mais lorsqu’un paramètre est modifié lors de l’exécution d’un module et c’est le contenu modifié du paramètre que l’on souhaite avoir à la sortie du module, on effectuera un passage par variable (ou par référence). Dans ce cas le paramètre formel doit être précédé du mot VAR. ALSDS_SiTayeb/Balla 56 Chapitre 4: La modularité 4.5. LES PASSAGES DES PARAMETRES (Suite) De façon générale : Il faut utiliser : un passage par variable pour TOUS les paramètres de sortie d’un module de type procédure. Un passage par valeur pour les paramètres d’entrée d’une fonction ALSDS_SiTayeb/Balla 57 Chapitre 4: La modularité 4.5. LES PASSAGES DES PARAMETRES : Exemples Déclaration d’entête de procédure PROCEDURE EQU2D (A, B, C : REEL ; VAR Ns : ENTIER ; VAR X1, X2 : REEL) L’absence de VAR indique que le mode de passage des paramètres est un mode par valeur VAR indique que Appel de Procédure le mode de passage Paramètres formels EQU2D (i , j ,k , Nr , r1 , r2) (6 paramètres) des paramètres est un mode par EQU2D (-2.0, 3.0 ,1 , Nr , r1 , r2) variable Paramètres réels Appel de la procédure (6 paramètres) ALSDS_SiTayeb/Balla 58 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE Soit la suite : 1, 11, 21, 1112, 3112, …….. Quel est l’élément suivant ? Vous l’avez trouvé ! Alors construisez l’analyse qui nous permet d’obtenir un élément à partir du précédent. Justification : On observe qu’un élément est déduit du précédent, c’est le nombre de 1 suivi de 1, puis le nombre de 2 suivi de 2,… 1, 11, 21, 1112, 3112 qui sont concaténés au fur et à mesure. ALSDS_SiTayeb/Balla 59 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ANALYSE SOIT N UN ENTIER REPRESENTANT UN ELEMENT DE LA SUITE POUR CHAQUE CHIFFRE C (DE 1 A 9) COMPTER LE NOMBRE DE FOIS (NB) QUE LE CHIFFRE C APPARAIT DANS N COMPOSER LE NOMBRE N2 RECHERCHE AFFICHER N2 On aura besoin : ALSDS_SiTayeb/Balla 60 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ANALYSE (suite) D’un module qui va nous donner le nombre d’apparitions d’un chiffre donné dans un nombre FREQCH D’un module qui qui concatène 2 nombres CONCAT ALSDS_SiTayeb/Balla 61 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ALGORITHME SUITE VAR N, C, N2, N3, Nb : ENTIER FONCTION FREQCH ( N , C : ENTIER ) : ENTIER DPOUR … //Corps de la fonction Nb FREQCH (N,C) FONCTION CONCAT ( A , B : ENTIER ) : ENTIER SI (Nb 0) ALORS … //Corps de la fonction DSI DEBUT N3 CONCAT (Nb, C) LIRE (N) N2 CONCAT ( N2 , N3) N2 0 FSI POUR C ALLANT DE 1 A 9 FAIRE FPOUR ECRIRE (N2) N N2 FIN ALSDS_SiTayeb/Balla 62 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) Fonction N, C : Entier : Entier FREQCH Rôle : Fournit le nombre de fois que le chiffre C apparaît dans N ANALYSE : On décompose N chiffre par chiffre jusqu’à obtenir un quotient nul Pour chaque chiffre obtenu (N Mod 10) s’il est égal à C on le compte ALSDS_SiTayeb/Balla 63 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) FONCTION FREQCH (N, C : ENTIER) : ENTIER VAR Cpt, NP, i : Entier DEBUT Cpt 0 NP NBCH (N) POUR i Allant de 1 à NP Faire DPOUR SI (N Mod 10 = C) ALORS Cpt Cpt + 1 N N Div 10 FPOUR FREQCH Cpt FIN ALGORITHME FREQCH ALSDS_SiTayeb/Balla 64 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) Fonction A, B : Entier : Entier CONCAT Rôle : Concatène l’entier A à l’entier B ALSDS_SiTayeb/Balla 65 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ANALYSE : Lorsque l’on veut concaténer N1=123 et N2 = 4567, il suffit de rajouter 4 zéros à N1 et de rajouter N2 avec (4 = Np = nombre de positions de N2) Résultat = N1 * 10Np + N2 =N1*N3 + N2 : avec N3 = 10Np Soit : 1230000 D’après l’analyse nous constatons qu’il faut + 4567 construire 3 modules suivants : ------------- Concat, NbCh et Puissance = 1234567 ALSDS_SiTayeb/Balla 66 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) FONCTION CONCAT (A, B : Entier) : Entier Variables NP, P1 : entier FONCTION NBCH (N : Entier) : Entier ….. Corps de la fonction NBCH …. FONCTION Puissance ( X, e : entier) : Entier ….. Corps de la fonction Puissance…. DEBUT NP NBCH (B) P1 Puissance (10, NP) CONCAT A* P1 + B FIN ALGORITHME CONCAT ALSDS_SiTayeb/Balla 67 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) Fonction N : Entier : Entier NBCH Rôle : Donne le nombre de chiffres composant N ANALYSE : On divisera successivement N par 10 et on s'arrêtera lorsque le quotient sera égal à zéro. Le nombre de divisions donnera le nombre de positions. ALSDS_SiTayeb/Balla 68 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ALGORITHME NBCH FONCTION NBCH (N : ENTIER) : ENTIER Variable NC : Entier DEBUT Remarque : L’utilisation NC 0 de REPETER à la place TantQue (N 0) Faire DTQ de TANT QUE traite le NC NC+ 1 cas particulier de N=0 N N DIV 10 FTQ NBCH NC FIN ALSDS_SiTayeb/Balla 69 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) Fonction X : Entier : entier Puissance e : Entier Rôle : Calcule X puissance e (Xe) ANALYSE : Xe = (X*X*…..*X) e fois ALSDS_SiTayeb/Balla 70 Chapitre 4: La modularité 4.6 EXEMPLE DE DECOUPAGE MODULAIRE (suite) ALGORITHME Puissance FONCTION Puissance (X, e : entier) : entier Variables i, PS: Entier DEBUT PS 1 POUR i 1 A e FAIRE PS PS* X Puissance PS FIN ALSDS_SiTayeb/Balla 71 Chapitre 4: La modularité Programme Pascal de l’exemple (suite) Program SuiteMod; Uses wincrt; Var N, N2, N3 : longint; Function FREQCH (N: longint; c: Integer) :Integer; //Fournit le nombre de fois que le chiffre C apparaît dans N C, Nb : integer; Function NBCH (N: Integer):Integer; Var Cpt, i, Np : Integer; //Nombre de chiffres de N Begin //FREQCH Var NC: Integer; Cpt := 0; Begin Np:= NBCH (N); NC := 0; For i:=i to Np Do Begin While N 0 Do IF ((N Mod 10) = c) Then Cpt := Cpt+1; Begin N:= N Div 10; NC := NC +1; End; N := N Div 10; FREQCH := Cpt; // donne le Nb d'apparitions de c End; End; //Fin FREQCH NBCH := NC; //le nombre de positions End; //Fin NBCH //Suite ALSDS_SiTayeb/Balla 72 Chapitre 4: La modularité Programme Pascal (suite) Begin //Programme principal Write('Donner un Nombre : '); Function Concat (A, B :longint): longint; Readln(N); //Concatène A a B Repeat Var NP :integer; P1 :longint; N2:=0; Function Puissance (X, e: integer): longint; For C:=1 to 9 Do //Calcule X puissance e Begin Var i, PS :integer; Nb:= FREQCH (N,C); Begin //Debut Puissance If (Nb0) Then PS:=1; Begin For i:=1 to e Do PS:= PS*X; N3 := Concat (Nb,C); Puissance:= PS; N2 := Concat (N2, N3); End; End; //Fin Puissance End; //----------- Writeln (N2); Begin //Debut de Concat N :=N2; NP:= NBCH (B); Until (Readkey=chr(27)); P1 := Puissance (10,NP); Writeln ('Fin de programme'); Concat:=A* P1+B; Readln; End; //Fin Concat End. //Fin du programme ALSDS_SiTayeb/Balla 73 Chapitre 4: La modularité Programme Pascal (suite) ALSDS_SiTayeb/Balla 74 Chapitre 4: La modularité 4.7. LES FONCTIONS ET PROCEDURES STANDARDS Nom Nom en Type de x Type du Rôle Exemples Algorithmique Pascal résultat Abs (x) ABS (x) entier/réel type de x valeur absolue de x ABS (-4) = 4 ; ABS (-5.7) = 5.7 Carré (x) SQR (x) entier/réel type de x carré de x SQR (2) = 4 ; SQR (2.5) = 6.25 Racine Carrée (x) SQRT (x) entier/réel réel racine carrée de x SQRT (25) = 5.00 ; SQRT (6.25) = 2.5 Cos (x) COS (x) entier/réel réel cosinus de x (x en radians) COS (PI/2) = 0.00 Sin (x) SIN (x) entier/réel réel sinus de x (x en radians) SIN (PI/2) = 1.00 Tang (x) TAN (x) entier/réel réel tangente de x (x en TAN (PI) = 0.00 radians) Ln (x) LN (x) entier/réel réel logarithme népérien de x LN (1) = 0.00 Exp (x) EXP (x) entier/réel réel exponentiel de x EXP (0) = 1.00 Tronc (x) TRUNC (x) entier/réel entier partie entière de x TRUNC (3.15) = 3 TRUNC (-3.15) = -3 Ent (x) INT (x) entier/réel réel partie entière de x INT (3.15) = 3.00 Arrondi (x) Round(x) entier/réel entier entier le plus proche de x ROUND (9.49) = 9 ROUND (9.5) = 10 Frac (x) FRAC (x) réel réel partie décimale de x FRAC (2.45) = 0.45 Aléa RANDOM réel renvoie un réel aléatoire 0.36 0..1 ALSDS_SiTayeb/Balla 75 Chapitre 4: La modularité 4.7. LES FONCTIONS ET PROCEDURES STANDARDS Nom Nom en Type de x Type du Rôle Exemples Algorithmique Pascal résultat Aléa RANDOM réel renvoie un réel aléatoire 0..1 0.36 Aléa (x) RANDOM entier entier renvoie un entier aléatoire Random (7) renvoie un entier dans [0, 6] (x) dans [ 0, x-1] Odd (x) ODD (x) entier booléen VRAI si x impair FAUX si x ODD (3) = True ODD (8) = False pair Inc (x) INC (x) ; scalaire type de x Procédure, qui incrémente x INC (x) ; l’équivalent de x x +1 INC(x, n) ; l’équivalent de x x + n Dec (x) DEC (x) ; scalaire type de x Procédure, qui décrémente x DEC (x) ; l’équivalent de x x - 1 DEC(x, n) ; l’équivalent de x x - n Pred (x) PRED (x) scalaire type de x prédécesseur de x, s’il existe PRED (5) = 4 ; PRED (‘C’) = ‘B’ PRED (True) = False Succ (x) SUCC (x) scalaire type de x successeur de x, s’il existe SUCC (5) = 6 ; SUCC (‘C’) = ‘D’ SUCC (False) = True Chr (x) CHR (x) octet caractère caractère de code ASCII est x CHR (65) = ‘A’ Ord (x) ORD (x) scalaire entier rang de la valeur x ORD(‘A’)=65 ; ORD(18)=18 ; ORD(true)=1 Majus (x) UPCASE (x) caractère caractère majuscule de x, s’il est UPCASE (‘b’) = ‘B’ possible UPCASE (‘B’) = ‘B’ ALSDS_SiTayeb/Balla 76 Chapitre 4: La modularité 4.7. LES FONCTIONS ET PROCEDURES STANDARDS Les fonctions standards relatives aux chaînes de caractères Type des Type du Nom Algo Nom en Pascal Rôle Exemples param. résultat Retourne un entier représentant L := Length (‘Fonctions standards'); L = 19 Long (ch) Length (ch) Chaîne Entier la longueur de ch. L := Length ('') ; L= 0 L := Length (‘’’') ; L= 1 Retourne la première position de P := Pos (‘s', ‘Constitution') ; P = 4 Pos (ch1, ch2) Pos (ch1, ch2) Chaîne Entier la chaîne ch1 dans la chaîne ch2 P := Pos (‘tion’, ‘Constitution') ; P = 9 P := Pos (‘c', ‘Constitution') ; P = 0 P := Pos (‘C', ‘Constitution') ; P = 1 Sous_chaîne Copy (ch, p, n) Chaîne, Retourne une sous chaîne de n CH := Copy ('Language', 4, 5) ; (ch, p, n) Entier, Chaîne caractères à partir de la position CH = 'guage' Entier p de la chaîne ch. Concat (ch1, Concat (ch1, ch2, Chaînes Chaîne Retourne la concaténation de CH1 := 'Janvier' ; ch2, …) …) plusieurs chaînes en une seule. CH2 := Concat ('1er', '/', ch1, '/', '2015’) ; C'est l'équivalent de CH2 = '1er/Janvier/2015' ch1+ch2+… ALSDS_SiTayeb/Balla 77 Chapitre 4: La modularité 4.7. LES FONCTIONS ET PROCEDURES STANDARDS Les fonctions standards relatives aux chaînes de caractères Nom Type des Type du Nom Algo Rôle Exemples en Pascal param résultat Chaîne, Supprime N caractères de CH à partir CH := ‘Algorithme' ; Efface Delete (ch, p, n) Entier, Chaîne de la position P. Delete (CH, 1, 4) ; CH devient ‘rithme' Entier Insère une chaîne CH1 dans une autre CH1 := BON' ; Insère Insert (ch1, ch2, p) Chaîne, Chaîne CH2 à la position P. CH2 := JOUR' ; Chaîne, Insert (CH1, CH2, 3) ; CH2 devient Entier ‘BONJOUR' Convertit une valeur numérique N en STR (2012, CH) ; CH = '2014' Convch Numériq chaîne une chaîne CH. STR (3.14, CH) ; Str (n, ch) ue, CH = ‘3.1400000000E+01' Chaîne STR (3.14:4:2, CH) ; CH = ‘ 3.14' convertit une chaîne de caractères VAL (‘2015', n, err) ; n = 2015 et err = 0 Chaîne, CH en une valeur numérique N. De VAL ('20H04', n, err) ; n = 0 et err = 3 Valeur Val (ch, n, err) numériqu Entier ou plus, elle fournit un code d'erreur Si n de type entier, après Val (‘3.14', n, err), on obtient n = 0 et err = 2 e, Entier réel ERR qui indique si l'opération s'est Si n de type réel, après Val (‘3.14', n, déroulée correctement. err), on obtient n = 3.14 et err = 0 ALSDS_SiTayeb/Balla 78 Chapitre 4: La modularité 4.8. OBJETS LOCAUX ET OBJETS GLOBAUX Un bloc correspond à une région d'un programme. Dans un programme, les blocs peuvent être emboîtés les uns dans les autres Cette structure appelée structure de blocs définit des niveaux de blocs: Le programme principal forme le bloc de niveau 0 Les procédures et fonctions déclarées directement dans le programme principal forment chacune un bloc de niveau 1 Les procédures et fonctions déclarées dans des procédures ou fonctions de niveau 1 forment chacune un bloc de niveau 2 ALSDS_SiTayeb/Balla 79 Chapitre 4: La modularité 4.8. OBJETS LOCAUX ET OBJETS GLOBAUX (suite) De manière générale: les procédures et fonctions déclarées dans des procédures ou fonctions de niveau N forment chacune un bloc de niveau N+1 Le numéro de niveau est appelé la profondeur du niveau. Un bloc de niveau 5 est plus profond qu'un bloc de niveau 2. ALSDS_SiTayeb/Balla 80 Chapitre 4: La modularité 4.8. OBJETS LOCAUX ET OBJETS GLOBAUX (suite) Portée d’un objet Un Objet est connu et utilisable dans son bloc de définition dès que l’objet a été déclaré dans tous les blocs de niveau plus profond, s'ils sont déclarés dans et après son bloc de définition. La région d'un programme dans laquelle peut être utilisé un objet est appelée portée de l‘objet. ALSDS_SiTayeb/Balla 81 Chapitre 4: La modularité 4.8. OBJETS LOCAUX ET OBJETS GLOBAUX (suite) Portée d’un objet (suite) Un Objet est connu et utilisable Un objet est local à un bloc s'il est déclaré dans la partie déclarative du bloc. Un objet est global à un bloc s'il est déclaré à l'extérieur du bloc et que le bloc fait partie de la portée de cet identificateur. ALSDS_SiTayeb/Balla 82 Chapitre 4: La modularité 4.9. EFFETS DE BORD ALGORITHME effet_Bord Variables A, B, E : Entier Module Appelant FONCTION test (C : entier) : Entier A B E Module Appelé DEBUT 1 5 C TEST A A*B 5 4 1 1 9 BA-C Test A+B 20 19 1 39 FIN DEBUT 380 379 1 759 A1 B5 E1 Ecrire (TEST(E)) Ecrire (TEST(E)) Ecrire (TEST(E)) FIN ALSDS_SiTayeb/Balla 83 Chapitre 4: La modularité 4.9. EFFETS DE BORD (suite) Pour éviter les effets de bord , il suffit d'appliquer la règle suivante : N'utilisez pas, à chaque fois que cela est possible, des variables globales dans un module, Sinon ne modifier que les objets locaux. ALSDS_SiTayeb/Balla 84 Chapitre 4: La modularité 4.10. MODULES INTERNES ET EXTERNES Program PuisNp; Function Puissance(X,e :integer):Longint //Déclarations //Déclarations Begin //Fonction Puissance Function Puissance(X,e :integer):Longint …. //Déclarations Puissance : = PS; Begin //Fonction Puissance End; //Fin Fonction …. Module externe Puissance : = PS; End; //Fin Fonction Pour tester un module, on le met Module interne d’abord sous forme d’un Begin //Principal module interne. Dès qu’il sera …… mis au point, on le met sous End. forme externe. ALSDS_SiTayeb/Balla 85 Chapitre 4: La modularité 4.11. COMMENT CATALOGUER UN MODULE 1ère Etape: Test et mise au point du Module (de façon séparée) On écrit le module en l'incorporant dans un « petit programme » très simple qui ne servira qu’à tester le module ( le module est interne) Le « petit programme » est alors un fichier contenant et le Module appelant et le module appelé (qui est sous forme de module interne) Une fois que le module est testé, on fait une sauvegarde et on passe à la deuxième étape. ALSDS_SiTayeb/Balla 86 Chapitre 4: La modularité 4.9. MODULES INTERNES ET EXTERNES ALSDS_SiTayeb/Balla 87 Chapitre 4: La modularité 4.11. COMMENT CATALOGUER UN MODULE (suite) 2ème Etape: Catalogage du Module (exemple : Puissance) On supprime toutes les instructions se trouvant avant et après le Module. On fait à nouveau une sauvegarde, mais ATTENTION en utilisant Enregistrer sous : SAVE AS Ainsi, on aura alors crée 2 fichiers distincts : N_Puiss_p.pas et Puissance.pas Le Module Puissance est alors externe et il est maintenant réutilisable dans n'importe quel autre Module/programme ALSDS_SiTayeb/Balla 88 Chapitre 4: La modularité 4.11. COMMENT CATALOGUER UN MODULE (suite) ALSDS_SiTayeb/Balla 89 Chapitre 4: La modularité 4.11. COMMENT CATALOGUER UN MODULE (suite) 3ème Etape: Déclaration d’un module externe (exemple : Puissance) Ouvrir à nouveau le fichier PgmePuissance.pas, supprimer le module et mettre à la place : Program N_Puiss_p; 1./ Utilisation de la directive $i //Déclarations {$i Puissance.pas} ou //{$i G:\ALSDS_2024-2025\TD\Programmes\ Puissance.pas } Begin //Principal …… End. ALSDS_SiTayeb/Balla 90 Chapitre 4: La modularité 4.11. COMMENT CATALOGUER UN MODULE (suite) 1./ Utilisation de la directive $i Program MenuG; Uses Wincrt; Var N, p, result, nr : Integer; NbP, NbD, SD : Integer; Exemple Choix : Integer; a, b, c, X1, X2 : Real; {$i Puissance.pas} {$i NBCH.pas} {$i NbDiv.pas} {$i SomDiv.pas} {$i SeconDegre.pas} ALSDS_SiTayeb/Balla 91 Chapitre 4: La modularité Exemple (suite) Begin ///Programme Principal Repeat Clrscr; Writeln ('-------------------- MENU --------------------'); Writeln (' 1 : Calcul de N puissance p '); Writeln (' 2 : Calcul du nombre de positions d''un nombre entier N '); Writeln (' 3 : Calcul du nombre de diviseurs d''un nombre entier N '); Writeln (' 4 : Calcul de la somme des diviseurs d''un nombre N (y compris lui Writeln )'); Writeln (' 5 : Resolution d''une equation du second degre '); Writeln (' 6 : Quitter '); Write ('Donnez votre choix : '); Readln (Choix); Case Choix Of ALSDS_SiTayeb/Balla 92 Chapitre 4: La modularité Exemple (suite) 1 : Begin //Puissance Write ('Donner N : '); Readln (N); Write ('Donner p : '); Readln (p); Result := Puissance(N,p); /Appel de la fonction puissance Writeln('Le resulat de ',N:8,' puissance ', p:3,' est : ',Result:10); End; //Puissance //------------------------------------------ ALSDS_SiTayeb/Balla 93 Chapitre 4: La modularité Exemple (suite) 5: Begin //Resolution equation du second degre 2 : Begin //NBCH Write('Donner les paramètres a, b et c : '); ….. Readln (a,b,c); End; //NbCh SeconDegre(a,b,c,nr,X1,X2); //nr : nombre de racines If (nr = 0) Then Writeln('Pas de solutions ') //------------------ Else 3 : Begin //NbDiv If (nr = 1) Then ….. Writeln('Racine Double X1 = X2 = ',X1:5:2) End; //NbDiv Else Writeln ('Deux Racines distinctes, x1 = //------------------ ',X1:5:2, ' et x2 = ',X2:5:2); …… End; //Fin EQU2D //------------------ …… ALSDS_SiTayeb/Balla 94 Chapitre 4: La modularité Exemple (suite) 6: Begin //Quitter le menu Writeln ('-------------Fin de travail-------------'); Exit; End //Quitter le menu Else Writeln ('Erreur de choix '); End; //Case Until (Readkey = Chr(27)); //touche Echap End. /fin Programme Principal ALSDS_SiTayeb/Balla 95 Chapitre 4: La modularité 4.12. LE CONCEPT DE BIBLIOTHEQUE Lorsque l'on a conçu mis au point et testé un certain nombre de modules, il est intéressant de les regrouper dans une ou plusieurs bibliothèques appelée UNITES : Module 1 Module 2 UNITE Biblio1 …… ALSDS_SiTayeb/Balla 96 Chapitre 4: La modularité 4.12. LE CONCEPT DE BIBLIOTHEQUE (suite) COMMENT CONSTRUIRE UNE UNITE? Taper l'unité comme s'il s'agit d'un programme Pascal ; A la fin, donner un nom à l'unité, par exemple BIBLIO1.PAS et sauvegarder le fichier ; Compiler maintenant ; Corriger les erreurs s'il y en a ; ALSDS_SiTayeb/Balla 97 Chapitre 4: La modularité 4.12. LE CONCEPT DE BIBLIOTHEQUE (suite) COMMENT CONSTRUIRE UNE UNITE? Lorsqu'il n'y a plus d'erreurs, vous pouvez utiliser l'unité créée en mettant dans la clause USES le nom de l'unité, exemple: USES BIBLIO1 ; Vous pouvez utiliser tous les modules qui s'y trouvent sans les déclarer individuellement et surtout sans qu'ils ne soient à chaque fois compilés. ALSDS_SiTayeb/Balla 98 Chapitre 4: La modularité 4.12.1. STRUCTURE D’UNE UNITE En-tête de l’unité UNIT Nom_de_L’unité ; INTERFACE Partie publique [ USES Liste des unités globales ( si nécessaire) ] En-têtes des procédures et fonctions IMPLEMENTATTON Partie non publique [ USES liste des unités locales ] Procédures et Fonctions ( complètes : en-têtes et corps) [ BEGIN Partie initialisations Partie optionnelle Commandes ] END. //FIN UNIT ALSDS_SiTayeb/Balla 99 Chapitre 4: La modularité 4.12.1 STRUCTURE D’UNE UNITE (Suite) L’en-tête de l’unité commence par le mot réservé UNIT suivi du nom de l’unité ; Le mot réservé INTERFACE indique le début de la partie visible pour les autres unités ou applications ; Si l’unité utilise d’autres unités, on les liste après le mot réservé USES juste après le mot réservé INTERFACE ou juste après le mot réservé IMPLEMENTATION ALSDS_SiTayeb/Balla 100 Chapitre 4: La modularité 4.12.1 STRUCTURE D’UNE UNITE (Suite) Partie INTERFACE: elle commence par le mot réservé INTERFACE et se termine par le mot réservé IMPLEMENTATION elle définit ce qui est visible (accessible) `a n’importe quelle application ou unité utilisant celle-ci on peut y déclarer des constantes, des types de données, des variables, des procédures et des fonctions ALSDS_SiTayeb/Balla 101 Chapitre 4: La modularité 4.12.1 STRUCTURE D’UNE UNITE (Suite) Partie IMPLEMENTATION: Elle commence par le mot réservé IMPLEMENTATION Tout ce qui est déclaré dans la partie interface est accessible au code de la partie implementation Elle peut avoir ses propres déclarations supplémentaires, mais celles-ci ne sont pas accessibles aux programmes ou unités utilisant cette unité. Elle peut avoir une clause USES. Le corps des routines déclarées dans la partie interface doit apparaître dans la partie implementation ALSDS_SiTayeb/Balla 102 Chapitre 4: La modularité 4.12.1 STRUCTURE D’UNE UNITE (Suite) REMARQUES: Le nom du fichier contenant l’unité doit être identique à l’identificateur qui suit le mot réservé UNIT ; Avec Free Pascal ou Pascal XE ou un autre compilateur pascal, il y a production de fichiers qui sont nécessaires si l’on veut utiliser l’unité dans un programme. ALSDS_SiTayeb/Balla 103 Chapitre 4: La modularité 4.12.2. EXEMPLE Enoncé : Mettre en application en Pascal, le concept de Bibliotheque (UNIT BIBLIO1) incluant 2 fonctions: Function Facto (x :integer) : longint; Function PREM (N:longint) : Boolean; ALSDS_SiTayeb/Balla 104 Unit BIBLIO1; Program ExempleBiblio; Interface Uses Wincrt; // Dans l'interface les en-têtes des modules Uses BiBLIO1; //Utilisation de l'unité BIBLIO1 Var N, FC : Longint ; Function FACTO (x : Integer) : Longint; P : Boolean; Function PREM (n : Longint): Boolean; Begin //Principal Implementation Clrscr; // Dans l'implémentation on intègre les modules en entier Write ('Donner N : '); Function FACTO (x : Integer) : Longint; Readln(N); Var f, i : Integer; FC:= FACTO (N); If (P = Vrai) Begin //Facto P:= PREM (N); f := 1; Writeln ('Factorielle de : ',N,' est : ',FC:8); If P Then Writeln(N:5,' : EST PREMIER') For i:=2 To x Do f:= f*i ; Else Writeln(N:5,' : N''est pas PREMIER'); FACTO := f ; Readln; End; //Fin Facto End.//Fin Programme Function PREM (n : longint) : Boolean; Var i : Longint; Begin //Prem i := 2; While ((n Mod i)0) And (i1) And ( i > N Div 2)) End; //Fin PREM 2 Fichiers crées lors de la compilation de Biblio1.pas End. //FIN UNIT ALSDS_SiTayeb/Balla 105 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE Définition : Une procédure ou une fonction est dite récursive si elle fait appel à elle même, directement ou indirectement. Cours ALSDD 1CP : Hidouci KW ALSDS_SiTayeb/Balla 106 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) Principe : Le principe consiste à d'écrire les étapes nécessaires à la résolution de problèmes en utilisant la résolution du même problème sur des entrées plus petites. Chaque appel récursif, génère une nouvelle exécution de la procédure ou fonction Pour éviter des exécutions infinies, les appels récursifs doivent être conditionnels (à l'intérieur d'un SI ou un SINON ou un TQ...etc) ALSDS_SiTayeb/Balla 107 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) Première règle : Tout algorithme récursif doit distinguer plusieurs cas dont l’un au moins ne comporte pas d’appel récursif : éviter les calculs infinis. Cas de base : Les cas de base sont les cas non récursifs d’un algorithme récursif. Conditions de terminaisons : Les conditions de terminaisons sont les conditions que doivent satisfaire les données dans les cas de base. Deuxième règle : Vérifier que tous les appels récursifs effectués terminent bien sur une condition de terminaison. ALSDS_SiTayeb/Balla 108 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) 1. Exemple de la fonction factorielle On peut définir la factorielle d’un nombre de la manière suivante : n! = n * (n-1) * (n-2) *.... * 1 pour n > 0 et 0! = 1 n! = n * (n-1)! pour n > 0 et n! = 1 pour n = 0 OU 1 si n ≤ 1 n! = n(n −1)! sinon ALSDS_SiTayeb/Balla 109 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) a) Algorithme itératif de la fonction factorielle Fonction FACTI (N : entier): Entier Variables F, i : entier Début F←1 Pour i allant de1 a N Faire F ← i ∗ F FACTI ← F Fin ALSDS_SiTayeb/Balla 110 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) b) Algorithme récursif de la fonction factorielle Fonction FACTR (N : entier): Entier Début SI N = 0 Alors //cas particulier FACTR ← 1 SINON // cas général FACTR ← N*FACTR(N −1) Fin ALSDS_SiTayeb/Balla 111 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) b) Déroulement pour l’appel Fact(4) 1- ( n=4 ) 4! ⇒ 4 *3! (Appel de Fact(3)) 2- ( n=3 ) 3! ⇒ 3 *2! (Appel de Fact(2)) 3- ( n=2 ) 2! ⇒ 2 *1! (Appel de Fact(1)) 4- ( n=1 ) 1! ⇒ 1 *0! (Appel de Fact(0)) 5- ( n=0 ) 0! ⇒ 1 (cas particulier) 4- ( n=1 ) 1! ⇒ 1 *1 = 1 (Après retour de Fact(0)) 3- ( n=2 ) 2! ⇒ 2 *1 = 2 (Après retour de Fact(1)) 2- ( n=3 ) 3! ⇒ 3 *2 = 6 (Après retour de Fact(2)) 1- ( n=4 ) 4! ⇒ 4 *6 = 24 (Après retour de Fact(3)) L’appel Fact(4) a généré 4 appels et 4 retours L’appel initial Fact(4) retourne donc le résultat : 24 Le dernier appel (Fact(0)) est évalué uniquement par le cas particulier. ALSDS_SiTayeb/Balla 112 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) b) Déroulement pour l’appel Fact(4) (autre représentation) factorielle(4) 4*factorielle(3) = 4*3*2*1 ↓ ↑ factorielle(3) 3*factorielle(2) = 3*2*1 ↓ ↑ factorielle(2) 2*factorielle(1) = 2*1 ↓ ↑ factorielle(1) 1*factorielle(0) = 1*1 ↓↓ ↑↑ factorielle(0) → 1 ALSDS_SiTayeb/Balla 113 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) 2. Exemple de la fonction Fibonacci U0 = 1, U1 = 1, Un = Un-1 + Un-2 pour n > 1 Fonction Fib ( N: entier ) : entier Debut SI (n < 2) // cas particulier Fib ← 1 SINON // cas général Fib ← Fib (N - 1) + Fib (N - 2) FIN Attention! solution très inefficace mais simple ALSDS_SiTayeb/Balla 114 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) 2. Exemple de la fonction Fibonacci Déroulement : Fib(4) = Fib(3) + Fib(2) =5 Fib(2) + Fib(1) Fib(1) + Fib(0) 1 1 Fib(1) + Fib(0) 1 1 1 ALSDS_SiTayeb/Balla 115 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) 3. Exemple de la de la recherche dichotomique récursive // Recherche binaire dans une table triée T-5 3 15 25 30 49 60 72 100 1 2 3 4 5 6 7 8 9 bi (borne inf) milieu bs (borne sup) Un élément x se trouve soit dans la 1ère moitié soit dans la 2ème moitié. Pour le savoir on compare par rapport au milieu. ALSDS_SiTayeb/Balla 116 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) // rechercher x dans la portion du tableau comprise entre les indices bi et bs FONCTION RechR (T : Tab1D ; x : entier; bi, bs : entier) : Entier Variable milieu: entier // Résultat : l'indice de x dans T (ou -1) Debut SI (bi > bs) Alors RechR ← -1 //cas particulier 1 SINON milieu ← (bi + bs) div 2; SI (x = T [ milieu ] ) Alors RechR ← milieu // cas particulier 2 SINON SI (x < T [milieu] ) Alors // cas général RechR ← RechR ( T, x , bi , milieu-1 ) // 1ere moitié SINON RechR ← RechR ( T, x , milieu+1 , bs ) // 2e moitié FSI FSI FSI FIN ALSDS_SiTayeb/Balla 117 Chapitre 4: La modularité 4.13. INTRODUCTION A LA RECURSIVITE (suite) Remarques Dans le corps du module récursif il doit y avoir: − Un ou plusieurs cas particuliers Ce sont les cas simples ne nécessitant pas d'appels récursifs pour être évalués. Cela permet de sortir d'une exécution (les ‘wayouts’). − Un ou plusieurs cas généraux Ce sont les cas complexes qui sont résolus par des appels récursifs L'appel récursif d'un cas général doit toujours mener vers un des cas particuliers pour que l'exécution soit finie La récursivité est un outil puissant − permet de concevoir des solutions (élégantes) sans se préoccuper des détails algorithmiques internes ALSDS_SiTayeb/Balla 118 Fin du Chapitre 4 Merci pour votre Attention Réussite et Succès ALSDS_SiTayeb/Balla 119