Vous êtes sur la page 1sur 9

LMD / S.T.

Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

Chapitre 4 : Les Fonctions et Procdures (les Sous-Programmes)

4.1. Introduction
En gnral, les problmes qui se posent en pratique sont suffisamment complexes et qui
ncessitent leurs dcomposition en sous problmes plus faciles rsoudre sparment. De l vient
l'ide de dcomposition d'un programme complexe en sous-programme (fonction et procdures)
plus facile crire et contrler. Ces fonctions et procdures une fois rassembles, peuvent
communiquer des rsultat entre elles et avec le programmes principal.
Une autre raison d'usage des fonctions et procdures est pour viter de redondances de codes
dans le programme. Considrons l'exemple suivant pour illustrer ce dernier cas.
Soit calculer le rapport suivant :
(X1 + X2 + X3 + .. + Xn) / (Y1+ Y2 + Y3 + . + Yn)
On remarque que le numrateur et le dnominateur se s e calculent de la mme faon. Si on
utilise ps des fonction ou procdures, on risque de rpter dans le programme des squences
semblables d'instructions (redondance) ce qui nuit la clart du programme, sa lisibilit et
contiendra plusieurs squences semblables d'instructions (le nombre d'instructions est multipli par
2).
Afin de rendre le programme plus lisible et rduire le nombre d'instruction (moins d'espace
mmoire), on fait appel des fonctions et procdures.
Dans le cas prcdent, du moment que le numrateur et le dnominateur se calculent de la mme
faon, on crit une seule fonction SOMME qui permet de calculer la somme de n valeurs
quelconques. Soit : V1 + V2 + + Vn
Pour calculer le rapport, il suffira d'appeler la fonction SOMME deux fois en transmettant X dans
V, puis en transmettant Y dans V.

4.2. Notion du Sous-Programme

Un sous-programme (procdures ou fonction) est un programme l'intrieur d'un autre


programme. Il possde la mme structure qu'un programme. Il peut tre appel par le programme
principal ou par un autre sous-programme pour raliser un certain traitement et leur retourner des
rsultats.
Le schma suivant illustre le mcanisme d'appel et retour des sous-programmes.
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

PP

BEGIN SP1 SP2


BEGIN BEGIN

END. END.
END.

PP : Programme Principal
SP1 : Sous-Programme 1 END.
SP2 : Sous-Programme 2

4.3. Structure Gnrale d'un Programme PASCAL comportant des Procdures et


des Fonctions (Sous-Programmes)

La structure gnrale d'un programme PASCAL comportant des fonctions et des procdures est
comme suit :
Program <Nom_Programme>;
uses wincrt;

<Dclaration des tiquettes ventuelles>;


<Dclaration des constantes ventuelles>;
<Dclaration des types ventuels>;
<Dclaration des variables ventuelles>;
<Dclaration des fonctions>;
<Dclaration des procdures>;

BEGIN
<Instruction 1>;
<Instruction 1>;
<Instruction 1>;
......
......
......
<Instruction N>;
END.
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

Dclaration d'une Procdure


Une procdure est dclare comme suit :
Procedure <Nom_Procedure>[(<param1>:<type>; <param2>:<type>; <paramN:typeN)];
<Dclaration des constantes>;
<Dclaration des variables>;
<Dclaration des tiquettes>;
Begin
<instruction 1>;
<instruction 2>;
<instruction 3>;
.......
.......
<instruction N>;
End;

Ce qui entre crochets [ ] n'est pas obligatoire si on a pas besoins.


Une procdure est dclare en utilisant le mot cl Procedure, elle possde ventuellement des
paramtres. On peut avoir des procdures sans paramtres, ou avec un ou plusieurs paramtres. Elle
possde aussi, ventuellement, une partie dclarations pour dclarer des constantes et/ou des
variables (et aussi mme des procdures/fonctions). Enfin, une procdure possde un corps qui
contient les instructions excuter (le traitement que la procdure ralise).
On prend l'exemple suivant :
procedure afficher;
begin
writeln('Exemple de procdure ...');
end;
Dans cette exemple, la procdure afficher ne possde aucun paramtre, elle n'a pas de dclaration
et elle contient une seule instruction qui affiche la chane de caractre 'Exemple de procdure '.
On modifier la procdure prcdente comme suit :
procedure afficher(message : String);
begin
writeln(message);
end;
Cette dernire procdure possde un paramtre appel message de type chane de caractres
(String) et c'est le message qui sera affich par l'instruction writeln; Cette dernire instruction
affiche le message puis elle saute la ligne. On fait une autre modification de la procdure :
procedure afficher(message : String, sauterLigne:boolean);
begin
write(message);
if (sauterLigne = TRUE)
writeln ;
end;
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

Et comme a on aura deux paramtre, le premier est le message afficher et le deuxime est un
boolen indiquant si on saute la ligne aprs le message ou non.
Les diffrents paramtres que nous avons vu jusqu' maintenant sont des paramtre avec un
passage par valeur ; il y a aussi le passage de paramtres par variables (voir les points 4.5).

Dclaration d'une fonction


Une fonction est dclare comme suit :
function <Nom_Fonction>[(<p1>:<type1>;<p2>:<type2>; <pN:typeN)]:<typeFonction>;
<Dclaration des constantes>;
<Dclaration des variables>;
<Dclaration des tiquettes>;
Begin
<instruction 1>;
<instruction 2>;
<instruction 3>;
.......
.......
<instruction N>;
<Nom_Fonction> := <valeur|variable|expression>;
End;

Ce qui entre crochets [ ] n'est pas obligatoire si on a pas besoins.


Une fonction est dclare en utilisant le mot cl Function, elle possde ventuellement des
paramtres. On peut avoir des fonctions sans paramtres, ou avec un ou plusieurs paramtres. La
diffrence entre une fonction et une procdure est qu'une fonction possde un type de retour. Elle
possde aussi, ventuellement, une partie dclarations pour dclarer des constantes et/ou des
variables (et aussi mme des procdures/fonctions). Enfin, une fonction possde un corps qui
contient les instructions excuter (le traitement que la procdure ralise). Une deuxime diffrence
entre une procdure et une fonction est que cette dernire doit avoir toujours la fin de son crops
l'instruction <Nom_Fonction> := <valeur|variable|expression>; qui reprsente la valeur que
cette fonction doit retourner (le rsultat de la fonction).
On prend l'exemple suivant :
function somme : real;
begin
somme := 5 + 2;
end;
Cette fonction calcul la somme de deux nombre (ici c'est 5 et 2). Cette fonction est obsolte, pour
cela on l'amliore comme suit :
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

function somme (a, b:real) : real;


begin
somme := a + b;
end;
Maintenant la fonction somme est plus logique, elle prend deux paramtres a et b et elle ralise
leur somme.
On prend un autre exemple suivant :
function fact(n:integer) : integer;
var
i, f:integer;
begin
f:=1;
for i:=1 to n do
f := f*i;
fact := f;
end;
C'est quoi le rle de la fonction fact ? On remarque bien que cette fonction possde une variable
local i, qui est utilis pour parcourir tous les nombre entre 1 et n.

Exemple de procdure et fonction avec leurs appels:


Program Simple;
uses wincrt;
var
a, b, s, p, real;

function Somme(x, y : real) : real;{x et y passage par valeur}


Begin
somme := x+y;
End;

proccedure Produit(x, y : real ; var z:real);{x et y passage par valeur


et z passage par variable}
Begin
z := x*y;
End;

BEGIN {Dbut du programme principal}


read(a, b);

s := Somme (a, b); {appel la fonction Somme}


Produit (a, b, p); {appel la fonction Produit}

Writeln('La somme de a et b = ', s);


Write('Le produit de a et b = ', p);
END. {Fin du programme principal}
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

4.3. Structure d'une fonction et d'une procdure :

La structure d'une fonction est compose de son en-tte qui commence obligatoirement par le
mot-cl FUNCTION suivi du nom de la fonction et ventuellement de ses paramtres, puis du type
du rsultat. Un fonction peut comporter des dclarations diverses (de variables, constantes,
tiquettes, types, variables, autres fonctions ou procdures, etc.), suivi par BEGIN, les instructions
de la fonction termine par END;
Pour la structure d'une procdure, elle comporte galement de son en-tte qui doit
obligatoirement commencer par le mot-cl PROCEDURE suivi du nom de la procdure et
ventuellement de ces paramtres. La suite est similaire la fonction.
Remarque :
La diffrence entre une fonction et une procdure rside dans les deux points suivants :
Une fonction possde un type, tandis qu'une procdure ne possde pas de type.
Une fonction retourne un seul rsultat dans le nom de la fonction, le type de rsultat est le
mme que celui de la fonction, tandis qu'une procdure peut retourner plusieurs rsultats dans ses
diffrents paramtres.

4.5. Transmission (Passage) des paramtres et retour des rsultats

La communication des fonctions et procdures entre elles et avec le programme principal se fait
par le mcanisme de transmission de paramtres, on distingue quatre types d'changes de
paramtres :
Les paramtres transmis par variables ;
les paramtres transmis par valeurs ;
les paramtres fonction ;
les paramtres procdure.

Les paramtres transmis par variables


On utilise la transmission par variable lorsqu'on veuille que la variable du paramtre formel dans
la fonction ou procdure affecte le paramtre effectif correspondant au niveau du programme
appelant. Dans ce cas, le paramtre formel doit tre prcd du mot-cl VAR. Le paramtre effectif
correspondant doit tre, obligatoirement, une variable.
En d'autres termes, on utilise un transmission par variables lorsqu'on veut recueillir le rsultat
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

dans cette variable. (Variable rsultat).


Exemple :
Dans le cas prcdent de l'appel la procdure Produit, on a voulu raliser un appel avec un
passage de paramtres par variable avec P (variable P) pour obtenir le produit dans cette variable :
Produit (a, b, p). a, b et p sont des paramtre effectifs (ceux qui sont utiliss dans l'appel),
cependant, dans la dclaration proccedure Produit(x, y : real ; var z:real);,
les paramtres x, y et z sont dits paramtres formels (ceux qui sont utiliss dans la dclaration).
P est un paramtre effectifs, il doit tre dclar comme variable (ce qui est fait).
Z est un paramtre formel, il doit tre prcd par VAR (ce qui est fait).
Ainsi, la variable Z affectera la variable P. C'est dire la variable P prendra la dernire valeur de
Z obtenu dans la procdure Produit.

Les paramtres transmis par valeurs


Dans ce cas, le paramtre effectif peut tre une constante, une expression arithmtique ou une
variable. De plus le paramtre formel ne doit pas tre prcd du mot-cl VAR. La variation du
paramtre formel dans la fonction ou procdure n'affecte pas le paramtre effectif correspondant au
niveau du programme appelant.
Exemple :
L'appel Produit (a, b, p) selon a et b est un appel par valeur car les paramtre formels X et Y
correspondant ne sont pas prcds par VAR. La variation de x et y dans la procdure n'affectera pas
les valeurs de a et b. restent inchangs mme si X et Y changent dans la procdure.
Excution du programme prcdent (fonction Somme et procdure Produit) :
Excution de Read(a, b) : 4 5 [entre]
Appel de la fonction Somme (a, b)/ a=4 et b=5 et excution de cette on fonction. On obtient
9 dans Somme. Ainsi S := 9
Appel de la procdure Produit (a, b, p)/ a=4 et b=5 et excution de cette procdure. 4 passe
dans x et 5 passe dans y, calcule de z dans la procdure et transfert de z dans p. Rsultat p=20.
Writeln ('La somme de a et b = ', s) : affichage de : La somme de a et b = 9
Write ('Le produit de a et b = ', s) : affichage de : Le produit de a et b = 20
Rsultat :
Pour a = 4 et b = 5, le programme affichera :
La somme de a et b = 9
Le produit de a et b = 20
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

Les paramtres fonction


Dans ce cas, un nom de fonction est utilis comme paramtre. On doit alors indiquer que le
paramtre formel correspondant est une fonction le prcdant du mot cl FUNCTION.
Exemple :
program Params_Fonctions;
var
......
PROCEDURE Proc1(..., Function F:real, ...);
var ...
Begin
....
....
End;

FUNCTION G(...) : real;


var ...
Begin
....
....
End;
BEGIN {Dbut du programme principal}
...
Proc1(..., G, ...); {Appel de la procdure Proc1 avec un
paramtre fonction}
...
END. {Fin du programme principal}

Les paramtres procdure


Dans ce cas, un nom de procdure est utilis comme paramtre. On doit alors indiquer que le
paramtre formel correspondant est une procdure en le prcdant du mot-cl PROCDURE.

Remarque : Ces deux dernier type de passage (transmission) de paramtre (paramtres fonction
et paramtres procdure) ne pas inclus dans les examens.
LMD / S.T. Chapitre 4 : Les Fonctions et Procdures (Sous-Programmes)

Exercice d'Application
a) On veut crire un programme PASCAL qui calcule le nombre Cnk = k! / (n! (n-k)!).
tel que n! = 1 2 3 4 ... n et 0! = 1
Program combinaisonSansFonction; Program combinaisonAvecFonction;
uses wincrt; uses wincrt;
var
var n, k, c : integer;
n, k, c : integer; nf, kf, nkf : integer;
nf, kf, nkf : integer; i:integer;
i:integer;
Function factoriel(n:integer):integer;
Begin {Dbut du programme principal} var
read(n, k); j, f:ineger;
Begin
nf := 1; f:=1;
For i:=1 To n Do for j:=1 to n do
nf := nf * i; f:= f*j;
factoriel := f;
kf := 1; End;
For i:=1 To k Do
kf := kf * i; BEGIN {Dbut du programme principal}
read(n, k);
nkf := 1;
For i:=1 To (n-k) Do nf := factoriel(n);
nkf := nkf * i; kf := factoriel(k);
nkf := factoriel(n-k);
c := kf / (nf * nkf);
write('Combinaison n k = ', c); c := kf / (nf * nkf);
End. {Fin du programme principal} write('Combinaison n k = ', c);
END. {Fin du programme principal}

Les deux programmes calculent la combinaison C(n, k) (est un nombre entier positif ou nul qui
reprsente le nombre d'ensembles possibles de k lments constitus partir de n lments).
Dans le premier programme, combinaisonSansFonction, on remarque qu'il y trois boucles de
for qui calculent chacune d'elle un factoriel (la premire calcule le factoriel de n, la deuxime le
factoriel de k et la dernire calcule le factoriel de (n-k)), c'est le mme traitement qui se rpte.
Alors que dans le deuxime programme, combinaisonAvecFonction, dans le programme
principal il n y a aucune boucle, cependant, on a trois appels la fonction factoriel avec diffrents
paramtres effectifs.

Vous aimerez peut-être aussi