1 Les Sous Algorithmes Introduction 08/02/2012 13:15 Les Fonctions Les Procédures MABROUK Mohamed M.C.E.S.M. 1.INTRODUCTION 2 Lorsqu’une séquence d’opérations se répète plusieurs fois, il est intéressant de faire un sous-algorithme correspondant à ce bloc d’opérations et de l’utiliser autant de fois que nécessaire. Cette séquence d’opérations sera définie dans un sousalgorithme qui peut prendre la forme d’une fonction ou d’une procédure. De plus, un algorithme est presque toujours décomposable en modules qui peuvent alors être définis de manière indépendante. Cela permet de modifier éventuellement un module sans pour autant changer le corps de l’algorithme et de rendre l’algorithme plus compréhensible (lisibilité) Un algorithme est alors un ensemble de procédures et/ou de fonctions 08/02/2012 13:15 MABROUK Mohamed M.C.E.S.M. 3 08/02/2012 13:15 MABROUK Mohamed M.C.E.S.M. 2. NOTION DE BLOC DANS UN ALGORITHME Algorithme Principal ------------Début ------------------------------------Appel_sous_algorithme 1 ------------------------------------Fin Sous_Algorithme 1 ------------Début ------------------------Appel_sous_algorithme 2 --------------------Fin Sous_Algorithme 2 ------------Début ------------------------Fin 3. LES FONCTIONS 4 3.1. Définition et propriétés • Une fonction est un sous algorithme qui retourne une valeur calculée en fonction des valeurs passées en entrée. Paramètres D’entrée …. Fonction Résultat 08/02/2012 13:15 • • MABROUK Mohamed M.C.E.S.M. • Une fonction prend zéro ou plusieurs paramètres et renvoie (ou retourne) éventuellement un résultat . Une fonction ne peut renvoyer qu’ une seule valeur (un seul résultat ). Une fonction qui ne retourne pas un résultat est une procédure. 5 3.2. Syntaxe de déclaration d’une fonction Une fonction s'écrit en dehors de l’algorithme principal sous la forme Fonction Identificateur(Paramètres et leurs types) : Type_retourné <Déclaration des constantes et des variables locales et globales> Début <instructions constituant le corps de la fonctions> retourner(…..) 08/02/2012 13:15 Fin. Identificateur : Nom que l’on doit donner à la fonction. Paramètres et leurs types : Liste des paramètres formels donnés en entrée avec leurs types. Type_retourné : Type du résultat renvoyé par la fonction. MABROUK Mohamed M.C.E.S.M. Remarque : le corps de la fonction doit comporter une instruction de la forme : retourner(expression) où expression est du même type que le résultat de la fonction 6 Exemple de fonction Soit la fonction Minimum2 suivante qui cherche et renvoie le minimum parmi deux entiers. Fonction Minimum2(a,b: entier) : entier Début Si(a ≤ b) alors retourner(a) 08/02/2012 13:15 Sinon retourner(b) Finsi Fin. MABROUK Mohamed M.C.E.S.M. Minimum2 : est le nom de la fonction. a,b : sont deux paramètres formels de type entier. entier : est le type du résultat renvoyé par Minimum2. 3.3. Variables locales et globales 7 On peut manipuler 2 types de variables dans un module (procédure ou fonction) : des variables locales et des variables globales. Elles se distinguent par ce qu'on appelle leur portée (leur "champ de définition", leur "durée de vie") Une variable locale n'est connue qu'à l'intérieur du module où elle a été définie. Elle est créée à l'appel du module et détruite à la fin de son 08/02/2012 13:15 exécution Une variable globale est connue par l'ensemble des modules et l’algorithme principale. Elle est définie durant toute l’application et peut être utilisée et modifiée par les différents modules du programme Conseil : Il faut utiliser autant que possible des variables locales plutôt que des variables globales. Ceci permet d'économiser la mémoire et MABROUK Mohamed M.C.E.S.M. d'assurer l'indépendance de la procédure ou de la fonction. 8 3.3. Utilisation d’une fonction (Appel ) L’appel à une fonction se fait simplement en tapant le nom de la fonction dans le corps de l’algorithme selon la syntaxe suivante Nom_Variable NomFonction (Paramètres effectifs) 08/02/2012 13:15 Les paramètres effectifs sont des expressions évaluées qui remplacent les paramètres formelles dans la définition de la fonction. La valeur retournée par la fonction est affectée à la variable «Nom_Variable ». MABROUK Mohamed M.C.E.S.M. 9 Exemple d’utilisation de fonction Si nous voulons faire un algorithme qui cherche le minimum parmi trois entiers par exemple, on peut exploiter la fonction Minimum2 précédente. Algorithme Minim Variable x et y vont remplacer respectivement a et b dans la fonction Minimum2. min2 va recevoir donc soit x soit y x, y, z, min2,min3: entiers 08/02/2012 13:15 Début Lire(x,y,z) min2 Minimum2(x,y) min3 Minimum2(min2,z) Ecrire(min3) Fin. MABROUK Mohamed M.C.E.S.M. min2 et z vont remplacer respectivement a et b dans la fonction Minimum2. min3 va recevoir donc soit min2 soit z ATTENTION 10 Soit la fonction Interdit suivante. Fonction Interdit(x: entier) : entier Début x x div 2 retourner(x) 08/02/2012 13:15 Fin. L’appel de cette fonction pour x = 3 s’écrit y Interdit(3). L’exécution de la fonction conduit à 3 3 div 2 qui est absurde. Dans le corps de la fonction, Il ne faut pas avoir une opération qui MABROUK Mohamed M.C.E.S.M. modifie la valeur du paramètre passé à la fonction par valeur. REMEDE 11 Faire intervenir une autre variable locale t. On aura la fonction suivante : Fonction Interdit(x: entier) : entier Variable locale t : entier 08/02/2012 13:15 Début tx t t div 2 retourner(t) Fin. L’appel de cette fonction pour x = 3 par exemple s’écrit y Interdit(3). L’exécution de la fonction consiste à affecter 3 à t dans un premier temps puis à affecter le quotion (entier) t div 2 = 1 à t et en fin à renvoyer la valeur MABROUK Mohamed M.C.E.S.M. de t (=1) à l’extérieur de la fonction Interdit. Donc y 1 12 Exemple d’exécution d’une fonction 08/02/2012 13:15 MABROUK Mohamed M.C.E.S.M. 08/02/2012 13:15 « Exemple de fonction» 13 But : Tester si un nombre est premier Stratégie : Supposer que le nombre est premier jusqu’à on a trouvé un diviseur. Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire 08/02/2012 13:15 Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; MABROUK Mohamed M.C.E.S.M. FinPremier 14 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre: entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre 9 MABROUK Mohamed M.C.E.S.M. P Diviseur Résultat 15 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre: entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P 9 Vrai MABROUK Mohamed M.C.E.S.M. Diviseur Résultat 16 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 MABROUK Mohamed M.C.E.S.M. Résultat 17 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 MABROUK Mohamed M.C.E.S.M. Résultat 18 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 MABROUK Mohamed M.C.E.S.M. Résultat 19 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Résultat 20 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Résultat 21 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Résultat 22 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Faux Résultat 23 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Faux 4 Résultat 24 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 9 3 MABROUK Mohamed M.C.E.S.M. Faux 4 Résultat 25 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 Résultat 9 3 MABROUK Mohamed M.C.E.S.M. Faux 4 Faux 26 08/02/2012 13:15 Exemple d’appel de la fonction Premier : Résultat Premier(9) Fonction Premier(Nombre : entier) : booléen P Vrai Diviseur 2 Tantque (diviseur≤(Nombre div 2)) et (P = Vrai) Faire Si (Nombre Mod Diviseur = 0) Alors P Faux Finsi Diviseur Diviseur + 1 FinTantQue RETOURNER P; FinPremier Trace Nombre P Diviseur Vrai 2 Résultat 9 3 MABROUK Mohamed M.C.E.S.M. Faux 4 Faux 4. LES PROCEDURES 27 Dans certains cas, on peut avoir besoin de répéter une tâche dans plusieurs endroits d’un algorithme, mais que dans cette tâche on ne calcule pas de résultats ou qu'on calcule plusieurs résultats à la fois. 08/02/2012 13:15 Dans ces cas on ne peut pas utiliser une fonction on utilise donc une procédure 4.1. Définition Une procédure est un sous-algorithme semblable à une fonction MABROUK Mohamed M.C.E.S.M. mais qui ne retourne rien à l’extérieur de la procédure. 28 4.2. Syntaxe de déclaration d’une procédure Une Procédure s'écrit en dehors de l’algorithme principal sous la forme Procédure Identificateur(Paramètres et leurs types) <Déclaration des constantes et des variables locales et globales> Début 08/02/2012 13:15 <instructions constituant le corps de la procédure> Fin. Identificateur : Nom que l’on doit donner à la procédure. Paramètres et : Liste des paramètres formels donnés en entrée leurs types MABROUK Mohamed M.C.E.S.M. avec leurs types. Remarque : une procédure peut ne pas avoir des paramètres formels. 29 4.3. Utilisation d’une Procédure (Appel ) L'appel d'une procédure, se fait dans l’algorithme principale ou dans une autre procédure ou fonction par une instruction . indiquant le nom de la procédure selon la syntaxe suivante. NomProcédure (Paramètres effectifs) 08/02/2012 13:15 Les paramètres effectifs (ou paramètres d’appels) sont des expressions évaluées qui remplacent les paramètres formelles dans la définition de la procédure. Remarque : contrairement à l'appel d'une fonction, une procédure ne peut pas être affectée ou utilisée dans une expression. MABROUK Mohamed M.C.E.S.M. L'appel d'une procédure est une instruction autonome. 30 4.4. Paramètres d’une procédure Les paramètres servent à échanger des données entre l’algorithme principale (ou la procédure appelante) et la procédure appelée. Comme avec les fonctions : 08/02/2012 13:15 • Les paramètres placés dans la déclaration d'une procédure sont appelés paramètres formels. Ces paramètres peuvent prendre toutes les valeurs possibles mais ils sont abstraits (n'existent pas réellement). • Les paramètres placés dans l'appel d'une procédure sont appelés paramètres effectifs (ou paramètres d’appels). Ils contiennent les valeurs pour effectuer le traitement. Le nombre de paramètres effectifs doit être égal au nombre de paramètres formels. L'ordre et le type des paramètres doivent correspondre. MABROUK Mohamed M.C.E.S.M. 31 4.5. Exemple d’application Soit la procédure Produit suivante qui calcule et affiche le produit de deux valeurs réelles. Procédure Produit(a,b: réels) Variable locales Exemple d’appel : P : réel 08/02/2012 13:15 Produit(2.5,9) Début P a*b Résultat de l’exécution : Ecrire("P = ",P) Fin. MABROUK Mohamed M.C.E.S.M. Produit : est le nom de la procédure. a,b : sont deux paramètres formels de type réel. P = 22.5 32 5. TRANSMISSION DE PARAMETRES Il existe deux modes de transmission de paramètres : La transmission par valeur : les valeurs des paramètres effectifs sont . affectées aux paramètres formels au moment de l'appel de la procédure. Le paramètre effectif ne subit aucune modification. 08/02/2012 13:15 La transmission par adresse (ou par référence) : les adresses des paramètres effectifs sont transmises à la procédure appelante. Le paramètre effectif doit donc être une variable et non une valeur. Le paramètre effectif subit les mêmes modifications que le paramètre formel lors de l'exécution de la procédure. Convention d’écriture en algorithmique En pseudo-code (algorithmique), on va préciser explicitement le mode MABROUK Mohamed M.C.E.S.M. de transmission dans la déclaration de la procédure ou de la fonction. 5.1. Exemples de définition de procédures 33 Exemple 1: procédure de calcule de la somme et du produit de deux entiers. Procédure SommeProduit (x,y: entier par valeur, som, prod : entier par adresse) Début som ← x+y prod ← x*y Fin 08/02/2012 13:15 Exemple 2 : Procédure qui échange le contenu de deux variables. Procédure Echange (x : réel par adresse, y : réel par adresse) variables Début z←x x←y y←z MABROUK Mohamed M.C.E.S.M. Fin z : réel 34 5.2. Exemple de transmission des paramètres Procédure incrémenter (x : entier par valeur, y : entier par adresse) Début x ← x+1 y ← y+1 Fin Algorithme Test_incrémenter 08/02/2012 13:15 variables Exemple d’appel n, m : entier Début n←3 m←3 MABROUK Mohamed M.C.E.S.M. Résultat n=3 et m=4 Conclusion incrémenter(n, m) l'instruction x ← x+1 écrire (" n= ", n, " et m= ", m) n'a pas de sens avec Fin un passage par valeur 35 Ce cours est téléchargeable à partir du site : http://www.mabrouk.sitew.com 08/02/2012 13:15 MABROUK Mohamed M.C.E.S.M.