Chapitre 5-5
Chapitre 5-5
Chapitre 5-5
I. Introduction :
L’objet de ce chapitre est de présenter un moyen très puissant pour structurer un algorithme. Il
s’agit des procédures et fonctions, appelées aussi actions paramétrées.
En effet un problème peut être décomposé en plusieurs sous problèmes et chaque sous
problème donne lieu à un sous algorithme. L’algorithme de résolution de Pb initial est une
suite ordonnée des sous algorithmes de résolution de tous les sous Pbs (Les différents
algorithmes sont relativement indépendants).
Définition d'une action paramétrée : Une action paramétrée est un sous algorithme qui
contient un ensemble d'instructions auquel on associer un nom (IDF) qui à partir de certains
données, elle nous fournit certain nombre de résultats. Ces données et ces résultats sont
appelées Arguments ou Paramètres.
Intérêt de l’A.P:
a)Lisibilité : si l’algorithme trop long ⇒ penser à la décomposer en A.P.
b)Réutisabilité : l’A.P est définie une seul fois est peut être utilisée plusieurs fois.
c)Modifiabilité : il suffit de changer l’A.P sans toucher à l’algorithme principal.
III.1 Définition :
Une procédure nous permet de désigner par un nom un ensemble d’instructions. Depuis
l’algorithme principal, il suffit d’invoquer ce nom, et les instructions de la procédure seront
exécutées à ce moment.
29
III.2 Syntaxe :
Procedure <identificateur> ;
<partie déclaration de la procédure>
debut
<instructions>
fin ;
La déclaration d’une procédure est donc similaire à la déclaration d’une variable, mais ici
nous déclarons une action, alors que pour une variable nous déclarons une donnée.
Remarques :
La procédure est placée avant l’algorithme principal.
Dans le cas ou des paramètres sont associés à la procédure, alors sa déclaration devient :
Exemple de réutilisabilité :
30
En-tête ALGORITHME………
En-Tête VAR ….
Déclaration des variables
EEeenN
Déclaration Procedure …
Déclaration des des
Procédures
Procédures debut
…..
fin ;
Corps de l’algorithme
principal debut
….
fin.
Exemple :
Algorithme Etoile ;
Var
i, j : entier ;
Procedure Etoile3 ;
debut
Pour i1 à 3
faire
Pour j 1 à 10 faire ecrire(‘ * ‘) ; fait;
fait ;
fin ;
debut
Etoile3 ;
/*traitement ……….*/
Etoile3 ;
/*traitement……….*/
Etoile3 ;
Fin.
Lorsqu’une variable est utilisée par l’algorithme principal, ou par plusieurs procédures, nous
devons la déclarer en tête de l’algorithme. Ces variables sont appelées des variables globales.
Il est souvent conseillé de réduire l’utilisation des variables globales et ceci dans le but de
limiter d’éventuels effets de bord (voir le paragraphe IV).
31
Les variables déclarées à l’intérieur d’une procédure sont appelées variables locales. Une
variable est déclarée localement car nous n’en n’avons besoin que dans la procédure et elles
ne sont accessibles que par celle-ci.
Remarque : les variables locales ne sont utilisables que dans la procédure où elles sont
déclarées et elles sont créées au moment où nous entrons dans la procédure puis détruites
lorsque nous quittons cette procédure, leur durée de vie est donc celle de la procédure.
Exemple :
Algorithme global_local ;
Var
V1 :entier ;
Procedure P ;
Var V2 :entier;
debut
V2 1000 ;
ecrire(V2) ;
Fin;
debut
V1 3 ; P ; ecrire(V1) ;
fin.
Algorithme Casse-cou ;
Var
Val : entier ;
Procedure P ;
Var
Val : entier ;
debut
Val 1000 ;
ecrire (‘dans la procédure Val ‘, Val) ;
Fin;
debut {Algorithme Principal}
Val 3 ;
P ; {l’appel de la procédure}
ecrire (‘après l’appel à la procédure Val ‘, Val) ;
fin.
*****************************************************************mercredi
Remarques :
- L’avantage majeur de la déclaration de variables locales est l’économie de la place
mémoire.
- L’Algorithme principal ne peut pas utiliser les variables locales (elles n’existent pas
lorsque nous sommes dans l’algorithme principal).
- Même si nous avons une variable locale qui a le même nom qu’une variable globale, il ne
s’agit pas de la même zone donc leurs valeurs sont distinctes.
Si on veut tracer trois lignes de dix fois le caractère $, on ne peut pas utiliser (directement) la
procédure etoile3 car elle est figée puisqu’elle ne contient pas de paramètres.
32
Dans la suite de ce chapitre, nous nous intéressons à la déclaration de procédure contenant
une liste de paramètres après le nom de la procédure, comme c’est déjà expliqué dans la
remarque du paragraphe III.2
a) Paramètre VALEUR :
Supposons que nous voulons tracer trois lignes contenant dix fois le caractère * puis trois
lignes de dix fois le caractère $ puis trois lignes de dix fois le caractère #. Au lieu d’écrire
trois procédures, il existe un moyen plus économique, celui d’introduire des paramètres.
Définition :
Pour écrire des procédures d’ordre général, nous utilisons des paramètres. Ces paramètres
permettent de fournir à la procédure la valeur à utiliser pour initialiser les variables, on les
appelle alors des paramètres VALEUR, correspondant au mode de transmission par valeur
encore appelé, le mode Entrée.
Pour déclarer le paramètre valeur, il suffit de placer le mot clé Entrée abrégé en (E /) devant
son nom.
En fait nous pouvons aussi appeler la procédure en utilisant comme paramètre valeur, soit des
constantes, soit des variables, ou encore des expressions (qui est évaluée puis initialisée)
Exemple :
On veut afficher 3 lignes de 10 (‘*’) puis 3 lignes de M (‘$’) et puis 3 lignes de M+10 (‘#’) ;
Algorithme Paramètre ;
Var
M : entier ;
Procedure dessin (E/ C :caractère ; E/ X :entier) ;
Var i, j :entier ;
debut
Pour i1 à 3
faire
Pour j 1 à X faire écrire (C) Fait;
fait ;
fin ;
debut
dessin(‘*’,10) ; {appel avec constante}
lire(M) ;
dessin(‘$’,M) ; { appel variable}
dessin(‘#’,M+10) ; {expression}
fin.
Remarques :
- Dans le corps de la procédure les paramètres sont utilisés comme si c ‘était des variables
locales. C’est à dire si la valeur du paramètre valeur change dans la procédure, ce
changement n’est pas valable dans l’algorithme principal.
- Lors de l’exécution des instructions de la procédure, les valeurs initiales de ces « variables
locales particulières » sont les valeurs des variables qui sont indiqués au moment de
l’appel.
Exemple :
Algorithme paramètre_valeur ;
Var
X : entier ;
33
Procedure Test (E/ y: entier);
debut
yy+10;
écrire (y); {ici y=15}
fin;
debut
X5;
Test(X);
ecrire(X); {ici X=5}
Fin.
b) Paramètres VARIABLE :
Selon l’exemple précédent si on veut modifier la valeur de X, c’est à dire afficher dans
l’algorithme principal la valeur obtenue dans la procédure, il suffit donc de déclarer ce
paramètre en mode Entrée/Sortie en plaçant devant son nom le mot clé en abrégé (E-S/) Ce
type de paramètre s’appelle paramètre variable. C’est en fait, une transmission par adresse que
nous allons expliquer par la suite.
Cette procédure manipule alors directement cette variable. La zone du paramètre contiendra
donc l’adresse de cette variable.
Compte tenu de ce mécanisme, les paramètres variables sont aussi appelés paramètres par
adresse.
Remarques :
- On appelle les variables décrites dans l’entête de la procédure les paramètres FORMELS.
- On appelle les variables fournis par l’algorithme appelant lors de l’appel de la procédure
les paramètres EFFECTIFS ou REELS.
34
- Il doit y avoir une correspondance absolue en nombre, en type et en ordre entre les
paramètres formels et les paramètres effectifs.
Conclusion :
- Le paramètre Valeur IMPORTE dans la procédure une valeur (dont la procédure se sert
pour effectuer ses traitements). E/
- Le paramètre Variable IMPORTE et EXPORTE des valeurs.E-S/
Exemple :
Algorithme paramètre ;
Var
x : entier ;
Procedure passage_Valeur (E / y : entier) ;
debut
ecrire (y); 6
yy+4; 10
ecrire (y) ; 10
Fin ;
debut
x2;
ecrire (x); x= 2
passage_Valeur (3*x);
ecrire(x); /*affiche 2*/ x= 2
passage_Variable(x);
Écrire (x); /*affiche 7*/ x=7
fin.
35
Algorithme principal la procédure A
<partie déclaration>
debut début
-----
------
---- fin ;
appeler la procédure A ;
-----
-----
----- la procédure B
appeler la procedure B ;
----- début
----
---
---- fin ;
Fin.
Lors d’un appel imbriqué de procédures nous devons respecter les points suivants :
- Respect de transmission des paramètres.
- Respect de retour de l’action appelée vers l’action appelante.
- Chaque action paramétrée doit avoir un début et une fin bien déterminés.
- Une action paramétrée ne peut appeler que les actions qu’elle englobe directement et
celles du même niveau mais déclarés avant elle.
1-On peut déclarer plusieurs actions l’une après l’autre ou encore une action à l’intérieure
d’une autre action.
Var
Procédure A ;
début
….
Fin;
Procédure B ;
début
….
Fin;
2- Si une action est à l’intérieure d’une autre action, c’est celle qui est à l’extérieure qui
appelle celle qui est à l’intérieure.
36
Procedure A ;
Var….
Procedure B ;
Début /*de B
….
Fin;
debut {debut des actions de A}
…. B; …
fin;
Procedure A ;
Var ….
Procedure B ;
Var…
Procédure C ;
debut
….
fin;
debut {parti actions de B}
…C;…
fin;
Procedure D ;
debut
….B; …
fin;
debut {partie actions de A}
…. B; …D; …
fin;
***********************************************************lundi
IV Les Fonctions :
IV.1 Définition :
Une fonction est une action paramétrée qui rend systématiquement un résultat à travers le
nom de la fonction.
IV.2 Syntaxe :
La déclaration d’une fonction est similaire à celle d’une procédure sauf qu’il faut :
- utiliser Fonction et non pas Procédure
- indiquer le type de la fonction (c-à-d le type du résultat de la fonction)
Remarques :
- Le résultat peut être de n’importe quel type simple : entier, réel, caractère, booléen,
chaîne de caractères (mais pas le type structuré comme le type tableau)
- Tout ce qui a été dit au niveau des procédures (variables locales et globales,
paramètres valeur) sont valables pour les fonctions.
- Il ne faut pas oublier d’affecter une valeur à la fonction (identificateur) dans le corps
de la fonction (sinon, l’algorithme retournera n’importe qu’elle valeur (exactement
comme une variable non initialisée)
Exemple :
Ecrire une action qui retourne le maximum de deux nombres entiers.
Algorithme traitement_fonction ;
Var
nb1, nb2, Max : entier ;
Fonction maximum (E/ n1, n2 : entier) : entier ; /* une 2eme possibilité*/
debut var m :entier ;
debut
si (n1>n2) alors maximumn1 si (n1>n2) alors mn1 ;
Sinon maximumn2; Sinon mn2;
fsi ; fsi ;
fsi ; maximumm ; ou retourne(m) ;
fin;
debut
lire (nb1, nb2);
Maxmaximum (nb1, nb2);
ecrire (Max) ;
Fin.
Remarque :
1- On peut remplacer les instructions :
V Effet de bord :
La communication peut être effectuée de deux manières :
- Une communication explicite à travers la transmission de paramètres par valeur.
- Une communication implicite à travers la transmission des variables globales.
38
Une communication implicite est moins contrôlable, moins souple car c’est toujours la même
variable qui est utilisée à chaque exécution de l’action paramétrée. Cette méthode nécessite
que l’algorithme appelant connaisse les détails de l’action appelée, sans quoi des erreurs
imprévues peuvent avoir lieu.
Exemple :
Algorithme side_effect ;
Var
R,V :entier ;
Fonction diff (E/ X : entier) :entier ;
debut
V V-X ;
diff 2*X ;
fin ;
debut
V 2 ; R diff(2)*diff(V) ; ecrire (R,V) ; { diff(2)=4, diff (V)=0 résultat (0,0) }
V 2 ; R diff(V)*diff(2) ; ecrire (R,V) ; { diff(V)=4, diff (2)=4 résultat (16,-2)}
Fin.
Ce que nous avons décrit, sur le passage de paramètres simple est valable lorsqu’il s’agit de
types structurés, en particulier, en ce qui concerne le mode de passage (en entrée ou bien en
entrée/sortie).
Lorsqu’un tableau constitue l’un des paramètres formel de l’action paramétrée.
sa déclaration étant dans l’entête de l’AP a : tableau [1..10] d’entier , est trop longue on la
remplace par une déclaration d’un type défini dans la partie TYPE de l’algorithme.
Algorithme type_structuré ;
Type
vecteur = tableau [1..20] de réel ;
Nom = tableau [1..10] de caractère ;
Var
Notes : vecteur ;
Client : Nom ;
Algorithme type_structuré ;
Var
Notes : tableau [1..20] de réel ;
Client : tableau [1..10] de caractère ;
VI.2 Exemples :
Algorithme Somme_éléments ;
Type
matrice = tableau [1..10 ,1..20] d’entier ;
Var
Mat :matrice
Som :entier ;
DEBUT
/*on suppose que lecture de Mat est déjà faite */
som somme (mat) ;
ecrire (‘la somme est :’, som );
FIN.
Algorithme inverser_éléments ;
Type
Vecteur = tableau [1..30] de réels;
Var
40
T :vecteur ;
I,Taille :entier ;
debut
Lire (taille) ;
Pour i 1 à taille faire lire( T[I] ); fait ;
inverser (taille, T) ;
Pour i 1 à taille faire écrire (T[I]) ; fait ;
FIN.
41