Académique Documents
Professionnel Documents
Culture Documents
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 Problème initial est
une suite ordonnée des sous algorithmes de résolution de tous les sous Problèmes (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 à le 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>
Begin
<instructions>
End ;
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 ALGORITHM
En-Tête VAR ….
Déclaration des variables
EEeenN
Déclaration Procedure …
Déclaration des des Var…
Procédures
Procédures Begin
…..
End ;
Corps de l’algorithme
principal Begin
….
End.
Exemple :
Algorithm Etoile ;
Var i, j : Integer ;
Procedure Etoile3 ;
Begin
For i1 To 3 Do
For j 1 To 10 Do Write(‘ * ‘) Done;
Writeln;
Done ;
End ;
Begin
Etoile3 ;
/*un autre traitement ……….*/
Etoile3 ;
/* un autre traitement……….*/
Etoile3 ;
End.
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
b) Les variables locales :
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 :
Algorithm global_local ;
Var V1 :Integer ;
Procedure P ;
Var V2 :Integer;
Begin
V2 1000 ;
Write(V2) ;
End;
Begin
V1 3 ; P ; Write(V1) ;
End.
Algorithm Variables ;
Var
Val : Integer ;
Procedure P ;
Var
Val : Integer ;
Begin
Val 1000 ;
Write (‘dans la procédure Val= ‘, Val) ;
End;
Begin {Algorithm Principal}
Val 3 ;
P ; {l’appel de la procédure}
Write (‘après l’’appel à la procédure Val= ‘, Val) ;
End.
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
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 Input.
Pour déclarer le paramètre valeur, il suffit de placer le mot clé Input abrégé en (I /) 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 (par exemple le langage Pascal
évaluera l’expression et initialisera le paramètre de la procédure avec cette valeur).
Exemple :
On veut afficher 3 lignes de 10 (‘*’) puis 3 lignes de M (‘$’) et puis 3 lignes de M+10 (‘#’) ;
Algorithm Parametres ;
Var
M : Integer ;
Procedure dessin (I/ C :character ; I/ X :Integer) ;
Var i, j :Integer ;
Begin
For i1 To 3 Do
For j 1 To X Do Write(C); Done;
Writeln ;
Done ;
Xx+10;
End ;
Begin
Dessin(‘*’,10) ; {constante}
Read(M) ;
Dessin(‘$’,M) ; write(M) {constante et variable}
Dessin(‘#’,M+10) ; {constante et expression}
End.
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.
33
Exemple :
Algorithm parametre_valeur ;
Var
X : Integer ;
Procedure Test (I/ y: Integer);
Begin
yy+10;
Write (y); {ici y=15}
End;
Begin
X5;
Test(X);
Write(X); {ici X=5}
End.
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 Input/Output ou en mode Output en plaçant devant son nom le mot clé
en abrégé (I-O/) ou (O/)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.
34
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.
- 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). I/
- Le paramètre Variable IMPORTE et EXPORTE des valeurs .I-/
Exemple :
Algorithm Parametres ;
Var
x : Integer;
Procedure passage_Valeur (I / y : Integer) ;
Begin
Write (y); 6
yy+4; 10
Write (y) ; 10
End ;
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 ;
Begin
….
End;
Procédure B ;
Begin
….
End;
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.
Procedure A ;
Var….
Procedure B ;
Begin /*de B
….
End;
Begin {debut des actions de A}
…. B; …
End;
A peut appeler B.
Procedure A ;
Var ….
Procedure B ;
Var…
Procédure C ;
Begin
….
36
End;
Begin {parti actions de B}
…C;…
End;
Procedure D ;
Begin
….B; …
End;
Begin {partie actions de A}
…. B; …D; …
End;
***************************************
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 Procedure.
- 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 : Integer, Real, Character, Boolean,
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).
37
Exemple :
Ecrire une action qui retourne le maximum de deux nombres entiers.
Algorithm traitement_fonction ;
Var
nb1, nb2, Max : Integer ; /* même entête de fonction */
Fonction maximum (E/ n1, n2 : Integer) : Integer ; /* une 2eme possibilité*/
Fonction maximum(n1,n2…
Begin var m :Integer ;
Begin
If (n1>n2) Then maximumn1 If (n1>n2) Then mn1
Else maximumn2; Else mn2;
EIf ; Eif ;
maximumm ; ou return(m) ;
End ; /* fin de fonction*/
End; /* fin de fonction*/
Remarque :
1- On peut remplacer les instructions :
2- Dans la fonction il ne faut pas utiliser le nom de la fonction dans une évaluation
d’expression (partie droite d’une expression).
Exemple : ecrire un Algorithme qui permet de donner la somme des nombres premiers dans
l’intervalle 1..N .
Algorithm SomPrem ;
…..
Fonction premier(E/x :Integer) :Boolean ;
Var
D,I,m :Integer;
Begin
D0 ;mx DIV 2;
For i2 To m Do
If x Mod i=0 Then DD+1 ; Eif ;
Done;
If D=0 And x<>1 Then premierTrue Else premierFalse ;
Eif ;
End ;
38
Begin
….
S0 ;
For i1 to N Do
If premier(i)=True Then ss+i; Eif;
Done;
…
End.
V Effet de bord :
La communication entre une AP et un Algorithme 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.
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 :
Algorithm side_effect ;
Var
R,V :Integer ;
Begin
V V-X ;
diff 2*X ;
End ;
Begin
V 2 ; R diff(2)*diff(V) ; Write (R,V) ; { diff(2)=4, diff (V)=0 résultat (0,0) }
V 2 ; R diff(V)*diff(2) ; Write (R,V) ; { diff(V)=4, diff (2)=4 résultat (16,-2)}
End.
39
VI Les tableaux comme paramètres dans les actions paramétrées :
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 (I/) ou bien
en entrée/sortie(I_O/)).
Lorsqu’un tableau constitue l’un des paramètres formels de l’action paramétrée.
Sa déclaration étant dans l’entête de l’AP a : Array [1..10] of Integer , est trop longue on la
remplace par une déclaration d’un type défini dans la partie TYPE de l’algorithme.
Algorithm type_structure ;
Type
vecteur = Array [1..20] of Real ;
Nom = Array [1..10] of Character ;
Var
Notes : vecteur ;
Client : Nom ;
Begin
…
End;
Algorithm type_structure ;
Var
Notes : Array [1..20] of Real ;
Client : Array [1..10] of Character ;
VI.2 Exemples :
Algorithm Somme_elements ;
Type
matrice = Array [1..10 ,1..20] of Integer ;
Var
Mat :matrice
40
Som :Integer ;
Begin
For i…../*on suppose que lecture de Mat est déjà faite */
For j……
Algorithm inverser_elements ;
Type
Vecteur = Array [1..30] of Real;
Var
T :vecteur ;
I,Taille :Integer ;
Begin
Read (taille) ;
For I 1 To taille Do Read( T[I] ); Done ;
inverser (taille, T) ;
For I 1 To taille Do Write (T[I]) ; Done ;
End.
41