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 lappel à 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 lon souhaite calculer un nombre à une certaine puissance. 5 3 = 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 9 4, 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 daller 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 denvoyer des SMS à vos correspondants. Pour marcher, cette fonction a besoin :.dun message à envoyer.dun destinataire à qui lenvoyer Ce nest pas à la fonction de décider du contenu du message ni de la personne à qui lenvoyer. La fonction denvoi de SMS a donc besoin de deux données dentré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 :.dun entier n qui sera lentier dont on calculera une puissance,.dun entier p qui sera la puissance à laquelle sera élevée n. Ce nest 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 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 dentré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 lon écrit le code de la fonction, on doit considérer que les données dentré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 ça Sauf 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 à linté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 lon a ici deux fonctions :.la fonction puissance.la fonction main
Utiliser une fonction
Maintenant que lon a écrit la fonction puissance, on va lutiliser 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 (lordre 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 lefface… et on appelle notre fonction à la place (nom de la fonction, suivi des paramètres – ici, deux entiers). Remarque : lordre des paramètres a une importance. Si on avait écrit puissance(3,5), cest 3 à la puissance 5 qui sera affiché. puissance(5,3); On peut aussi passer des variables comme paramètre… Cette partie permet dafficher 9 à la puissance 4. On lefface, 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 lappel à 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 lexécution de ce code ? Cest 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 quil 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, jusquici 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 lorsquune fonction est appelée, les paramètres dentré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 lappel à 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 naura aucune influence sur a ou b.
Pour les tableaux, cest différent : les tableaux sont transmis à la fonction. Si on possède une fonction où un tableau est donné en paramètre dentrée, et que lon 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 dappeler une fonction dans une autre fonction…