Page MenuHomePhabricator

La découpe de problèmes en sous problèmes
Updated 36 Days AgoPublic

Les procédures et les fonctions

En informatique, une fonction est une entitée qui encapsule une séquence d'instructions effectuant un traitement spécifique indépendant du reste du programme. Cette fonction peut être réutilisée dans le même programme, ou dans un autre. Il faut voir une fonction comme un outil, et la bibliothèque comme la boite à outils. Il est commun que les développeurs réutilisent pendant toutes leurs carrières les outils conçus par eux-mêmes ou d'autres développeurs.

Les fonctions permettent de diviser un problème en décomposant le programme à réaliser en portions de code plus faciles à utiliser et à entretenir. Les instructions dans la fonction sont encapsulées à l'intérieur de celle-ci, c'est à dire que la fonction devient une boite noire. Le programmeur peut faire appel à la fonction sans se préoccuper des détails internes à celle-ci. Il faut distinguer deux types de fonction : Une PROCÉDURE ne retourne aucune valeur, alors qu'une FONCTION renvoi une seule valeur. Par exemple, le pseudo code suivant renvoi la valeur maximum des deux variables.

FONCTION max(a: ENTIER, b: ENTIER)
    VARIABLE r: ENTIER

    SI a > b:
        r <- a
    SINON:
        r <- b
    FIN SI

    RETOURNER r
FIN FONCTION

Maintenant que cette fonction existe, il est possible de l'utiliser, comme s'il s'agissait d'instruction standard, ce qui simplifie nos algorithmes :

DÉBUT
VARIABLE a, b, c: ENTIER

LIRE "Veuillez compléter la valeur de A:", a
LIRE "Veuillez compléter la valeur de B:", b

c <- max(a, b)

ÉCRIRE "La valeur maximum vaut", c
FIN

Le passage par copie ou par référence

Dans les langages de programmation, une copie des variables provenant de la fonction est reçue dans les paramètres au lieu de travailler sur les véritables variables de la fonction appelante. Ce choix est fait pour des raisons de sécurité pour l'intégrité des données. Pour concrétiser ce choix, il est possible d'utiliser le symbole ↓ pour les copies et d'utiliser le symbole lorsqu'on ne souhaite pas copier les valeurs ↕. Ce symbole est appelé une RÉFERENCE.

Il faut toujours privilégier les appelle de fonctions par copies des variables. Le fait d'utiliser les références à tort est une source d'erreur, puisque les variables pourraient être modifiées par inadvertance.

Dans l'exemple ci-dessous, la procédure suivante n'aurait pas été possible avec une copie des variables, puisque la modification n'aurait eu lieu que dans la fonction, et pas dans tout le programme.

PROCÉDURE swap(a: ENTIER, b: ENTIER)
    VARIABLE c: ENTIER
    c <- a
    a <- b
    b <- c
FIN PROCÉDURE

Pour bien comprendre ce comportement de copie, il faut avant tout comprendre pourquoi les données sont copiées. À chaque appel de fonction, une nouvelle zone mémoire est créée pour accueillir les variables temporaires de cette fonction. Les arguments sont alors copiés dans les paramètres. La fonction est ensuite exécutée, et la valeur de retour est copiée dans la fonction appelante. Toutes les variables utilisées à l'intérieur de la fonction sont détruites une fois la fonction terminée.

DÉBUT
VARIABLE a, b, c: ENTIER

FONCTION max(a: ENTIER, b: ENTIER)
    SI a > b:
        RETOURNER a
    RETOURNER b
FIN FONCTION
FIN


LIRE "Veuillez compléter la valeur de A:", a
LIRE "Veuillez compléter la valeur de B:", b

c <- max(a, b)

ÉCRIRE "La valeur maximum vaut", c
FIN
A chaque fois que la fonction est appelée, ce processus de création de nouvelle zone, copie et suppression est appliqué.

Exercices

  • Écrivez une fonction qui reçoit en paramètre une valeur n, qui calcule la somme des n premiers entiers.
Somme des n premiers entier
FONCTION SOMME(n: ENTIER)
    VARIABLE cpt,sum: ENTIER
    cpt<-0
    sum = 0

    TANT QUE cpt < n:
        sum <- sum + cpt
        cpt <- cpt + 1
    FIN TANT QUE

    RETOURNER sum
FIN FONCTION
  • Écrivez une fonction qui calcule la distance euclidienne entre deux points.
La distance euclidienne
FONCTION DIST(x1: RÉEL, x2: RÉEL, y1: RÉEL, y2: RÉEL)
    RETOURNER  ((x1-x2)²+(y1-y2)²)
FIN FONCTION
  • Écrivez une fonction qui détermine si une année est bissextile.
Année est bissextile
FONCTION BISSEXTILE(n: ENTIER)
    SI (a% 4 == 0 ET a % 100 != 0) OU (a % 400 == 0):
        RETOURNER VRAI
    FIN SI
    RETOURNER FAUX	
FIN FONCTION
  • Écrivez une fonction qui reçoit une date sous la forme de 3 entiers (jour, mois, année), qui détermine si la date donnée est valide.
La date est valide
FONCTION CheckDate(jours: ENTIER, mois: ENTIER, annee: ENTIER)
    VARIABLE maxJour: ENTIER
    maxJour<-31

    SI mois == 2:
        SI BISSEXTILE(annee):
            maxJour<-29
        SINON
            maxJour<-28
    SINON SI mois==4 OU mois==6 OU mois==9 OU mois==11
        maxJour<-30
    FIN SI

    SI mois>=1 ET mois<=12 ET jours>=1 ET jours<=maxJour:
        RETOURNER VRAI
    FIN SI

    RETOURNER FAUX
FIN FONCTION
Last Author
Steve
Last Edited
Sep 13 2020, 9:54 AM

Event Timeline

Steve edited the content of this document. (Show Details)Aug 18 2020, 3:42 PM
Steve created this object.
Steve edited the content of this document. (Show Details)Aug 18 2020, 3:49 PM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 18 2020, 4:22 PM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 18 2020, 4:24 PM
Steve edited the content of this document. (Show Details)Aug 21 2020, 8:40 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 8:42 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:13 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:16 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:19 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:21 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:32 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 9:50 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:08 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:11 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:15 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:17 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:20 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:22 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:27 AM
Steve edited the content of this document. (Show Details)Aug 21 2020, 10:49 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 11:20 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 11:24 AM
Steve edited the content of this document. (Show Details)
Steve edited the content of this document. (Show Details)Aug 21 2020, 12:15 PM
Steve changed the title from La découpe de problème en sous problème to La découpe de problèmes en sous problèmes.Aug 21 2020, 12:37 PM
Steve edited the content of this document. (Show Details)Aug 25 2020, 11:44 AM
Steve edited the content of this document. (Show Details)Sep 13 2020, 9:54 AM