Vous êtes sur la page 1sur 14

Chapitre 5

Procdures et fonctions
5.1 Introduction
Considrons le programme suivant, dont le but est dinverser les lments dun tableau :
public class InversionTableau1 {
public static void main(String args[]) {
int t[]= {8, 2, 1, 23};
Terminal.ecrireStringln("Tableau avant inversion");
for (int i= 0; i < t.length; i++) {
Terminal.ecrireInt(t[i]);
if (i != t.length -1)
Terminal.ecrireChar( );
}
Terminal.sautDeLigne();
// Inversion du tableau
int a= 0; int b= t.length -1;
while (a < b) {
int tmp= t[a];
t[a]= t[b];
t[b]= tmp;
a++;
b--;
}
Terminal.ecrireStringln("Tableau aprs inversion");
for (int i= 0; i < t.length; i++) {
Terminal.ecrireInt(t[i]);
if (i != t.length -1)
Terminal.ecrireChar( );
}
Terminal.sautDeLigne();
}
}

Le code affiche le tableau, linverse, et enfin, affiche le tableau invers. On remarque que le code
qui affiche le tableau est identique les deux fois. Cest gnant, pour plusieurs raisons :
a prend de la place ;
mais surtout, si lon saperoit que lalgorithme daffichage est faux, ou quon veut amliorer
la prsentation, il faut aller le modifier tous les endroits o on la crit.
1

5.1. INTRODUCTION

CHAPITRE 5. PROCDURES ET FONCTIONS

Dautre part, le programme est long et peu lisible. On pourrait lamliorer un peu laide de
commentaires, mais il restera difficile de sy retrouver dans la masse du code.
Au lieu de cela, nous allons crer une procdure que nous appellerons afficherTableau,
qui contiendra le code daffichage. De mme nous isolerons le code qui inverse le tableau dans une
procdure appele inverserTableau, et le code deviendra :
public class InversionTableau2 {
public static void main(String args[]) {
int t[]= {8, 2, 1, 23};
Terminal.ecrireStringln("Tableau avant inversion");
afficherTableau(t);
inverserTableau(t);
Terminal.ecrireStringln("Tableau aprs inversion");
afficherTableau(t);
}
public static void afficherTableau(int t[]) {
for (int i= 0; i < t.length; i++) {
Terminal.ecrireInt(t[i]);
if (i != t.length -1)
Terminal.ecrireChar( );
}
Terminal.sautDeLigne();
}
public static void inverserTableau(int t[]) {
int a= 0; int b= t.length -1;
while (a < b) {
int tmp= t[a];
t[a]= t[b];
t[b]= tmp;
a++;
b--;
}
}
}

Nous dtaillerons les lments de ce programme plus tard. Pour linstant, on constate que lutilisation de procdures permet :
dviter des copier-coller ;
dcrire du code plus lisible.
de rutiliser des bouts de code dun programme lautre ;
Ce que fait le main est comprhensible immdiatement : on affiche le tableau, on linverse, puis
on affiche le tableau invers. On peut lire et comprendre cette partie du code en faisant abstraction des
dtails, cest dire ici de la manire dont on affiche ou dont on inverse le tableau.
Par ailleurs, laffichage et linversion sont isols dans les procdures, et chacune dentre elle est
comprhensible sparment, ce qui amliore la lisibilit du code.
Enfin, nous verrons que les procdures peuvent tre rutilises dun programme lautre, ce qui
vite de rinventer la roue. On peut ainsi se construire une bibliothque avec des procdures frquemment utilises, pour navoir pas besoin de les rcrire.
2

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.2. PROCDURES

5.2 Procdures
Une procdure est un bout de code qui a un nom et qui peut tre appel depuis le reste du programme.
En java, une procdure est forcment dclare dans une classe. Dans sa forme la plus simple, elle
sexprime ainsi :
public static void nomDeLaProcdure () {
Corps de la procdure...
}

Supposons par exemple que nous voulions faire une jolie prsentation, entrecoupe de lignes de
60 astrisques. Nous pourrions lcrire :
public class Lignes1 {
public static void main(String args[]) {
dessinerLigne();
Terminal.ecrireStringln("Un texte bien encadr");
dessinerLigne();
Terminal.ecrireStringln("Aprs la ligne");
Terminal.sautDeLigne();
Terminal.sautDeLigne();
dessinerLigne();
}
public static void dessinerLigne() {
for (int i= 0; i < 60; i++) {
Terminal.ecrireChar(*);
}
Terminal.sautDeLigne();
}
}

La procdure dessinerLigne est dfinie dans la classe Lignes1. Par convention, en java, le
nom dune procdure est suppos commencer par une minuscule.
La procdure est appele plusieurs fois dans le main (qui, soit dit en passant, est aussi une procdure). Lappel dune procdure a la forme :
nomDeLaProcdure() ;
Les parenthses () sont obligatoires. Nous verrons leur raison dtre trs bientt.
Lors de lappel, le code de la procdure est excut, puis on revient dans le main, lendroit de
lappel, et le code du main se poursuit.
Une procdure peut en appeler dautres. On pourrait par exemple crer la procdure
dessinerDeuxLignes() :
public class Ligne1 {
... mme code que prcdemment...
public static void dessinerDeuxLignes() {
dessinerLigne();
dessinerLigne();
}
}

c
NFA031 CNAM
2012

5.2. PROCDURES

CHAPITRE 5. PROCDURES ET FONCTIONS

Cette procdure appelle la procdure dessinerLigne dj crite.

5.2.1 Variables locales


On a dj vu que les variables dclares lintrieur dun bloc taient locales ce bloc, cest-dire quelles nexistent que durant lexcution du bloc. Cela reste vrai pour les variables dclares
dans les procdures.
De plus, comme les procdures sont un moyen pour dcouper le code en units plus ou moins
indpendantes, que lon souhaite pouvoir modifier et comprendre indpendamment les unes des autres,
la question des variables locales y est dune grande importance.
Une variable locale nexiste que le temps de lexcution de la procdure qui la dclare. Si deux
mthodes dclarent des variables de mme noms, ces variables sont compltement distinctes.
Ainsi, dans le programme suivant :
public class VarLocales {
public static void dessinerLigne() {
int a= 0;
while (a < 60) {
Terminal.ecrireChar(*);
a= a+1;
}
Terminal.sautDeLigne();
}
public static void main(String args[]) {
int a= 20;
dessinerLigne();
Terminal.ecrireIntln(a);
}
}

Nous avons deux variables nommes n a z : une qui est dclare dans le main, lautre qui est
dclare dans dessinerLigne. Quand le main appelle la procdure dessinerLigne, une seconde variable, nomme n a z est dfinie. Elle est compltement diffrente de la premire, et occupe
un autre espace mmoire.
Le dbut de lexcution du programme donne donc la trace suivante :
ligne a (de main) a (de dessinerLigne)
13
20
(nexiste pas)
14
20
(nexiste pas)
4
20
0
5
20
0
6
20
0
7
20
1
... excution de la boucle ...
9
20
60
15
20
(nexiste pas)
La variable a dfinie dans le main existe jusqu la fin de lexcution de celui-ci. La variable a de
dessinerLigne est cre au dbut de lexcution de dessinerLigne, et disparat la fin de
lexcution de cette procdure.
4

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.2. PROCDURES

On remarquera que
dans dessinerLigne, on ne n voit z pas les variables dfinies dans le main. Celles-ci
occupent une place en mmoire, mais on ne peut pas y accder (ni a fortiori les modifier)
depuis dessinerLigne.
si on appelait plusieurs fois dessinerLigne partir du main, chaque appel correspondrait
une nouvelle variable a, initialise 0. Cest normal, puisque les variables locales des appels
prcdents auront t dtruites.

5.2.2 Arguments dune procdure


Le systme que nous venons de dcrire est un peu trop rigide. On dsire trs souvent fournir des
informations la procdure pour quelle adapte son comportement en consquence. Dans notre cas,
on pourrait par exemple vouloir choisir la longueur de la ligne au moment de lappel (alors quil est
actuellement fix une fois pour toutes 60).
Pour cela, on va utiliser des arguments. Lide est de pouvoir appeler la procdure en crivant
dessinerLigne(30);
pour dessiner une ligne de 30 *.
n 30 z est ici un argument, cest dire une information passe la procdure lors de son appel.
Cest
le
mme
mcanisme
qui
est
mis
en
uvre
quand
nous
appelons
Terminal.ecrireStringln("bonjour tout le monde"),
Terminal.ecrireIntln(x*2) ou Terminal.ecrireDouble(z). Dans tous ces
cas, "bonjour tout le monde", x*2 et z sont des valeurs passes en paramtre aux mthodes
ecrireStringln, ecrireIntln et ecrireDouble.
Dclaration dune procdure avec arguments
Une procdure peut donc avoir une liste darguments (ventuellement vide). Cette liste, ainsi que
le nom de la procdure, constitue ce que lon appelle la signature de la procdure.
On dclare les arguments entre parenthses, juste aprs le nom de la procdure. On dclare
un argument comme une variable, en le faisant prcder de son type. Ainsi, la nouvelle procdure
dessinerLigne pourrait scrire :
public class ProcedureAvecArguments {
public static void dessinerLigne(int longueurLigne) {
for (int i= 0; i < longueurLigne; i++) {
Terminal.ecrireChar(*);
}
Terminal.sautDeLigne();
}
... suite de la classe...

La mthode pourra tre appele depuis une autre procdure de la mme classe (par exemple depuis
main). Pour appeler une procdure qui prend des arguments, on crit le nom de la procdure, suivi des
valeurs des arguments, entre parenthses.
....
public static void main(String args[]) {
int k= 50;

c
NFA031 CNAM
2012

5.2. PROCDURES

CHAPITRE 5. PROCDURES ET FONCTIONS

dessinerLigne(k);
dessinerLigne(k/2);
dessinerLigne(k/4);
}
}

Une procdure peut aussi avoir plusieurs arguments. Notre mthode dessinerLigne actuelle
utilise forcment le caractre *. Il serait intressant de pouvoir dessiner des lignes de - ou de +,
par exemple. Cest possible en crant une mthode avec plusieurs arguments :
public class ProcedureAvecArguments2 {
public static void dessinerLigne(int longueurLigne, char symbole) {
for (int i= 0; i < longueurLigne; i++) {
Terminal.ecrireChar(symbole);
}
Terminal.sautDeLigne();
}
... suite de la classe...

Dans cet exemple, nous dfinissons une mthode dessinerLigne qui prend deux arguments :
le premier est un entier, longueurLigne, et le second est un caractre, symbole. Les arguments
sont ensuite utiliss dans le corps de la mthode.
Plus prcisment, la liste des arguments dune procdure est compose dune suite de dclarations
de variables, spares par des virgules. Attention, on doit rpter le type devant chaque argument. Si
jai par exemple deux arguments entiers, je devrais crire :
public static void dessinerRectangle(int largeur, int hauteur) {
....
}

Quand on appelle une procdure en java, il est obligatoire de fournir des valeurs pour tous
ses arguments. Lordre des arguments est important, ainsi que leur type. Pour appeler la procdure
dessinerRectangle de lexemple prcdent, il faut passer deux entiers. Le premier donnera sa
valeur largument n largeur z , le second largument n hauteur z .
De mme, pour appeler la dernire version de notre procdure dessinerLigne, on devra
passer dabord un entier (la longueur de la ligne), puis un caractre (le symbole utiliser). Donc, pour
dessiner une ligne de 50 -, jcrirai :
dessinerLigne(50, -);

Localit des paramtres


Le passage de paramtre en Java se fait par valeur. Le paramtre est une variable cre lors de
lappel de la procdure, qui reoit une copie de la valeur quon lui passe.
Une modification dun paramtre ne modifie pas a priori la variable correspondante du programme
principal.
Ainsi, si nous considrons le programme suivant :
public class Localite {
public static void augmenterMalEcrit(int val) {
val= val + 1;

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.2. PROCDURES

public static void main(String args[]) {


int k= 10;
augmenterMalEcrit(k);
Terminal.ecrireIntln(k);
}
}

Lors de lappel de augmenterMalEcrit, ligne 9, on cre une variable val, locale


augmenterMalEcrit. la valeur de k va tre copi dans val.
Nous avons donc deux variables distinctes : k et val, qui contiennent toutes les deux la valeur
10. La ligne 3 augmente la valeur de val, qui vaut 11, mais absolument pas la valeur de k, qui reste
inchang. Quand augmenterMalEcrit se termine, on revient dans main. val disparat et on
affiche la valeur de k, soit 10.
Supposons maintentant que nous dfinissions une variable val dans le main :
public class Localite2 {
public static void augmenterMalEcrit(int val) {
val= val + 1;
Terminal.ecrireStringln("La valeur du val de augmenterMalEcrit : "+ val);
}

public static void main(String args[]) {


int k= 10;
int val= 30;
augmenterMalEcrit(k);
Terminal.ecrireIntln(k);
Terminal.ecrireIntln(val);
}
}

Cette variable est compltement distincte du val de augmenterMalEcrit. Le droulement


du programme sera le mme que prcdemment, et affichera :
La valeur du val de augmenterMalEcrit : 11
10
30
Surcharge
Nous avons crit plusieurs variantes de dessinerLigne. Les dernires sont trs souples, mais
un peu plus complexes demploi. Dans certains cas, le programmeur veut juste dessiner une ligne. Il
ne se soucie ni de sa longueur exacte, ni du symbole utilis.
Il serait donc intressant de disposer de plusieurs variantes de dessinerLigne. Dans un premier temps, on pourrait imaginer de leur donner tout simplement des noms diffrents :
dessinerLigne ;
dessinerLigneDeLongueurDonne
dessinerLigneDeLongueurDonneAvecSymbole
c
NFA031 CNAM
2012

5.2. PROCDURES

CHAPITRE 5. PROCDURES ET FONCTIONS

Mais trouver des noms parlants pour nos procdures est dj difficile. On na pas forcment envie
de les multiplier par le nombre de variantes dsires. Dautre part, il est plus simple pour le programmeur qui utilise les procdures de ne pas sencombrer la mmoire avec plusieurs noms. 1 Pour
rsoudre ce problme, java utilise la surcharge. Il sagit tout simplement de la possibilit de dclarer plusieurs mthodes avec le mme nom. Elles sont alors distingues par leur liste darguments.
Attention, les listes darguments sont uniquement bases sur le type des arguments, pas sur leur noms.
Nous pourrions donc crire notre code de dessin de ligne :
public class LigneMania {
/**
*Dessine une ligne dune certaine longueur, en utilisant le caractre symbole.
*/
public static void dessinerLigne(int longueur, char symbole) {
for (int i= 0; i < longueur; i++) {
Terminal.ecrireChar(symbole);
}
Terminal.sautDeLigne();
}
/**
*Dessine une ligne de * dune certaine longueur.
*/
public static void dessinerLigne(int longueur) {
dessinerLigne(longueur, *);
}
public static void dessinerLigne() {
dessinerLigne(60, *);
}

public static void main(String args[]) {


dessinerLigne();
Terminal.ecrireStringln("Un texte bien encadr");
dessinerLigne(20);
Terminal.ecrireStringln("Aprs la ligne");
Terminal.sautDeLigne();
Terminal.sautDeLigne();
dessinerLigne(100,-);
}
}

On remarquera que dans cet exemple, nous avons en plus viter de rpter le code de dessin de la
ligne : les procdures simplifies appellent la procdure la plus gnrale.

1. Pour tre tout fait honnte, le choix nest pas si facile que cela. La surcharge peut parfois rendre le code plus difficile
lire.

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.2. PROCDURES

5.2.3 Passage de tableaux en argument


Pour un tableau pass en paramtre, java passe la rfrence du tableau (son adresse, en fait). En
consquence, le tableau dorigine et celui vu par la procdure occupent le mme espace mmoire.
Considrons le programme suivant :
public class TestTab1 {
public static void main(String args[]) {
int tab[]= {8, 2, 1, 23};
afficherTableau(tab);
}
public static void afficherTableau(int t[]) {
for (int i= 0; i < t.length; i++) {
Terminal.ecrireInt(t[i]);
if (i != t.length -1)
Terminal.ecrireChar( );
}
Terminal.sautDeLigne();
}
}

Lors de lappel de la procdure afficherTableau, on copie dans t la valeur de tab. Mais


tab contient ladresse du tableau 8 2 1 23 . t va donc dsigner le mme espace mmoire que
tab. et donc, le mme tableau, et non pas une copie du tableau.
Durant lexcution de afficherTableau, nous avons donc en mmoire :
le tableau 8 2 1 23 , une certaine adresse (par exemple 0xA0300).
tab, qui contient ladresse du tableau (donc 0xA0300)
t, qui contient aussi ladresse du tableau (donc 0xA0300)
Une premire consquence de cela est que le passage dun tableau en paramtre nentrane pas la
copie de celui-ci (ce qui serait prohibitif pour un gros tableau).
Une seconde consquence est que si la procdure modifie le contenu du tableau, comme le paramtre et la variable dorigine dsignent le mme tableau en mmoire, le tableau dorigine est aussi
modifi.
On peut donc considrer quune procdure peut modifier le contenu dun tableau pass en paramtre. Cest ce qui se passe lors de lappel dinverserTableau dans notre premier exemple :
public class InversionTableau2 {
public static void main(String args[]) {
int tab[]= {8, 2, 1, 23};
Terminal.ecrireStringln("Tableau avant inversion");
afficherTableau(tab);
inverserTableau(tab);
Terminal.ecrireStringln("Tableau aprs inversion");
afficherTableau(tab);
}
public static void afficherTableau(int t[]) {
for (int i= 0; i < t.length; i++) {
Terminal.ecrireInt(t[i]);

c
NFA031 CNAM
2012

5.2. PROCDURES

CHAPITRE 5. PROCDURES ET FONCTIONS

if (i != t.length -1)
Terminal.ecrireChar( );
}
Terminal.sautDeLigne();
}
public static void inverserTableau(int t[]) {
int a= 0; int b= t.length -1;
while (a < b) {
int tmp= t[a];
t[a]= t[b];
t[b]= tmp;
a++;
b--;
}
}
}

5.2.4 Appel dune procdure dfinie dans une autre classe


Jusquici, quand nous avons voulu rutiliser une procdure dans un nouveau programme, nous
lavons tout bonnement recopie. Mais, en pratique, on prfre ne pas dupliquer le code, ft-ce au
moyen dun copier/coller. Lidal est donc de regrouper
On tente donc de crer des bibliothques de procdures. Vous en utilisez dj une : la classe
Terminal. On pourrait vouloir utiliser notre LigneMania de la mme manire. Cest en fait trs
facile. Dans ltat actuel de vos connaissances en java, pour utiliser les mthodes dune classe A depuis
une classe B :
il faut que le code des deux classes soit dans le mme dossier ;
on peut appeler les mthodes de A en prfixant simplement le nom de la mthode par A.
Exemple :
public class TestLignes {
public static void main(String args[]) {
LigneMania.dessinerLigne(100,-);
}
}

5.2.5 Rcapitulation
Une procdure est un morceaux de code situ dans une classe. Elle a un nom et une liste de
paramtres, ventuellement vide.
En thorie, une procdure agit sur son environnement :
soit elle modifie lenvironement du programme (en crivant par exemple sur lcran, sur limprimante, en sauvant des donnes sur le disque, en produisant un son) ;
soit elle modifie la valeur dun de ses paramtres ; en java, a nest vritablement possible que
lorsque lun dentre eux est une rfrence, donc, pour lintant, dans le cas des tableaux.
10

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.3. FONCTIONS

5.3 Fonctions
Une fonction ressemble une procdure, mais sa pour tche est de renvoyer une valeur, qui sera
utilise par la suite. Lexemple le plus immdiat, ce sont les fonctions mathmatiques. La fonction
cos, de la classe Math, calcule ainsi le cosinus de son argument. On lutilise de la manire suivante :
double x= 3;
double y= Math.cos(x/2);
Vous
utilisez
par
ailleurs
plusieurs
fonctions
:
Terminal.lireInt(),
Terminal.lireString(), etc... Elles ne prennent pas dargument, mais renvoient lentier, le
texte... saisis par lutilisateur.
La grande diffrence entre procdures et fonctions est donc que ces dernires renvoient quelque
chose. Dun point de vue pratique, dans une fonction :
on met le type de la valeur renvoye la place du void des procdures :
public static TYPE_RETOURN NOM_FONCTION (ARGUMENTS )

on renvoie la valeur du rsultat laide du mot-clef return .


Commenons par un exemple : la fonction valeur absolue.
public class F1 {
public static double valeurAbsolue(double x) {
double resultat;
if (x < 0)
resultat= -x;
else
resultat= x;
return resultat ;
}
public static void main(String args[]) {
double v= Terminal.lireDouble();
Terminal.ecrireDoubleln(valeurAbsolue(v));
}
}

La fonction valeurAbsolue dclare dans son en-tte quelle retourne une valeur de type
double. La valeur est effectivement renvoye ligne 8, laide de la commande return.
La forme de cette commande est
return EXPRESSION ;
o EXPRESSION est du mme type que la fonction.Lexcution de cette commande a deux effets :
1. elle fixe la valeur de retour ;
2. elle termine lexcution de la fonction.
On aurait pu aussi crire :
public static double valeurAbsolue(double x) {
if (x < 0)
return -x;

c
NFA031 CNAM
2012

11

5.4. FONCTIONS PARTIELLES

CHAPITRE 5. PROCDURES ET FONCTIONS

else
return x;
}

mais on considre gnralement quil est plus lgant de ne placer quun seul return dans la
fonction (on sait alors exactement o la fonction se termine, et cela simplifie sa relecture).
Attention, une fonction doit toujours se terminer par un return 2 Si java dtecte (parfois tort)
quil est possible que a ne soit pas le cas, il refuse de compiler. La fonction suivante, par exemple :
public static double valeurAbsolue(double x) {
if (x < 0)
return -x;
}

produira la compilation le message derreur :


Err.java:5: missing return statement
}
^

5.3.1 Fonctions qui retournent un tableau


Une fonction peut trs bien renvoyer un tableau. Il suffit pour cela quelle le dclare comme type
de retour. La fonction suivante renvoie par exemple un tableau, dont la taille et le contenu des cases
sont donns en paramtre.
public static double[] creerTableau(int taille, double valeur) {
double [] t= new double [taille]; // cration du tableau
for (int i= 0; i < taille; i++)
t[i]= valeur;
return t;
}

Remarquez en particulier la dernire ligne. On renvoie tout simplement t (sans crochet).

5.4 Fonctions partielles


Il arrive quune fonction ne soit pas dfinie pour toutes les valeurs possibles de ses paramtres.
Considrons par exemple la fonction suivante :
/**
*Renvoie la somme des trois premiers lments dun tableau
*/
public static double sommeDesTroisPremiers(double t[]) {
if (t.length >= 3) {
return t[0]+ t[1]+ t[2];
}
}
2. Sauf dans le cas o elle lve une exception, voir infra.

12

c
NFA031 CNAM
2012

CHAPITRE 5. PROCDURES ET FONCTIONS

5.5. VARIA

Cette fonction nest pas dfinie si la taille du tableau est infrieure trois. En fait, telle quelle est
crite, elle ne compilera mme pas, puisque, si le test est faux, elle ne retourne rien, et quune fonction
doit toujours retourner quelque chose.
Java fournit un mcanisme pour rsoudre le problme : les exceptions. Il sagit en fait de messages
derreur, qui interrompront le programme. On reformule quelque peu la rgle prcdente en :
une fonction doit toujours, ou se terminer en renvoyant une valeur, ou lancer (ou lever)
une exception.
Pour lever une exception, on crira :
throw new Error(MessageDErreur ) ;
Notre fonction devra donc scrire :
/**
*Renvoie la somme des trois premiers lments dun tableau
*/
public static double sommeDesTroisPremiers(double t[]) {
if (t.length >= 3) {
return t[0]+ t[1]+ t[2];
} else
throw new Error("appel de sommeDesTroisPremiers avec un tableau trop petit");
}

Le mcanisme que nous venons de dcrire est trs simplifi. Nous dtaillerons par la suite le
systme des exceptions, en voyant en particulier comment il est possible de rattraper celles-ci.
Les exceptions sont aussi utilisables dans les procdures.

5.5 Varia
5.5.1 Notes de vocabulaire
Dans la littrature, vous constaterez peut-tre des usages variables pour les termes de procdures
et de fonctions. Vous lirez sans doute aussi le terme mthode . Le tout est souvent une question
dcole, ou de point de vue. La terminologie que nous avons adopte pour notre expos est, en gros,
celle du langage Pascal. Elle nous permet de distinguer les deux concepts de procdures et de fonctions.
Pour des raisons historiques, en langage C, les procdures sont vues comme des fonctions qui ne
renvoient rien . Comme java a hrit la terminologie de C, on utilise donc aussi le mot fonction
pour dsigner indiffremment les procdures et les vraies fonctions. Do, entre autres, le void
devant les noms des procdures, la place du type du rsultat.
Le terme mthode , que vous rencontrerez trs probablement, provient des langages orients
objets. Il dsigne une procdure ou une fonction dfinies dans une classe. Ce qui est le cas de toutes
les procdures et fonctions en java.
Pour rsumer :
mthode procdure ou fonction dfinie dans une classe ;
procdure sous-programme nomm, ne renvoyant pas de rsultat, et modifiant gnralement son
environnement ;
fonction thoriquement, sous-programme renvoyant une valeur. Parfois utilis (en C ou java) pour
dsigner tout sous programme.
c
NFA031 CNAM
2012

13

5.6. ERREURS FRQUENTES ET REMARQUES


CHAPITRE
FINALES5. PROCDURES ET FONCTIONS

5.5.2 Notion deffet de bord


La tche principale dune fonction est de renvoyer une valeur. Il arrive cependant quune fonction
modifie aussi son environnement (laffichage, le contenu dun fichier, ses paramtres quand il sagit
de tableaux, etc...)
Cest un procd utiliser avec prcaution, dans la mesure o il est souhaitable quune procdure
ou une fonction ait une tche unique et bien dfinie.

5.6 Erreurs frquentes et remarques finales


Un sous-programme ne demande jamais lutilisateur les valeurs de ses paramtres... celles-ci
sont connues au moment de lappel. Le code suivant est illogique :
public static double carre(double x) {
x= Terminal.lireDouble(); // NON ! x est dj connu et on le redemande sans raison
return x*x;
}

Une fonction naffiche pas son rsultat ; elle le renvoie ;


Les paramtres formels sont des variables locales et sont donc indpendants des variables utilises dans la mthode appelante.

14

c
NFA031 CNAM
2012