Upload
abelard-brisset
View
107
Download
1
Embed Size (px)
Citation preview
Les fonctions
en Java
Partie I
Le type void
Dans cette rapide présentation, je vais expliquer :
.à quoi servent les fonctions
.à quoi faut-il penser avant d’écrire une fonction,
.comment déclarer et utiliser une fonction,
.comment se déroule l’appel à une fonction dans un
programme.
Les fonctions (ou sous-programmes)
permettent de regrouper des
instructions qui sont utilisées plusieurs fois
dans un programme.
Par exemple,
imaginons que l’on souhaite calculer un
nombre à une certaine puissance.
53 = 5 x 5 x 5
En Java, on ferait
public class Main{
public static void main (String[] args){
int cpt, result;result = 1;
for (cpt = 1; cpt <= 3; cpt = cpt+1)
{result = result*5;
}
System.out.println(result);}
}
Si on souhaite afficher aussi 94, on fera...
public class Main{
public static void main (String[] args){
int cpt, result;result = 1;
for (cpt = 1; cpt <= 3; cpt = cpt+1)
{result = result*5;
}System.out.println(result);
result=1;
for (cpt = 1; cpt <= 4; cpt = cpt+1)
{result = result*9;
}System.out.println(result);
}}
On remarque de
grandes similarités
dans le code
ici et
là
Pour éviter de dupliquer le code, on va écrire
une fonction qui décrira les instructions à
suivre pour calculer un entier n élevé à une
puissance p.
A quoi réfléchir avant d’écrire une fonction ?
Avant d’aller plus loin, il faut se poser une
première question :
De quoi ma fonction a-t-elle besoin pour
effectuer son travail ?
ou autrement dit
De quelles valeurs ma fonction ne peut pas
décider par elle-même ?
Dans un téléphone portable, il existe une fonction
(un sous programme) permettant d’envoyer des
SMS à vos correspondants.
Pour marcher, cette fonction a besoin :
.d’un message à envoyer
.d’un destinataire à qui l’envoyer
Ce n’est pas à la fonction de décider du contenu du
message ni de la personne à qui l’envoyer.
La fonction d’envoi de SMS a donc besoin de deux
données d’entrée (on dit deux paramètres) : un
message et un numéro à qui envoyer le message.
Pour reprendre notre exemple,
la fonction qui calcule un entier élevé à une
certaine puissance a besoin :
.d’un entier n qui sera l’entier dont on calculera une
puissance,
.d’un entier p qui sera la puissance à laquelle sera élevée
n.
Ce n’est pas à la fonction de décider des valeurs de p ou
de n.
Ecrire une fonction en Java
On doit écrire une fonction qui prendra en entrée
deux entiers n et p, et affichera à l’écran np.
Pour écrire la fonction, on commencera par écrire
les mots clefs public static
Puis, on écrit void (on verra à quoi sert ce
mot clef dans la seconde présentation).
Ensuite, donnez un nom à votre fonction : ici, on
appellera notre fonction puissance
Enfin, écrivez toutes les données d’entrée dont
votre fonction a besoin, entre parenthèses.
Ici, cela donnera
public static void puissance (int n, int p){
}
Tout le code de la
fonction devra se trouver
entre ces deux
accolades.
Puis on écrit le code de la fonction entre les deux
accolades.
Attention !
Lorsque l’on écrit le code de la fonction, on doit
considérer que les données d’entrée (ici, n et p)
sont déjà déclarées et initialisées.
public static void puissance (int n, int p){
}
N’écrivez donc pas quelque chose comme ça
int n;
p = 4;
ou çaSauf cas spécial, n et p sont considérées comme
étant déjà déclarées et possèdent une valeur.
On peut maintenant écrire le code de la fonction :
public static void puissance (int n, int p){
int cpt, result;
result = 1;
for (cpt = 1; cpt <= p; cpt = cpt+1){
result = result*n;}
System.out.println(result);}
On place la fonction dans le fichier Main.java.
public class Main{
public static void main (String[] args){
int cpt, result;result = 1;
for (cpt = 1; cpt <= 3; cpt = cpt+1)
{result = result*5;
}
System.out.println(result);}
}
La fonction doit être
placée à l’intérieur
du public class Main,
en dehors du public
static void main.
ici
ou làCe qui donne …
public class Main{
public static void puissance (int n, int p)
{int cpt, result;result = 1;
for (cpt = 1; cpt <= p; cpt = cpt+1)
{result =
result*n;}
System.out.println(result);}
public static void main (String[] args){
int cpt, result;result = 1;
for (cpt = 1; cpt <= 3; cpt = cpt+1){
result = result*5;}System.out.println(result);
result=1;
for (cpt = 1; cpt <= 4; cpt = cpt+1){
result = result*9;}System.out.println(result);
}}
Remarquez que l’on a ici deux
fonctions :
.la fonction puissance
.la fonction main
Utiliser une fonction
Maintenant que l’on a écrit la fonction
puissance, on va l’utiliser afin de raccourcir
la fonction main.
Pour ce faire, il faut écrire le nom de la
fonction, suivi, entre parenthèses, des
valeurs à transmettre à la fonction
(l’ordre est important), et terminer par un
point virgule.
Regardons la fonction main…public static void main (String[] args){
int cpt, result;
}
result = 1;
for (cpt = 1; cpt <= 3; cpt = cpt+1){
result = result*5;}System.out.println(result);
result=1;
for (cpt = 1; cpt <= 4; cpt = cpt+1){
result = result*9;}System.out.println(result);
Cette partie sert à afficher 5
à la puissance 3.
On l’efface… et on appelle
notre fonction à la place
(nom de la fonction, suivi
des paramètres – ici, deux
entiers).
Remarque : l’ordre des
paramètres a une
importance.
Si on avait écrit
puissance(3,5), c’est 3 à la
puissance 5 qui sera
affiché.
puissance(5,3);
On peut aussi passer des
variables comme
paramètre…
Cette partie permet
d’afficher 9 à la puissance 4.
On l’efface, et on déclare
deux entiers : a, qui vaut 9,
et b, qui vaut 4.
int a = 9;int b = 4;
puissance (a, b);
Puis on appelle la fonction
puissance.
Comment se passe l’appel à une fonction dans
un programme ?
Reprenons notre code général
public class Main{
public static void puissance (int n, int p)
{int cpt, result;result = 1;
for (cpt = 1; cpt <= p; cpt = cpt+1)
{result =
result*n;}
System.out.println(result);}
public static void main (String[] args){
puissance (5, 3);
int a = 9;int b = 4;puissance (a, b);
}}
Comment se déroule l’exécution
de ce code ?
C’est par la fonction main que
Java commence à lire les lignes
de code.
Le programme débute donc par
cette ligne de code.
Java se rend alors compte qu’il
doit exécuter la fonction
puissance.
Il recopie la valeur 5 dans n …
(n vaudra 5 quand la fonction
puissance sera exécutée)
5
…et il recopie la valeur 3 dans p
(p vaudra 3 quand la fonction
puissance sera exécutée).
3
Puis, Java exécute la fonction
puissance, de la première ligne …
… jusqu’à la dernière.
Une fois la fonction terminée,
Java revient là où il était, et
continue son exécution (n et p
sont « effacés »).
Puis Java continue la fonction
main, jusqu’ici
Java doit exécuter à nouveau la
fonction puissance.
Il recopie la valeur de a dans n…
et la valeur de b dans p…
9 4
Puis la fonction puissance est
exécutée (avec n=9, et p=4).
Une fois la fonction terminée,
Java revient là où il était.
Une fois arrivé à la fin de la
fonction main, le programme est
terminé.
Dernières précisions
On vient de voir que lorsqu’une fonction est appelée,
les paramètres d’entrée sont recopiés dans la fonction.
public class Main{
public static void puissance (int n, int p)
{……
}
public static void main (String[] args){
int a = 9;int b = 4;puissance (a, b);
}}
Ici, lors de l’appel à la fonction
puissance, a est recopié dans n,
et b est recopié dans p.
Si on modifie la valeur de n ou de p dans la fonction
puissance, ça n’aura aucune influence sur a ou b.
Pour les tableaux, c’est différent : les tableaux sont transmis
à la fonction.
Si on possède une fonction où un tableau est donné en
paramètre d’entrée, et que l’on modifie ce tableau dans la
fonction, les changements resteront après que la fonction soit
terminée.
Ceci est expliqué plus en détail dans la présentation sur les
attributions de valeur.
Autre chose : Si on possède des variables avec le
même nom dans des fonctions différentes, Java
considère ces variables comme des entités
différentes.
public class Main{
public static void puissance (int n, int p)
{int a = 3;…
}
public static void main (String[] args){
int a = 9;….
}}
Ici, les deux variables a sont
vues comme deux variables
différentes et séparées.
Tout se passe comme si ceci
était en réalité écrit…
public class Main{
public static void puissance (int n, int p)
{int puissance_a = 3;…
}
public static void main (String[] args){
int main_a = 9;….
}}
Pour terminer, sachez que vous avez tout à
fait le droit d’appeler une fonction dans une
autre fonction…