Cours 5 : fonctions, proc´edures, passage des param`etres
1
Fonctions et proc´edures
Id´ee : capitaliser sur le code d´ej`a ´ecrit pour introduire des nou-
velles ”commandes” et ”op´erations”.
On souhaite donner un nom programme que nous avons d´ej`a
´ecrit, et qui effectue une op´eration int´eressante, pour pouvoir le
r´eutiliser apr`es sans le r´e´ecrire. Si ce programme retourne un r´esultat,
on parlera de ”fonction”, et ”proc´edure” sinon.
De plus, on peut souhaiter choisir les valeurs de certaines vari-
ables de la proc´edure ou fonction, et cela se fait `a travers le mecha-
nisme de passage des param`etres.
Procedures: d´eclaration et appel
Chaque proc´edure aura:
1. Une d´efinition qui dit
(a) Le type des param`etres.
(b) comment on la calcule.
2. Un ou plusieurs appels: c’est l’utilisation de la proc´edure.
Exemples (sans param`etres)
Tous les programmes affichent un message d’aide `a l’utilisation, et
cela `a plusieurs occasions
procedure
aide ()
debut aide
ecrire "Aide du programme Machin."
ecrire " l’option -o permet de definir le fichier sortie"
ecrire " l’option -h donne ce message"
fin aide
...
programme Machin
debut Machin
...
aide()
Cours 5 : fonctions, proc´edures, passage des param`etres
2
...
si (erreur=vrai) alors aide() fin si
...
fin Machin
Exemples (avec param`etres)
Tous les programmes affichent des messages d’erreur
procedure
erreur (valeur s: cha^ıne de caract`eres)
debut erreur
ecrire "Programme Machin: on a renconter l’erreur" s
fin erreur
...
programme Machin
debut Machin
...
erreur("Entier trop grand")
Publicité
...
erreur("Pas assez de memoire")
...
fin Machin
Fonctions: d´eclaration et appel
Chaque fonction aura:
1. Une d´efinition qui dit
(a) Le type des param`etres.
(b) Le type de la valeur rendue.
(c) comment on la calcule.
2. Un ou plusieurs appels: c’est l’utilisation de la fonction.
3. Zero, un ou plusieurs param`etres: ce sont les arguments de la
fonction.
4. Un type et une valeur.
Cours 5 : fonctions, proc´edures, passage des param`etres
3
Exemples (sans param`etres)
fonction pi(): reel
debut pi
retourner 3.1415926535897931
fin pi
Exemple avec param`etres
La fonction suivante rend le maximum de deux valeurs de type
r´e´el.
fonction fmax(valeur a: reel, valeur b: reel) : reel
variables m : un reel
debut fmax
si (a > b)
alors
m <- a
sinon
m <- b
fin si
retourner m
fin fmax
de sorte que l’expression fmax(pi()*pi(),10.0) vaut 10.
Param`etres
En g´en´eral, une fonction ou proc´edure n’est utile que si elle a des
param`etres, comme dans le cas de fmax.
Une fonction ou proc´edure d´efinie avec des param`etres doit ˆetre
appel´ee avec des arguments (en nombre ´egal, et du mˆeme type!).
d´efinition de fonction appel de fonction
param`etre
argument
Cours 5 : fonctions, proc´edures, passage des param`etres
4
fonction fmax(valeur a: reel, valeur b: reel) : reel
...
programme essai
variables x: un reel
i,j: deux caracteres
Publicité
debut essai
lire x
ecrire fmax(x,x*x)
/ ecrire fmax(i,j) serait incorrect! /
fin essai
Nature des param`etres:
d´eclaration
Dans la declaration
fonction fmax(valeur a: reel, valeur b: reel) : reel
...
• a et b sont les param`etres de la fonction
• ils sont d´eclar´es avec leur type
• dans le corps de la fonction, on peut utiliser a et b comme des
variables,
qui existent exclusivement dans le corps de la fonction
• le mot cl´e valeur indique une modalit´e de passage des param`etres
Nature des param`etres: passage
par valeur
Apr`es la d´eclaration
fonction fmax(valeur a: reel, valeur b: reel) : reel
...
on peut effectuer un appel de la fonction comme
ecrire 3*fmax(x,y)
l’expression fmax(x,y) est ´evalu´ee de la fa¸con suivante:
• les valeurs de x et y sont calcul´ees
Cours 5 : fonctions, proc´edures, passage des param`etres
5
• les param`etres a et b de fmax sont initialis´es en utilisant ces
valuers
• le corps de la fonction fmax est execut´e, (cela utilise les param`etres
a et b comme des variables)
• le r´esultat de la fonction est enfin retourn´e et utilis´e pour con-
tinuer le calcul de l’expression (ici, on le multiplie par 3 et on
l’imprime)
Peu importe les op´erations effectu´ees sur a et b dans le corps de
fmax, les valeurs des param`etres actuels x et y restent inchang´es.
Limite du passage par valeur
On a souvent besoin d’´ecrire des proc´edure ou fonctions que, au con-
traire, modifient la valeur de certains param`etres, par exemple, on
voudrait ´ecrire une procedure echange t.q. echange(x,y) ´echange
les valeurs des variables x et y.
Mais la proc´edure
proc´edure echange (valeur a: entier, valeur b: entier)
variable t: un entier
debut echange
t <- a
a <- y
b <- t
fin echange
n’´echange pas les valeurs de ses arguments!
(relisez la description du passage d’arguments par valeur plus
Publicité
haut)
Comment faire?
Passage par r´ef´erence
Si on ´ecrit
proc´edure echange (reference a: entier, reference b: entier)
variable t: un entier
debut echange
t <- a
a <- y
b <- t
fin echange
Cours 5 : fonctions, proc´edures, passage des param`etres
6
le passage des param`etres se fait autrement: au moment de
l’appel
echange(i,j)
• on ne fait pas une copie des valeurs de i et j dans a et b!
• au contraire, on transforme a et b en ”alias” de i et j, en le
faisant pointer sur les memes cases m´emoire de i et j
• donc, toute op´eration effectu´ee sur les param`etres a et b dans
le corps de la proc´edure ou fonction et aussi effectu´e sur les
arguments i et j
N.B.: on doit passer comme argument d’un param`etre par r´ef´erence
seulement des expressions qui se comportent comme des variables
(par exemple, une variable, mais aussi une case d’un tableau etc.)
R´esum´e
• On d´eclare ”valeur” un param`etre si on ne veut pas que l’appel
modifie les arguments
• On d´eclare ”reference” un param`etre si on veut que l’appel
modifie les arguments
Bien sˆur, on peut melanger param`etres par valeur et par r´ef´erence.
ATTENTION:
• les tableaux sont toujours pass´e par r´ef´erence, et jamais copi´es,
mˆeme si on d´eclare le param`etres correspondant ”valeur”.
(Vous comprendrez les raisons de cela plus avant dans le cursus
informatique).
Un exemple complet: le tri par s´el´ection
Voyons comme ´ecrire un programme de tri par s´el´ection beaucoup
plus lisible avec les fonctions et les proc´edures.
Cours 5 : fonctions, proc´edures, passage des param`etres
7
Fonction de recherche du minimum `a partir d’un indice
fonction mintab(valeur i: un entier, reference a: tableau): entier
variable k: un entier
debut mintab
pour k <- i+1 a
N faire
si (a[k] < a[i]) alors
i <- k
fin si
fin pour
Publicité
retourner i
fin mintab
Programme de tri par s´el´ection
constante N=10
type tab = tableau de N entiers
procedure echange(reference a, reference b) ...
fonction mintab(valeur i: un entier, reference a: tableau): entier ...
programme triselection
variables a: tab
debut triselection
lire a
pour i <- 1 a N-1 faire
echange(a[i],a[mintab(i,a)])
fin pour
ecrire a
fin triselection
Cours 5 : fonctions, proc´edures, passage des param`etres
8
Et en C++?
#include <iostream.h>
const int N=10;
typedef int tab[N];
void echange (int &a, int &b)
{ int t;
t=a; a=b; b=t;
}
int mintab(int i, tab &a)
{ int k;
for(k=i+1;k<N;k++){if (a[k] < a[i]) {i =k;};};
return(i);
}
void lire(tab &a)
{ int k;
for (k=0;k<N;k++){cout<<"a["<<k<<"] ? "<<endl; cin>>a[k];};
}
void ecrire(tab &a)
{ int k;
for (k=0;k<N;k++){cout<<"a["<<k<<"] = "<<a[k]<<endl;};
}
void main(){
tab a;
int i;
lire(a);
for (i=0;i<N-1;i++){echange(a[i],a[mintab(i,a)]);};
ecrire(a);
}