Cours d'algorithme

Les procédures et les fonctions


Introduction

● Les procédures et fonctions permettent d'isoler des instructions dans un sousprogramme interne au programme principal.

● Les Avantages

La complexité: Lorsque l'algorithme est complexe, il est préférable d'organiser les instructions au sein de procédures ou fonctions afin de faciliter la logique globale du programme.

La réutilisabilité: Lorsqu'une séquence d'instructions est répétée plus d'une fois dans un programme, on peut la regrouper dans une procédure ou fonction.

Les procédures

● Une procédure est une suite d'instructions servant à réaliser une tâche précise en fonction d'un certain nombre de paramètres (arguments).

Déclaration

● Dans le pseudo-langage, une procédure se déclare de la manière suivante:
PROCEDURE nom_de_la_procedure (type_param nom_param, type_param nom_param, ...)
Variables locale
DEBUT
actions
FIN

Appel

● Pour utiliser (ou appeler) la procédure dans un programme appelant, on écrit: Nom_de_la_procédure ( variable1, variable2, variable3, variable4, ...)

● A chaque paramètre on associe un nom de variable connue dans le programme appelant ou bien une valeur

Remarque:

Les variables que l'on déclare localement à la procédure ne sont connues que dans cette procédure.

Exemple d'échange de variables

● Algorithme qui lit deux nombres réels et permute leurs valeurs.


Algorithme Echange
Variables a, b, c : réel
Début
Ecrire("Entrez un nombre:")
Lire(a)
Ecrire("Entrez un nombre:")
Lire(b)
c ← a
a ← b
b ← c
Fin

Algorithme Echange
PROCEDURE échanger (réel V1, réel V2)
Variables tmp : réel
Début
tmp ← V1
V1 ← V2
V2 ← tmp
Fin

Variables a, b, c : réel
Début
Ecrire("Entrez un nombre:")
Lire(a)
Ecrire("Entrez un nombre:")
Lire(b)
échanger(a, b)
Fin

Algorithme Echange
PROCEDURE échanger (réel V1, réel V2)
Variables tmp : réel
Début
tmp ← V1
V1 ← V2
V2 ← tmp
Fin

PROCEDURE lecture (réel V3)
Début
Ecrire("Entrez un nombre:")
Lire(V3)
Fin

Variables a, b, c : réel
Début
lecture(a)
lecture(b)
échanger(a, b)
Fin
Exemple de remplissage de tableaux

● Algorithme qui déclare deux tableaux d'entiers de taille 10 et lit un entier a, et remplit le premier tableau avec des 1 et le deuxième avec la valeur de a.


Algorithme Remp_Tab
Variables a, i : entier
Tableau tab1[10], tab2[10] : entier
Début
Ecrire("Entrez un nombre:")
Lire(a)
Pour i De 0 A 9 Faire
tab1[i] ← 1
FinPour
Pour i De 0 A 9 Faire
tab2[i] ← a
FinPour
Fin

Algorithme Remp_Tab
PROCEDURE remplissage (entier nombre, entier Tableau tab[10])
Variables i : entier
Début
Pour i De 0 A 9 Faire
tab[i] ← nombre
FinPour
Fin

Variables a, i : entier
Tableau tab1[10], tab2[10] : entier
Début
Ecrire("Entrez un nombre:")
Lire(a)
remplissage(1, tab1)
remplissage(a, tab2)
Fin

Remarque:

Le nombre de paramètres dans l'appel d'une procédure doit correspondre au nombre de paramètres de la procédure lors de sa définition.

Le type du kième paramètres dans l'appel d'une procédure doit correspondre au type du kième paramètre de la procédure lors de sa définition.

Passage par valeur

● Lorsque nous souhaitons que la valeur d'une variable du programme appelant ne soit pas modifiée, elle devra alors être passée par valeur.

● La procédure ou la fonction qui la manipule recevra cette valeur en entrée du programme mais il s'agira de la copie en mémoire de la valeur de la variable d'origine.

● Dans notre pseudo, le passage par valeur est indiqué par le mot clé val.

Passage par référence

● Lorsque nous utilisons le passage d'une valeur par référence, nous indiquons non sa valeur mais la référence en mémoire de celle-ci. Ainsi, la procédure ou fonction manipule donc le même espace de mémoire.

● Toute modification apportée à la variable manipulée par la fonction ou procédure touchera donc la variable d'origine.

● Attention donc au choix effectué lors de la transmission des paramètres à une procédure!

● Dans notre pseudo, le passage par référence est indiqué par le mot clé var.

● Exemple:


Algorithme Remp_Tab
PROCEDURE échanger (VAR entier V1, entier V2)
VariablesTableau tmp : entier
Début
tmp ← V1
V1 ← V2
V2 ← tmp
Fin

Variables Tableau tab[10], i : entier
Début
Ecrire("Entrez un valeur:")
Lire(a)
Pour i De 0 A 9 Faire
tab[i] ← a
FinPour
Pour i De 0 A 4 Faire
éhanger(tab[i], tab[11-i])
FinPour
Fin

Les fonctions

● Une fonction est une procédure dont le but est de déterminer une valeur et de la retourner au programme appelant.

● Dans le pseudo-langage, elle se déclare de la manière suivante:
type FONCTION nom_de_la_fonction ( type nom, type nom, ...)
Déclarations de variables locales
Début
actions
Retourne valeur
Fin

● Les mêmes remarques que pour la procédure s'appliquent.

● De plus, il faut noter que la fonction retourne une valeur et que donc à la déclaration on doit indiquer son type, c'est à dire le type de cette valeur.

● Une fonction ne retourne jamais un tableau.

● Pour utiliser une fonction dans un programme appelant, on l'appelle de la façon suivante:
variable ← nom_de_la fonction ( variable1 , valeur2 , variable3 ...)

● Exemple: Ecrire une fonction qui retourne la somme de deux entiers.


Algorithme add_func
entier FONCTION somme (entier a, entier b)
VariablesTableau S : entier
Début
S ← a + b
Retourne S
Fin

Variables i, j, k : entier
Début
Ecrire("Entrez un nombre:")
Lire(i)
Ecrire("Entrez un nombre:")
Lire(j)
k ← somme(i, j)
Ecrire("la somme est ", k)
Fin

La Récursivité

● Définition: Un algorithme est dit récursif lorsqu'il est défini en fonction de lui même.

● Récursivité simple: La fonction puissance x → xn. Cette fonction peut être définie récursivement:

Math Syntax

Itération et Récursivité

● Exemple: Calcul de factoriel

Pres_iter pres_rec

● Un module (fonction ou procédure) peut s'appeler lui même: on dit que c'est un module récursif.

● Tout module récursif doit posséder un cas limite (cas trivial) qui arrête la récursivité.

● Liste des appels de la fonction factoriel (cas du n=4).

factorial list

● Une fonction est définie récursivement lorsque la valeur de la fonction en un point x est définie par rapport à sa valeur en un point strictement "plus petit".
De ce fait, le calcul se fait de proche en proche, jusqu'à atteindre le plus petit élément pour lequel il faut une valeur immédiate (c'est-à-dire non récursive).
Le corps d'une fonction récursive doit toujours exprimer un choix, soit par une expression conditionnelle, soit par une définition par cas.
Au moins un cas terminal rend une valeur qui n'utilise pas la fonction définie.