Fonctions
Ce que ce chapitre apporte
- Comprendre l'intérêt de structurer un programme en fonctions.
- Savoir définir, appeler et utiliser une fonction.
- Comprendre la différence entre paramètre, argument et valeur de retour.
- Suivre ce qui se passe pendant un appel : interruption, passage des valeurs, retour.
- Savoir ce qu'une fonction voit et ne voit pas, et pourquoi ses variables disparaissent.
- Être capable de construire des algorithmes clairs et modulaires.
Quand un même traitement revient à plusieurs endroits, le recopier est la garantie qu'un jour on corrigera l'un et pas les autres. Une fonction lui donne un nom, des entrées et une sortie : on l'écrit une fois, on l'appelle partout. C'est aussi ce qui permet de lire un algorithme long sans le lire en entier.
Qu'est-ce qu'une fonction ?
Une fonction est un bloc d'instructions regroupées sous un nom, qui exécute une tâche précise. Une fois définie, elle peut être appelée plusieurs fois depuis différents endroits de l'algorithme.
On peut comparer une fonction à une machine-outil dans un atelier :
on lui donne un nom (ex. « machine à calculer »), on lui fournit éventuellement une ou plusieurs données d'entrée, et elle renvoie un résultat.
Exemple
programme principal
aucune variable
Bonjour
aucune variable
Ce que Écrire a affiché
Bonjour !Cet algorithme définit une fonction Bonjour qui affiche un message. Elle est ensuite appelée deux fois depuis le programme principal. Plutôt que de recopier les mêmes instructions, on les regroupe dans une seule fonction réutilisable.
Déclaration et appel de fonction
La structure générale d'une fonction est la suivante :
et pour l'appeler :
nom()
L'intérêt est de factoriser le code : si une action se répète plusieurs fois, il suffit de l'écrire une seule fois dans une fonction, puis de l'appeler à chaque besoin.
Exemple
programme principal
aucune variable
Ligne
aucune variable
Ce que Écrire a affiché
----------Ce qui s'affiche :
----------
Bienvenue
----------
Les deux traits encadrent le texte, et c'est tout l'intérêt de l'exemple : la même instruction sert deux fois, à deux endroits, sans être recopiée. Changer la longueur du trait se fait alors à un seul endroit.
Les fonctions permettent donc de rendre un algorithme plus lisible, plus organisé, et plus facile à maintenir.
Paramètres et arguments
Un paramètre est une donnée transmise à une fonction pour qu'elle puisse travailler avec. Lorsqu'on appelle la fonction, la valeur fournie est appelée argument.
Autrement dit, les paramètres servent de ponts entre le programme principal et la fonction.
Exemple
programme principal
aucune variable
Bonjour
Ce que Écrire a affiché
Bonjour Alice !Ici, la fonction Bonjour reçoit un paramètre nom. Quand on appelle Bonjour("Alice"), la variable nom prend temporairement la valeur "Alice". La fonction devient donc un modèle générique que l'on peut réutiliser avec différentes valeurs.
Une fonction peut avoir plusieurs paramètres séparés par des virgules :
L'appel Somme(4, 7) affichera alors Résultat : 11.
Valeur de retour
Une fonction peut renvoyer une valeur au programme principal. Cette valeur peut ensuite être utilisée dans un calcul ou stockée dans une variable.
Pour renvoyer une valeur, on utilise l'instruction Retourner.
Exemple
programme principal
La fonction Carré calcule le carré du nombre reçu et renvoie le résultat au programme principal.
L'intérêt est que la fonction ne se contente plus d'agir, elle produit un résultat réutilisable.
C'est un principe fondamental : un bon programme est composé de fonctions qui effectuent des tâches précises et renvoient des résultats clairs.
Ce qui se passe pendant un appel
Le mot « temporairement », employé plus haut, cache la moitié du chapitre. Voici l'enchaînement exact, sur resultat ← Carré(5).
- Le programme principal s'interrompt sur cette ligne. Il ne continue pas en parallèle : il attend.
- Le paramètre
xde la fonction est créé et reçoit la valeur5. - Le corps de la fonction s'exécute, et lui seul.
Retourner x * xcalcule25, sort immédiatement de la fonction, et rend cette valeur.- Le paramètre
xcesse d'exister. - Le programme principal reprend là où il s'était arrêté,
Carré(5)ayant été remplacé par25.
programme principal
Les six étapes ci-dessus se suivent ici une par une. La colonne x n'existe que pendant l'appel et disparaît au retour : c'est la portée, que le chapitre décrit ensuite, et elle se voit avant de se définir.
Carré(5) ne se lit plus comme un appel mais comme le nombre 25. C'est pourquoi on peut écrire resultat ← Carré(5) + 1, ou passer l'appel directement à Écrire. Une fonction qui retourne une valeur s'emploie partout où l'on écrirait cette valeur.
La portée : ce qu'une fonction voit et ne voit pas
C'est le point qui surprend le plus, et il découle de l'étape 5 ci-dessus.
Les variables créées dans une fonction, paramètres compris, n'existent que pendant son exécution. On dit qu'elles sont locales. Depuis le programme principal, elles sont invisibles ; après l'appel, elles ont disparu.
programme principal
aucune variable
Carré
Les deux dernières lignes échouent, et c'est voulu. x et resultat appartiennent à la fonction ; le programme principal ne les a jamais vues. La seule chose qui ressort d'une fonction est ce qu'elle retourne.
x une variable du programme principal alors qu'une fonction a déjà un paramètre x. Ce sont deux boîtes différentes, qui portent la même étiquette dans deux pièces différentes.Modifier le
x de la fonction ne touche donc pas celui du programme principal. C'est une protection, pas une gêne : elle garantit qu'appeler une fonction ne peut pas abîmer ce qui l'entoure, et c'est ce qui rend les fonctions réutilisables sans les relire.
Retourner.Une fonction qui aurait besoin de dix informations extérieures pour travailler est le signe qu'elle en fait trop, et qu'il faut la couper en deux.
Vérification
1.Écrire 2 * x et Retourner 2 * x dans une fonction : quelle différence ?
2.Pendant l'exécution de resultat ← Carré(5), que fait le programme principal ?
3.Après v ← Carré(5), la variable x de la fonction vaut quoi dans le programme principal ?
4.Une fonction a un paramètre x, et le programme principal a aussi une variable x. Que se passe-t-il ?
5.Par où une fonction communique-t-elle avec le reste du programme ?
Exercices type
Écrivons chaque fonction, puis son appel : une fonction qu'on n'appelle jamais ne sert à rien.
Exercice 1 : écrire une fonction Double(x) qui renvoie le double d'un nombre, et l'appeler pour x = 8.
Afficher la solution
programme principal
aucune variable
Double
Retourner renvoie la valeur et sort immédiatement de la fonction. Le programme principal récupère cette valeur dans resultat, comme si Double(8) était le nombre 16.
Écrire Écrire 2 * x à l'intérieur de la fonction au lieu de Retourner 2 * x. La fonction affiche alors le résultat mais ne le rend pas : impossible de le réutiliser dans un calcul. Afficher et retourner ne sont pas la même chose.
Exercice 2 : écrire une fonction Moyenne(a, b) qui renvoie la moyenne de deux nombres, et la tester avec 10 et 16.
Afficher la solution
programme principal
aucune variable
Moyenne
Les parenthèses autour de a + b sont indispensables : sans elles, a + b / 2 calculerait a + (b / 2), soit 18 au lieu de 13.
On peut appeler la fonction directement dans le Écrire : la valeur retournée prend la place de l'appel.
Exercice 3 : écrire une fonction EstPair(n) qui renvoie Vrai si le nombre est pair, Faux sinon.
Afficher la solution
programme principal
Une fonction peut renvoyer un booléen, c'est-à-dire Vrai ou Faux. Elle s'utilise alors directement comme condition : Si EstPair(n) Alors se lit « si n est pair ».
Version plus courte, puisque la comparaison produit déjà un booléen :
La méthode
- Nommer la fonction par ce qu'elle rend, pas par ce qu'elle fait de compliqué. Un nom qui demande une explication signale un découpage à revoir.
- Lister ce qui entre et ce qui sort. Les paramètres sont les entrées, la valeur retournée est la sortie. Tout le reste est du travail interne.
- Retourner plutôt qu'afficher. Une fonction qui écrit à l'écran ne sert qu'une fois ; une fonction qui retourne se réutilise partout.
- Se rappeler que l'appel se lit comme une valeur. Une fois la fonction terminée, son appel occupe la place d'un nombre ou d'un texte.
- Vérifier la portée. Les variables d'une fonction disparaissent à sa sortie, et deux variables de même nom dans deux endroits différents ne sont pas la même.
- Tester la fonction seule, sur trois valeurs, avant de l'employer dans un algorithme plus grand.
Synthèse
- Une fonction est un bloc d'instructions réutilisable, désigné par un nom.
- Les paramètres lui transmettent des données ; la valeur de
Retourneren ressort. - Afficher n'est pas retourner :
Écriremontre à l'utilisateur,Retournerrend une valeur au programme. - Une fonction qui renvoie un booléen s'emploie directement comme condition.
- Les variables d'une fonction sont locales : elles naissent à l'appel et disparaissent au retour.
- Une fonction ne communique que par deux portes : les paramètres à l'entrée,
Retournerà la sortie.
Mettre en pratique
Retourner plutôt qu'afficher, l'appel qui vaut une valeur, et ce qu'une fonction ne voit pas.
- Retourner ou afficher3 · Confirmé
- L'appel vaut une valeur3 · Confirmé
- Ce que la fonction ne voit pas4 · Avancé