![]() ![]() ![]() |
|
A l g o r i t h m e s
L e s s o u s - p r o g r a m m e s
(2ème partie)
Procédures et fonctions
Notion de fonction
Nous avons vu qu'un sous-programme est un regroupement d'actions, le nom du sous-programme correspond au nom de l'action complexe. La définition d'un sous-programme de type PROCEDURE est équivalente. De même pour un sous-programme de type FONCTION mais nous rajouterons le fait qu'il doit retourner un résultat. Distinction algorithmique : PROCEDURE = action (traitement) FONCTION = action + évaluation d'une expression en retour (résultat) Exemple : soit un sous-programme calculant le maximum de 2 entiers
Pour l'appel, nous écrirons : MAXIMUM (A, B, MAX_AB) ce qui est correct mais il vaut mieux passer par l'écriture d'une fonction.
Appel du sous-programme : MAX_AB ![]()
Remarques :
Exemple : somme de 2 maximums
Fonction à plusieurs résultats
Une fonction délivre un et un seul résultat. Nous souhaiterions néanmoins pouvoir renvoyer plusieurs résultats. Par exemple, pour des opérations de manipulation des nombres complexes (partie réelle et partie imaginaire), ou l'opération de division (quotient et reste) etc... Nous connaissons déjà un outil pouvant répondre à nos besoins : l'enregistrement (regroupement de données). Mais c'est insuffisant car il peut exister des cas pour lesquels les résultats souhaités ne pourront pas être regroupés dans un enregistrement : Exemple : Rechercher séquentiellement un élément X dans une table TAB, nous avons 2 résultats possibles :
Remarque :
On pourrait envisager que le sous-programme RECHERCHER_ELEMENT soit de type FONCTION avec un résultat transmis par RETOURNER et l'autre en mode SORTIE. Mais attention car fonction implique évaluation ! Exemple :
Normalement le programme devrait exécuter l'affectation + écriture de l'élément A[1], mais nous avons une évaluation de la fonction F avec mise à jour de la variable I. La question que l'on peut se poser est : I = 1 ou I = 5 ? Une seule réponse : cela dépend du compilateur ! En général, l'évaluation se fera en premier et nous aurons par conséquent l'affectation de l'élément A[5]. Une solution à ce problème peut s'écrire :
Effet de bord
L'effet de bord est un phénomène lié à la modification des variables globales. Les variables globales sont visibles dans un sous-programme, on peut donc les modifier dans le corps d'un sous-programme (voir portée des variables)
Exemple : soit la fonction F
Soient les séquences de code suivante :
Conclusion : F(5) + F(6) n'est pas égal à F(6) + F(5), cette addition n'est pas commutative !! Le résultat de la fonction F dépend du contexte d'appel. Plusieurs appels identiques de la même fonction peuvent conduire à des résultats différents (effet de bord). Autre exemple :
Nous assistons dans le cas présent au phénomène d'effet de bord : modification indésirable d'une variable globale (ici le paramètre formel Y et la variable Z désignant le même objet Z). Solution : réduire les affectations des variables globales. Déclarer la variable Z globale pour l'appel MAUVAIS_CARRE(A,Z) mais la variable Z du sous-programme MAUVAIS_CARRE doit être locale au sous-programme (pas de confusion entre Z global et Z local)
Règle d'utilisation des variables globales : Lorsqu'un programme est décomposé en plusieurs sous-programmes, les modifications (affectations) des variables globales ne doivent apparaître que dans un petit nombre de sous-programmes. Par contre tous les sous-programmes peuvent lire le contenu de la variable globale. Préférer l'utilisation des paramètres et des variables locales. Récursivité
Définition : La récursivité permet à une entité de se définir en fonction d'elle-même. En informatique nous retrouvons la notion de récursivité dans 2 cas : algorithmes récursifs (sous-programmes récursifs), structures de données récursives. Exemple : créature blessée à la recherche d'une potion de vitalité
Nous avons le même problème que pour les répétitions : arrêt de la récursivité. Expression récursive :
Exemple : Le problème est : AVANCER_VERS_POTION(DISTANCE_A_POTION)Exemple d'exécution : On considère que la créature est à une distance de 7 mètres de la potion, et que AVANCER_UN_PAS retourne toujours la valeur 2 mètres pour PAS
Remarque :
A chaque appel, le contexte formé par la variable DISTANCE_A_POTION est accessible. Il y a autant de contexte que d'appels, mais seul le dernier est manipulable. ![]() |
![]() |
![]() |
![]() |
© 2000-2025 Exood4 Studio. Tous droits réservés. |