Aller au contenu
M02 · B. Formuler un traitement

Fonctions, procédures et portée des variables

Structurer un algorithme en sous-programmes, passer des paramètres par valeur ou par référence, et distinguer variables globales et locales.

1Situer

Le programme de caisse grossit : il calcule des remises à plusieurs endroits, affiche des tickets, vérifie des saisies. Le même bloc de code est recopié trois fois, et une correction oubliée à un endroit a causé une erreur de caisse. Il est temps de ranger le code dans des sous-programmes.

2Comprendre

Appel d'une fonction : une case mémoire à part
ALGORITHME Fonction Carre(n) : entier Retourner n * n FinFonction Début x ← 4 r ← Carre(x) Ecrire(r) MÉMOIRE Carre n = 4 → 16 principal x = 4 r = ? 16 Console : 16

Le programme principal range 4 dans x. Pour l'instant, r est inconnue.

1 / 6

Quand un algorithme devient long, on le découpe en sous-programmes : des blocs nommés que l’on peut appeler plusieurs fois. C’est la suite naturelle de l’approche descendante (leçon A.2).

Fonction et procédure

Fonction Carre(n : entier) : entier
Début
  Retourner n * n
FinFonction

Procédure AfficherEtoiles(n : entier)
Variables
  i : entier
Début
  Pour i ← 1 jusqu'à n Faire
    Ecrire("*")
  FinPour
FinProcédure
  • Une fonction calcule et retourne une valeur : on l’utilise dans une expression, r ← Carre(x).
  • Une procédure réalise une action sans retourner de valeur : on l’appelle seule, AfficherEtoiles(5).

Paramètres par valeur ou par référence

  • Par valeur (par défaut) : le sous-programme reçoit une copie. L’appelant ne voit pas les changements.
  • Par référence (Var) : le paramètre désigne la variable de l’appelant. Les changements sont visibles. L’appel doit donner un nom de variable, pas une valeur.

La portée des variables

  • Une variable globale est déclarée en haut de l’algorithme : tout le monde la voit.
  • Une variable locale est déclarée dans un sous-programme : elle n’existe que pendant l’appel.

Préférez les paramètres aux variables globales : un sous-programme qui ne dépend que de ses paramètres est plus facile à tester et à réutiliser.

Exemple simple

La fonction, une recette réutilisable

La recette « préparer un msemen » est écrite une fois. Ensuite on l'appelle autant de fois qu'on veut, avec des ingrédients différents. Une fonction, c'est pareil : on l'écrit une fois, on l'appelle souvent.

Exemple simple

Calculer la TVA partout dans le programme

Au lieu de recopier « prix × 1,2 » à dix endroits, on écrit une fonction TTC et on l'appelle. Si le taux change, on ne corrige qu'un seul endroit.

Fonction TTC(ht : réel) : réel
    Retourner ht * 1.2
FinFonction

Ecrire(TTC(100))   // 120
Ecrire(TTC(250))   // 300

3Manipuler

Avancez pas à pas jusqu'à l'appel Carre(x). Observez le panneau Variables : un nouveau bloc apparaît pour la fonction, puis disparaît au Retourner.
Autres exemples :Plein écran

4Pratiquer

Exercice 1 · Fonction Maximum

Écrivez une fonction Max(a, b : entier) : entier qui retourne le plus grand des deux, puis utilisez-la pour afficher le maximum de trois nombres lus au clavier.

Voir un indice

Le maximum de trois nombres est Max(Max(a, b), c).

Voir le corrigé
Algorithme MaxDeTrois
Variables
  x, y, z : entier

Fonction Max(a : entier, b : entier) : entier
Début
  Si a > b Alors
    Retourner a
  Sinon
    Retourner b
  FinSi
FinFonction

Début
  Lire(x)
  Lire(y)
  Lire(z)
  EcrireAvecSaute("Maximum : ", Max(Max(x, y), z))
Fin

Exercice 2 · Procédure Echanger

Écrivez une procédure qui échange les valeurs de deux variables de l'appelant. Pourquoi faut-il le mot Var ?

Voir le corrigé
Procédure Echanger(Var a, b : entier)
Variables
  tmp : entier
Début
  tmp ← a
  a ← b
  b ← tmp
FinProcédure

// Sans Var, la procédure travaillerait sur des copies :
// les variables de l'appelant ne changeraient pas.

5Vérifier

1. Quelle est la différence entre une fonction et une procédure ?
2. Un paramètre passé par valeur (sans Var)...
3. Une variable déclarée dans une procédure est...