Module 03 · Leçon 1
Les fonctions
Ce que vous saurez faire
- Définir une fonction qui retourne une valeur
- Appeler une fonction depuis un programme principal
- Distinguer paramètres formels et paramètres effectifs
Avant de commencer
Vous calculez le PGCD à 3 endroits différents dans un programme. Allez-vous réécrire le code 3 fois ? Et si l'algorithme change, modifier 3 endroits ? Les sous-programmes résolvent ce problème.
1. Pourquoi des sous-programmes ?
Un sous-programme est un bloc de code réutilisable, identifié par un nom. On le définit une fois, on l'appelle autant qu'on veut.
Deux familles :
- Fonction : retourne une valeur (comme une fonction maths).
- Procédure : produit un effet (affichage, modification de variables) mais ne retourne pas de valeur. Voir leçon suivante.
2. Syntaxe d'une fonction
DEF FN Carre(x : entier) : entier
Début
Carre ← x * x
Fin Carre
DEF FN Carre(x : entier) : entier
Début
Carre ← x * x
Fin Carre
FUNCTION Carre(x : integer) : integer;
BEGIN
Carre := x * x;
END;
Anatomie
Carre: nom de la fonction. Sert aussi à lui assigner son résultat (Carre ← x * xouCarre := x * x).x : entier: paramètre formel — le nom utilisé à l'intérieur.: entier(après le)): type de retour.
Appel
y := Carre(5); { y = 25 }
Writeln(Carre(3) + Carre(4)); { 9 + 16 = 25 }
5, 3, 4 sont les paramètres effectifs : les valeurs passées
au moment de l'appel.
3. Plusieurs paramètres
DEF FN Somme(a, b : entier) : entier
Début
Somme ← a + b
Fin Somme
DEF FN Somme(a, b : entier) : entier
Début
Somme ← a + b
Fin Somme
FUNCTION Somme(a, b : integer) : integer;
BEGIN
Somme := a + b;
END;
L'ordre compte : Somme(3, 7) ≠ Somme(7, 3) si on regarde uniquement
les paramètres formels (ici peu importe car somme est commutative).
4. Exemple complet
PROGRAM TestCarre;
VAR
n, r : integer;
FUNCTION Carre(x : integer) : integer;
BEGIN
Carre := x * x;
END;
BEGIN
Write('Entrez un entier : ');
Readln(n);
r := Carre(n);
Writeln(n, ' au carré = ', r);
END.
5. Variables locales
Une fonction peut avoir ses propres variables, invisibles depuis le programme principal :
FUNCTION Factorielle(n : integer) : integer;
VAR
i, f : integer; { variables locales }
BEGIN
f := 1;
FOR i := 1 TO n DO
f := f * i;
Factorielle := f;
END;
i et f n'existent que pendant l'exécution de la fonction. À la
fin, elles disparaissent.
6. Exercices
Écrire une fonction Max(a, b : entier) : entier qui retourne le plus
grand des deux. La tester dans un programme.
Voir le corrigé
PROGRAM TestMax;
VAR
x, y : integer;
FUNCTION Max(a, b : integer) : integer;
BEGIN
IF a > b THEN
Max := a
ELSE
Max := b;
END;
BEGIN
Readln(x, y);
Writeln('Max = ', Max(x, y));
END.
Écrire une fonction EstPremier(n : entier) : booléen qui retourne Vrai
si n est premier, Faux sinon. Tester pour n saisi par l'utilisateur.
Voir le corrigé
PROGRAM Premier;
VAR
n : integer;
FUNCTION EstPremier(n : integer) : boolean;
VAR
i : integer;
ok : boolean;
BEGIN
IF n < 2 THEN
ok := false
ELSE
BEGIN
ok := true;
i := 2;
WHILE (i * i <= n) AND ok DO
BEGIN
IF n MOD i = 0 THEN
ok := false;
i := i + 1;
END;
END;
EstPremier := ok;
END;
BEGIN
Readln(n);
IF EstPremier(n) THEN
Writeln(n, ' est premier')
ELSE
Writeln(n, ' n''est pas premier');
END.
Écrire Puissance(base, exposant : entier) : entier qui retourne
base^exposant. Cas particulier : Puissance(2, 0) = 1.
Voir le corrigé
FUNCTION Puissance(base, exp : integer) : integer;
VAR
i, p : integer;
BEGIN
p := 1;
FOR i := 1 TO exp DO
p := p * base;
Puissance := p;
END;
Si exp = 0, la boucle ne tourne pas et p reste à 1. Correct.
7. Erreurs fréquentes au bac
- Oublier d'assigner le résultat (
Carre := x * x;) — la fonction retourne une valeur indéfinie. - Confondre le nom de la fonction et un paramètre :
Carre := x;écrase le résultat avec une mauvaise valeur. - Appeler la fonction sans utiliser son retour (
Carre(5);au lieu dey := Carre(5);). - Définir une fonction après son utilisation dans le programme principal.
8. Quiz
Quiz (5 questions)
Comment retourne-t-on une valeur dans une fonction Pascal ?
Dans `FUNCTION F(a, b : integer) : integer;`, `a` et `b` sont :
Que retourne `Carre(3) + Carre(4)` avec `Carre(x)=x*x` ?
Les variables locales d'une fonction :
Quel type peut retourner une fonction Pascal ?