ISN 2012-2013 SAVOIR-FAIRE Ecrire l’entête d’une fonction Écrire l’en-tête d’une fonction 1. Choisir un nom qui indique clairement ce que fait la fonction. 2. Identifier les arguments qui varient lors des différents appels de la fonction dans le programme principal. Donner un nom à chacun de ces arguments. 3. Identifier un type approprié pour chacun de ces arguments. 4. Identifier si la fonction renvoie une valeur et, si oui, le type de cette valeur. Exercice 1 Écrire l’en-tête d’une fonction qui calcule la vitesse moyenne d’un mobile connaissant son temps de parcours et la distance parcourue. 01/01/2013 Les fonctions en Java 1 ISN 2012-2013 Ecrire l’entête d’une fonction Correction Exercice 1 La fonction peut, par exemple, s’appeler vitesse. Les arguments sont tout indiqués : on les appelle, par exemple, temps et distance. Selon les unités choisies, les arguments pourraient être de type int ou double. Cependant, on sait qu’il faut effectuer une division décimale pour calculer la vitesse et que cette opération requiert des nombres de type double. Enfin, la fonction doit renvoyer une valeur, la vitesse, qui est elle aussi de type double à cause de la division. L’en-tête de la fonction est donc double vitesse (double temps, double distance). 01/01/2013 Les fonctions en Java 2 ISN 2012-2013 Ecrire l’entête d’une fonction Exercice 2 Écrire l’en-tête des fonctions suivantes : • Une fonction qui indique s’il est possible de construire un triangle avec trois segments de mesures données. • Une fonction qui calcule le plus grand diviseur commun (PGCD) de deux nombres entiers. • Une fonction qui trace à l’écran un segment entre deux points. • Une fonction qui écrit à l’écran les initiales d’une personne dont on donne le nom complet. 01/01/2013 Les fonctions en Java 3 ISN 2012-2013 Ecrire l’entête d’une fonction Correction Exercice 2 Écrire l’en-tête des fonctions suivantes : • Une fonction qui indique s’il est possible de construire un triangle avec trois segments de mesures données. boolean triangle_possible(double c1,double c2, double c3). • Une fonction qui calcule le plus grand diviseur commun (PGCD) de deux nombres entiers. int PGCD(int n1,int n2) • Une fonction qui trace à l’écran un segment entre deux points. void trace_segment(double x1, double y1, double x2, double y2) • Une fonction qui écrit à l’écran les initiales d’une personne dont on donne le nom complet. void initiales(String prenom, String nom) 01/01/2013 Les fonctions en Java 4 Ecrire une fonction ISN 2012-2013 SAVOIR-FAIRE Écrire une fonction 1. Écrire l’en-tête de la fonction. 2. Écrire le corps de la fonction comme si les arguments étaient déjà remplis par des valeurs. 3. Ne pas oublier l’instruction return, le cas échéant. 4. Prévoir une exécution correcte de la fonction quelle que soit la valeur donnée à chacun des arguments, y compris dans des cas que l’on n’a pas forcément anticipés dans le cours normal du programme principal. 01/01/2013 Les fonctions en Java 5 Ecrire une fonction ISN 2012-2013 Exercice 3 Écrire les fonctions suivantes. • Une fonction qui renvoie la plus grande de deux valeurs de type int. • Une fonction qui répète un même mot un certain nombre de fois au choix. • Une fonction, construite à partir de la fonction Math.random, qui tire au sort un nombre entier entre deux bornes données en arguments. • Une fonction qui décide s’il est possible de construire un triangle avec trois segments de mesures données. 01/01/2013 Les fonctions en Java 6 Ecrire une fonction ISN 2012-2013 Correction Exercice 3 Écrire les fonctions suivantes. • Une fonction qui renvoie la plus grande de deux valeurs de type int. int maximum(int n1, int n2) { if (n1>n2) return n1; else return n2; } 01/01/2013 Les fonctions en Java 7 ISN 2012-2013 Ecrire une fonction Correction Exercice 3 • Une fonction qui répète un même mot un certain nombre de fois au choix. String repetition_mot(String mot, int nb_repetitions) { String mot_repete = " "; for (int i=1;i<=nb_repetitions;i++) { mot_repete = mot_repete + mot; } return mot_repete; } 01/01/2013 Les fonctions en Java 8 ISN 2012-2013 Ecrire une fonction Correction Exercice 3 • Une fonction, construite à partir de la fonction Math.random, qui tire au sort un nombre entier entre deux bornes données en arguments. int entier_aleatoire(int inf, int sup) { return (int) (Math.random()*(sup – inf) + inf); } • Une fonction qui décide s’il est possible de construire un triangle avec trois segments de mesures données. boolean triangle_possible(double c1, double c2, double c3) { if (c1 > c2 + c3) return false; if (c2 > c1 + c3) return false; if (c3 > c1 + c2) return false; return true; } 01/01/2013 Les fonctions en Java 9 ISN 2012-2013 La portée des variables SAVOIR-FAIRE : Identifier la portée des variables dans un programme comportant des fonctions • Si une variable est déclarée en dehors de toute fonction, alors elle est globale. • Si une variable est déclarée à l’intérieur d’une fonction, y compris le programme principal main, alors sa portée est limitée à cette fonction. • Si une variable fait partie des arguments d’une fonction, alors sa portée est limitée à cette fonction. • Si deux variables de même nom sont déclarées dans deux fonctions différentes, alors elles représentent en réalité deux boîtes distinctes et la portée de chacune est limitée à la fonction correspondante. Dans ce cas, elles peuvent même avoir des types différents. • Il faut éviter d’utiliser le même nom pour une variable globale et une variable locale. Cependant, si cela se produit, à l’intérieur de la portée de la variable locale, c’est celle- ci qui est visible et non plus la variable globale, qui ne sera à nouveau accessible que quand on sera sorti de la portée de la variable locale. 01/01/2013 Les fonctions en Java 10 ISN 2012-2013 La portée des variables Exercice 4 Déterminer la portée de chaque variable dans le programme suivant. L’utilisation qui est faite de ces variables est-elle cohérente avec cette portée ? Si non, comment corriger ce programme ? int z, y; void v (double x) { double u; u = x * x; z = (int) x; } void main () { double t; y = 4; t = 1 / (double) y; v(t); println(u); } 01/01/2013 Les fonctions en Java 11 ISN 2012-2013 La portée des variables Correction exercice 4 Il y a cinq variables dans ce programme : t, u, x, y et z. v n’est pas une variable, mais une fonction. Les variables z et y sont déclarées avant les fonctions. Elles sont globales et peuvent donc être utilisées partout. La variable x est un argument de la fonction v : sa portée est donc limitée au corps de cette fonction et elle n’est effectivement utilisée que là. La variable u est locale à la fonction v puisqu’elle est déclarée dans le corps de cette fonction, mais elle est utilisée dans le programme principal main : le programme est donc incorrect. Enfin, la variable t est locale au programme principal main puisqu’elle est déclarée dans le corps de cette fonction. Elle n’est effectivement utilisée que là. 01/01/2013 Les fonctions en Java 12 ISN 2012-2013 La portée des variables Correction exercice 4 La dernière ligne du programme affiche la valeur de u. Pour pouvoir le faire tout en respectant la portée des variables, plusieurs solutions existent : • rendre u globale : c’est peu recommandé, car on essaye de n’utiliser des variables globales que lorsque cela est réellement indispensable ; • déplacer l’affichage de u à l’intérieur de la fonction v : cela n’est envisageable que si on est certain qu’à chaque appel de la fonction v, on voudra afficher la valeur de u à l’écran ; • modifier la fonction v pour qu’elle renvoie la valeur de u : c’est la solution que l’on privilégiera ici puisqu’elle ne modifie pas le comportement intrinsèque de v. Cependant, cette solution ne serait pas utilisable si v avait déjà une autre valeur de retour. 01/01/2013 Les fonctions en Java 13 La portée des variables ISN 2012-2013 Correction exercice 4 int z, y; static double v (double x) { double u; u = x * x; z = (int)x; return u; } void main () { double t; y = 4; t = 1 / (double)y; println(v(t)); } 01/01/2013 Les fonctions en Java 14 ISN 2012-2013 La portée des variables Exercice 5 Trouver les erreurs de portée dans le programme suivant. int i; int h (int j) { int k; j = j + 1; println(i); println(j); k = j + i; m = m – 1; i = 5; return k; } void main () { int m, n; m = 1; i = 10; println(m); n = h(m); println(m); println(k); println(i + j); } 01/01/2013 Les fonctions en Java 15 ISN 2012-2013 La portée des variables Correction exercice 5 • La variable m locale à la procédure main n’est pas visible dans la fonction h. • La variable j locale à la fonction h n’est pas visible dans la fonction main. 01/01/2013 Les fonctions en Java 16 ISN 2012-2013 La portée des variables SAVOIR-FAIRE : Choisir entre un passage par valeur et une variable globale Si une fonction doit utiliser une variable a du programme principal, deux cas sont à distinguer : • Si la fonction n’utilise que la valeur contenue dans a sans jamais la modifier, alors cette valeur peut être passée en argument à la fonction et la variable a peut être locale au programme principal. • Si la fonction doit modifier la valeur contenue dans a, alors la variable a doit être globale. 01/01/2013 Les fonctions en Java 17 ISN 2012-2013 La portée des variables Exercice 6 Dans le programme suivant, quelles sont les expressions passées par valeur ? Qu’affiche ce programme lorsqu’on l’exécute ? int i; int h (int j) { int k; j = j + 1; println(i); println(j); k = j + i; i = 5; return k; } void main () { int m, n; m = 1; i = 10; println(m); n = h(m); println(m); println(n); println(i); } 01/01/2013 Les fonctions en Java 18 La portée des variables ISN 2012-2013 Correction exercice 6 Lors de l’appel h(m), la valeur 1, contenue à ce moment dans la boîte m, est passée à la fonction h via l’argument j. La variable m n’est pas modifiée, même par l’instruction j = j + 1; et elle conserve sa valeur 1 jusqu’à la fin du programme principal. Ce programme affiche donc : 1 Valeur initiale de m 10 La variable globale i a été initialisée à 10 dans le programme principal. 2 j prend la valeur 1 de m lors de l’appel à h, puis on lui ajoute 1. 1 12 5 m n’est pas modifiée par h. n contient la valeur de retour de h, qui a été donnée par l’expression j + i, dans laquelle j valait 2 et i valait 10. On a affecté la valeur 5 à la variable globale i dans la fonction h. 01/01/2013 Les fonctions en Java 19