Ecrire l’entête d’une fonction

publicité
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
Téléchargement