Dès qu’un programme nécessite une grande quantité de code, on se retrouve vite dans une situation où le code ressemble à un pâté. Posant ainsi de nombreux problèmes lorsqu’il s’agit de trouver des erreurs ou d’effectuer des modifications. Existe-t-il des moyens d’organiser ses instructions et de subdiviser un programme en plusieurs petits programmes ?
Nous allons utiliser des sous-programes pour subdiviser un programme. Il en existe deux types :
Une procédure est un ensemble d’instructions portant un nom
La syntaxe permettant d’en créer une est la suivante :
Par exemple,
On exécute une procédure en utilisant son nom.
On dit aussi que l’on appelle la procédure, ou encore qu’on l’invoque.
Par exemple, l’instruction.
exécute la procédure afficheBonjour, on dit aussi qu’on appelle la procédure afficheBonjour. Ainsi il existe deux façons de rédiger le même algorithme :
Sans procédure
et avec une procédure
Vous pouvez définir autant de procédures que vous le voulez et vous pouvez appeler des procédures depuis des procédures :
Une variable locale est une variable déclarée dans une procédure.
On peut par exemple réaliser une procédure affichant les dix premiers nombres entiers en déclarant un compteur dans la procédure :
Attention : une procédure ne peut pas utiliser les variables locales d’une autre procédure. Par exemple, ceci est mal :
Un identificateur est un nom choisi par le programmeur.
Tout ce qui n’est pas choisi par le programmeur entre dans la catégorie suivante : Un mot-clé (ou mot réservé) est un mot imposé par le langage de programmation.
Par exemple,
Les mots Si, fin, alors procedure... sont des mots-clés. Vous vous douterez que les mots réservés le sont parce qu’il est impossible de les choisir comme nom de variable.
Il y a passage de paramètre lorsque la procédure appelante transmet une information à la procédure appelée.
L’exemple suivant permet d’afficher une valeur déterminée en dehors de la procédure :
Dans l’exemple ci-avant, la valeur 4 est recopiée dans la variable x puis est affichée par la procédure afficheValeur. Cet extrait affiche donc la valeur 4.
On aurait tout à fait pu utiliser une variable à la place du 4 :
Attention : titi et x sont deux variables différentes ! Modifier l’une n’a aucun effet sur l’autre. Certes titi est recopiée dans x lors de l’appel de la procédure afficheValeur, mais il ne s’agit de rien de plus que d’une affectation entre ces deux variables.
Pour éviter toute confusion entre titi et x, nous utiliserons la terminologie suivante :
Dans l’exemple suivant, formel est le paramètre formel et effectif le paramètre effectif.
Il est possible de passer plusieurs valeurs en paramètre :
Cette procédure peut s’appeller de la façon suivante :
Lors de cet appel, A est recopié dans x et B est recopié dans y.
Tentons d’échanger les valeurs de deux variables dans une procédure :
On peut appeler cette procédure de la façon suivante :
L’exécution de ce sous-programme laisse les valeurs de A et B inchangées :
Deux identificateurs de variables i et j sont des alias s’ils représentent la même variable.
Autrement dit, les valeurs de i et j sont liées, dans le sens ou modifier l’une revient aussi à modifier l’autre.
Dans le cas de l’échange de deux variables, pour que des modifications sur x et y soient répercutées sur A et B, il faudrait que x soit un alias de A et que y soit un alias de B. Pour ce faire, nous allons utiliser un passage de paramètre par référence :
Il y a passage de paramètre par :
Lors d’un passage de paramètres par référence, on transmet non pas les valeurs des variables, mais les variables elles-mêmes.
Passage de paramètres par valeur :
Passage de paramètres par référence.
On résumera les choses ainsi :
Il existe un autre mécanisme permettant au sous-programme appelé de transmettre une information au sous-programme appelant : celui des valeurs de retour. Une fonction est un sous-programme fait pour transmettre une unique valeur au sous-programme appelant. On dit que cette valeur est retournée.
La fonction Un() transmet 1 au sous-programme appelant.
Une fonction se déclare
On retourne une valeur avec l’instruction
La fonction carre prend en paramètre une valeur x et retourne la valeur x2.
On peut appeler une fonction de plusieurs façons :
On remarque que l’utilisation des fonctions est davantage souple que celle des procédures :
La notion de fonction en tant que sous-programme est à mettre en parallèle avec celle de fonction mathématique.
La fonction f(x) = 3x + 1 est une correspondance entre une valeur quelconque x et celle que l’on obtient en multipliant x par 3 et en lui ajoutant 1.
On l’appelle :
On peut considérer que l’antécédent est x et que la valeur retournée est l’image de la fonction.