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 programme. plusieurs fois dans un Par exemple, imaginons que l’on souhaite nombre à une certaine puissance. 53 = 5 x 5 x 5 calculer un 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; grandes similarités for (cpt = 1; cpt <= 3; cpt = dans le code { ici et 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 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 : La fonction d’envoi de SMS a donc besoin de deux .d’un message à envoyer données d’entrée (on dit deux paramètres) : un .d’un destinataire à qui l’envoyer message et un numéro à qui envoyer le message. Ce n’est pas à la fonction de décider du contenu du message ni de la personne à qui l’envoyer. 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 n p. Pour écrire la fonction, on commencera par écrire les mots clefs Puis, on écrit public static 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. Sauf cas spécial, n et p sont considérées comme étant N’écrivez donc pas quelque chose comme ça ou ça déjà déclarées et possèdent une valeur. public static void puissance (int n, int p) { int n; p = 4; } 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 { ici public static void main (String[] args) { int cpt, result; result = 1; La fonction doit être placée à l’intérieur du for (cpt = 1; cpt <= 3; cpt = public class Main, { en cpt+1) result = result*5; } dehors du static void main. System.out.println(result); } } ou là Ce qui donne … public public class Main { for (cpt = 1; cpt <= 3; cpt = cpt+1) { result = result*5; } System.out.println(result); public static void puissance (int n, int p) { int cpt, result; result = 1; result=1; for (cpt = 1; cpt <= 4; cpt = cpt+1) { result = result*9; } System.out.println(result); 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; } 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; } On peut aussi passer des variables comme Remarque : l’ordre des paramètre… paramètres a une for (cpt = 1; cpt <= 3; cpt = cpt+1) {puissance(5,3); result = result*5; } System.out.println(result); importance. Cette partie sert à afficher 5 Cette partie permet avait écrit àSilaon puissance 3. d’afficher 9 à la puissance 4. puissance(3,5), c’est 3 à la result=1; int a = 9; for b(cpt int = 4;= 1; cpt <= 4; cpt = cpt+1) { puissance (a, b); result = result*9; } System.out.println(result); (nom de la fonction, suivi et b, qui vaut 4. des paramètres – ici, deux puissance 5 qui sera affiché. On l’efface… et on appelle On l’efface, et on déclare notre fonction: a, à la deux entiers quiplace vaut 9, entiers). Puis on appelle la fonction puissance. Comment se passe l’appel à une fonction dans un programme ? Reprenons notre code général 5 4 3 9 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); Java Java doit se rend exécuter alors àcompte nouveau qu’il la Comment se déroule l’exécution Puis, Java exécute la fonction fonction doitceexécuter puissance. de code ? la fonction puissance, Une fois arrivé de laàpremière la fin de ligne la … puissance. le programme est Ilfonction recopie main, la valeur de a dans n… C’est … jusqu’à par lalafonction dernière.main que terminé. et la valeur de b à dans Java commence lire p… les lignes Il recopie la valeur 5 dans n … de code. Une fois la fonction terminée, (n vaudra 5 quand la fonction Java revient où il était, et puissance seralàexécutée) Puis la fonction puissance est Le programme débute donc continue son exécution (n et par p exécutée (avec n=9, et p=4). cette de code. sont «ligne effacés »). …et il recopie la valeur 3 dans p (p vaudra 3 quand la fonction Puisfois Java continue la fonction Une la sera fonction terminée, puissance exécutée). main, jusqu’ici Java revient là où il était. 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 puissance_a a = 3; = 3; … } public static void main (String[] args) { int main_a a = 9; = 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… Pour terminer, sachez que vous avez tout à fait le droit d’appeler une fonction dans une autre fonction…