Vous êtes sur la page 1sur 35

Méthodes, fonctions sous Processing et

Java

Valeur d’accueil et de reconversion en informatique (VARI1)


Daniel Porumbel (dp.cnam@gmail.com)
http://cedric.cnam.fr/~porumbed/vari1/

1/18
Rappel : méthodes setup et draw
Le code ci-dessous permet de tracer des lignes sans arrêt
(point de départ : le centre de la toile)
1 v o i d setup ( ) {
2 p r i n t l n ( " Salut toto " ) ;
3 size (600 ,600) ;
4 }
5 v o i d draw ( ) {
6 l i n e (300 ,300 , random ( 6 0 0 ) , random ( 6 0 0 ) ) ;
7 p r i n t l n ( " rebonjour toto " ) ;
8 }
On peut dire qu’une méthode permet de donner un nom à
plusieurs lignes de code
1 les lignes 2-3 : un bloc de code appelé setup()

2 les lignes 6-7 : un bloc de code appelé draw()

2/18
Rappel : méthodes setup et draw
Le code ci-dessous permet de tracer des lignes sans arrêt
(point de départ : le centre de la toile)
1 v o i d setup ( ) {
2 p r i n t l n ( " Salut toto " ) ;
3 size (600 ,600) ;
4 }
5 v o i d draw ( ) {
6 l i n e (300 ,300 , random ( 6 0 0 ) , random ( 6 0 0 ) ) ;
7 p r i n t l n ( " rebonjour toto " ) ;
8 }
On peut dire qu’une méthode permet de donner un nom à
plusieurs lignes de code
1 les lignes 2-3 : un bloc de code appelé setup()

2 les lignes 6-7 : un bloc de code appelé draw()

2/18
Fonctions

Une fonction comporte :


une entrée on fait « rentrer » des informations dans la fonction
(on lui donne les données avec lesquelles travailler).
un traitement grâce aux informations reçues en entrée, la fonc-
tion exécute un traitement, elle fait quelque chose
une sortie à la fin la fonction renvoie un résultat via return.

méthode = une fonction qui ne renvoie rien (void)


Une méthode n’a pas besoin de return
void= pas de sortie

3/18
Fonctions

Une fonction comporte :


une entrée on fait « rentrer » des informations dans la fonction
(on lui donne les données avec lesquelles travailler).
un traitement grâce aux informations reçues en entrée, la fonc-
tion exécute un traitement, elle fait quelque chose
une sortie à la fin la fonction renvoie un résultat via return.

méthode = une fonction qui ne renvoie rien (void)


Une méthode n’a pas besoin de return
void= pas de sortie

3/18
Exemple de définition de fonction :
i n t calculerCube ( i n t x ) {
r e t u r n x∗x∗ x ; entrée : une variable entière
} sortie : une variable entière
Exemple de définition de fonction qui ne renvoie rien :
v o i d d i r e B o n j o u r ( S t r i n g nomPersonne ) {
p r i n t l n ( " Bonjour " +nomPersonne ) ;
}
Exemples d’appels de fonctions
...
i n t n = calculerCube ( 5 ) ; / / n v a u t 125
d i r e B o n j o u r ( " Toto " ) ; / / A f f i c h e " Bonjour Toto "
...
Exemple de définition de fonction :
i n t calculerCube ( i n t x ) {
r e t u r n x∗x∗ x ; entrée : une variable entière
} sortie : une variable entière
Exemple de définition de fonction qui ne renvoie rien :
v o i d d i r e B o n j o u r ( S t r i n g nomPersonne ) {
p r i n t l n ( " Bonjour " +nomPersonne ) ;
}
Exemples d’appels de fonctions
...
i n t n = calculerCube ( 5 ) ; / / n v a u t 125
d i r e B o n j o u r ( " Toto " ) ; / / A f f i c h e " Bonjour Toto "
...
Exemple de définition de fonction :
i n t calculerCube ( i n t x ) {
r e t u r n x∗x∗ x ; entrée : une variable entière
} sortie : une variable entière
Exemple de définition de fonction qui ne renvoie rien :
v o i d d i r e B o n j o u r ( S t r i n g nomPersonne ) {
p r i n t l n ( " Bonjour " +nomPersonne ) ;
}
Exemples d’appels de fonctions
...
i n t n = calculerCube ( 5 ) ; / / n v a u t 125
d i r e B o n j o u r ( " Toto " ) ; / / A f f i c h e " Bonjour Toto "
...
Définition de fonctions entrées : une chaine de
avec plusieurs entrées : caractères et une lettre
v o i d d i r e S a l u t ( S t r i n g nom , char i n i t i a l e P r e n o m ) {
p r i n t l n ( " S a l u t " + i n i t i a l e P r e n o m + " " +nom) ;
}
Moyenne de 3 entiers : sortie : float pas int
f l o a t calculerMoyenne ( i n t a , i n t b , i n t c ) {
r e t u r n ( f l o a t ) ( a+b+c ) / 3 ; / / c o n v e r s i o n f l o a t
}
Appeler ces fonctions :
... apostrophes pour char
d i r e S a l u t ( " Toto " , ’ T ’ ) ; / / => " S a l u t T Toto "
d i r e S a l u t ( " T i t i " , ’S ’ ) ; / / => " S a l u t S T i t i "
f l o a t m = calculerMoyenne ( 7 , 7 , 8 ) ; / /m=7.33
...
Définition de fonctions entrées : une chaine de
avec plusieurs entrées : caractères et une lettre
v o i d d i r e S a l u t ( S t r i n g nom , char i n i t i a l e P r e n o m ) {
p r i n t l n ( " S a l u t " + i n i t i a l e P r e n o m + " " +nom) ;
}
Moyenne de 3 entiers : sortie : float pas int
f l o a t calculerMoyenne ( i n t a , i n t b , i n t c ) {
r e t u r n ( f l o a t ) ( a+b+c ) / 3 ; / / c o n v e r s i o n f l o a t
}
Appeler ces fonctions :
... apostrophes pour char
d i r e S a l u t ( " Toto " , ’ T ’ ) ; / / => " S a l u t T Toto "
d i r e S a l u t ( " T i t i " , ’S ’ ) ; / / => " S a l u t S T i t i "
f l o a t m = calculerMoyenne ( 7 , 7 , 8 ) ; / /m=7.33
...
Définition de fonctions entrées : une chaine de
avec plusieurs entrées : caractères et une lettre
v o i d d i r e S a l u t ( S t r i n g nom , char i n i t i a l e P r e n o m ) {
p r i n t l n ( " S a l u t " + i n i t i a l e P r e n o m + " " +nom) ;
}
Moyenne de 3 entiers : sortie : float pas int
f l o a t calculerMoyenne ( i n t a , i n t b , i n t c ) {
r e t u r n ( f l o a t ) ( a+b+c ) / 3 ; / / c o n v e r s i o n f l o a t
}
Appeler ces fonctions :
... apostrophes pour char
d i r e S a l u t ( " Toto " , ’ T ’ ) ; / / => " S a l u t T Toto "
d i r e S a l u t ( " T i t i " , ’S ’ ) ; / / => " S a l u t S T i t i "
f l o a t m = calculerMoyenne ( 7 , 7 , 8 ) ; / /m=7.33
...
Processing exécute setup() en premier
La première fonction exécutée est :
setup() sous Processing
main() sous C/C++/Java

Elle peut appeler d’autres fonctions


fonctions prédéfinies : size(...), ellipse(...), etc.
fonction calculerMax(...) définie par nous

6/18
Processing exécute setup() en premier
La première fonction exécutée est :
setup() sous Processing

main() sous C/C++/Java 
i n t calculerMin ( i n t a , i n t b) {
i f ( a<b )
return a ;
else
return b ;
}
v o i d setup ( ) {
i n t x = ( i n t ) random ( 2 0 0 ) , y=( i n t ) random ( 3 0 0 ) ;
i n t rayon = c a l c u l e r M i n ( x , y ) ;
size (600 ,600) ;
e l l i p s e ( x , y , 2 ∗ rayon , 2 ∗ rayon ) ;
} / / 2∗ rayon=d i a m è t r e=>t o u c h e r bord
 
6/18
vu
La fonction draw() déjà

appelée de manière répétitive par Processing


Rappel : setup() est appelée une seule fois au début
le nombre d’appels par seconde peut être modifié par un
appel frameRate(nombre)
Pour faire une animation : tracer une ligne à des coordon-
nées aléatoires à l’intérieur du draw()
 
v o i d setup ( ) {
size (600 ,600) ;
frameRate ( 1 0 0 0 ) ;
}
v o i d draw ( ) {
/ / t r a c e r une l i g n e du p i x e l x au p i x e l y
/ / l e s coordonnées x e t y : a l é a t o i r e s <600
l i n e ( random ( 6 0 0 ) , random ( 6 0 0 ) , / / p i x e l x
random ( 6 0 0 ) , random ( 6 0 0 ) ) ; / / p i x e l y
}
7/18
vu
La fonction draw() déjà

appelée de manière répétitive par Processing


Rappel : setup() est appelée une seule fois au début
le nombre d’appels par seconde peut être modifié par un
appel frameRate(nombre)
Pour faire une animation : tracer une ligne à des coordon-
nées aléatoires à l’intérieur du draw()
 
v o i d setup ( ) {
size (600 ,600) ;
frameRate ( 1 0 0 0 ) ;
}
v o i d draw ( ) {
/ / t r a c e r une l i g n e du p i x e l x au p i x e l y
/ / l e s coordonnées x e t y : a l é a t o i r e s <600
l i n e ( random ( 6 0 0 ) , random ( 6 0 0 ) , / / p i x e l x
random ( 6 0 0 ) , random ( 6 0 0 ) ) ; / / p i x e l y
}
7/18
Mode actif et mode statique déjà vu
Processing connait deux modes :
mode actif On déclare des fonctions et toutes les calculs/affi-
chages sont écrit dans les (corps des) fonctions
mode statique On ne déclare pas de fonction et on écrit une
séquence d’instruction, comme jusqu’à aujourd’hui
Impossible de mélanger les deux modes : comment exécuter le
programme ci-après ?
...
p r i n t l n ( " Toto " ) ;
v o i d setup ( ) {
p r i n t l n ( " Dans l e corps de l a f o n c t . setup " ) ;
}
...

8/18
Mode actif et mode statique déjà vu
Processing connait deux modes :
mode actif On déclare des fonctions et toutes les calculs/affi-
chages sont écrit dans les (corps des) fonctions
mode statique On ne déclare pas de fonction et on écrit une
séquence d’instruction, comme jusqu’à aujourd’hui
Impossible de mélanger les deux modes : comment exécuter le
programme ci-après ?
...
p r i n t l n ( " Toto " ) ;
v o i d setup ( ) {
p r i n t l n ( " Dans l e corps de l a f o n c t . setup " ) ;
}
...
Impossible de savoir quand afficher Toto :
avant ou après l’appel à setup() ?
8/18
Tester le passage des paramètres par valeur
 
void testModif ( i n t x , i n t y ) {
x = 9;
y = 12 ;
}
v o i d setup ( ) { les valeurs de a et b
i n t a=4 ; sont affectées à x et y
i n t b=5 ;
testModif (a , b) ;
println (a) ;
println (b) ;
}
 
Qu’affiche ce programme ?

9/18
Tester le passage des paramètres par valeur
 
void testModif ( i n t x , i n t y ) {
x = 9;
y = 12 ;
}
v o i d setup ( ) { les valeurs de a et b
i n t a=4 ; sont affectées à x et y
i n t b=5 ;
testModif (a , b) ;
println (a) ;
println (b) ;
}
 
Qu’affiche ce programme ?
Exceptions à la régle plus haute du passage par valeur : les
tableau et les objets (à voir plus tard).

9/18
Une fonction avec un tableau

 
i n t sommeTab ( i n t [ ] t a b ) {
/ / t a b : v i s i b l e que dans sommeTab ( ) ;
r e t u r n tab [ 0 ] + tab [ 1 ] + tab [ 2 ] ;
}
v o i d setup ( ) {
/ / t : v i s i b l e que dans setup ( )
i n t [ ] t = new i n t [ 3 ] ;
t [0] = 1;
t [1] = 2;
t [2] = 3;
p r i n t l n ( sommeTab ( t ) ) ;
}
 

10/18
 
Une autre variable locale s 
 
i n t sommeTabMult2 ( i n t [ ] t a b ) {
int s = 2;
/ / s v i s i b l e que dans sommeTabMult2 ( . . . ) !!!
r e t u r n s ∗( tab [ 0 ] + tab [ 1 ] + tab [ 2 ] ) ;
}
v o i d setup ( ) {
/ / t : v i s i b l e que dans setup ( )
i n t [ ] t = new i n t [ 3 ] ;
t [0] = 1;
t [1] = 2;
t [2] = 3;
p r i n t l n ( sommeTabMult2 ( t ) ) ;
}
 

11/18
Enchainer l’appel de fonctions
 
i n t doubler ( i n t x ) {
r e t u r n 2∗x ; 3 appels imbriqués
}
v o i d setup ( ) {
p r i n t l n ( doubler ( doubler ( doubler ( 3 ) ) ) ) ;
}
 

12/18
Enchainer l’appel de fonctions
 
i n t doubler ( i n t x ) {
r e t u r n 2∗x ;
3 appels imbriqués
}
v o i d setup ( ) {
p r i n t l n ( doubler ( doubler ( doubler ( 3 ) ) ) ) ;
}
 
On suppose que int detMin(int, int) est déjà écrite
detMin(...) renvoie la valeur minimale et ne touche pas

aux variables globales ! (travail en équipe) 
i n t [ ] x={ 7 ,2 ,19 ,11 } ;
v o i d setup ( ) {
i n t minDesQuatres=detMin ( detMin ( x [ 0 ] , x [ 1 ] ) ,
detMin ( x [ 2 ] , x [ 3 ] ) ) ;
p r i n t l n ( minDesQuatres ) ;
}
 
12/18
Enchainer l’appel de fonctions
 
i n t doubler ( i n t x ) {
r e t u r n 2∗x ; 3 appels imbriqués
}
v o i d setup ( ) {
p r i n t l n ( doubler ( doubler ( doubler ( 3 ) ) ) ) ;
}
 


Ces deux fonctionns renvoient le même résultat : 
i n t sommeTabMult2 ( i n t [ ] t a b ) {
int s = 2;
r e t u r n s ∗( tab [ 0 ] + tab [ 1 ] + tab [ 2 ] ) ;
}
i n t sommeTabMult2Bis ( i n t [ ] t a b ) {
r e t u r n d o u b l e r ( sommeTab ( t a b ) ) ;
}
 
12/18
Variables : globales, locales ou arguments

Comment corriger et lancer ce programme ? 
int x; / / x=v a r i a b l e g l o b a l e
i n t detMin ( i n t a , i n t b ) { / / a e t b : arguments
println (x) ; / / x v i s i b l e partout
i f ( a<=b )
return a ;
return b ; / / on a r r i v e i c i s i b<a
p r i n t l n ( " Toto ??? " ) ; / / on a r r i v e j a m a i s i c i
}
v o i d setup ( ) {
x = 8;
int y = 9; / / y : variable locale
y = detMin ( x , y ) ;
println (y) ;
println (a) ; / / e r r e u r : a n ’ e s t pas
} / / déclaré i c i !
 13/18 
Variables : globales, locales ou arguments

Comment corriger et lancer ce programme ? 
int x; / / x=v a r i a b l e g l o b a l e
i n t detMin ( i n t a , i n t b ) { / / a e t b : arguments
println (x) ; / / x v i s i b l e partout
i f ( a<=b )
return a ;
return b ; / / on a r r i v e i c i s i b<a
p r i n t l n ( " Toto ??? " ) ; / / on a r r i v e j a m a i s i c i
} unreachable code
v o i d setup ( ) {
x = 8;
int y = 9; / / y : variable locale
y = detMin ( x , y ) ;
println (y) ;
println (a) ; / / e r r e u r : a n ’ e s t pas
} a can not
/ / dbe
é cresolved
l a r é i cto
i !a variable
 13/18 
Attention aux variables globales ! ! !

Quel est le résultat/affichage de ce programme ? ? ? 
int x; / / x=v a r i a b l e g l o b a l e
i n t detMin ( i n t a , i n t b ) { / / a e t b : arguments
x = x−1 ; / / x v i s i b l e partout
i f ( a<=b )
return a ;
return b ; / / on a r r i v e i c i s i b<a
}
v o i d setup ( ) {
x = 8;
int y = 9; / / y : variable locale
y = detMin ( x , y ) ; / / l ’ appel m o d i f i e x ! ! !
y = detMin ( x , y ) ;
println (y) ;
}
 
14/18
Le passage des paramètres aux fonctions
 
int f ( int x, int y) {
r e t u r n x+y ;
}
v o i d setup ( ) {
i n t somme ;
somme = f ( 2 , 3 ) ; / / somme d e v i e n t 5
i n t a=4 , b=5 ;
somme = f ( a , b ) ; / / somme d e v i e n t 9
p r i n t l n (somme) ;
}
 
 
x  et y  sontvisibles/connus uniquement à l’intérieur (du
corps) de la fonction f(...)

a et b sont visibles uniquement à l’intérieur (du corps) de
la fonction setup()
15/18
Le passage des paramètres aux fonctions
 
int f ( int x, int y) {
r e t u r n x+y ; les valeurs de a et b
} sont affectées à x et y
v o i d setup ( ) {
i n t somme ;
somme = f ( 2 , 3 ) ; / / somme d e v i e n t 5
i n t a=4 , b=5 ;
somme = f ( a , b ) ; / / somme d e v i e n t 9
p r i n t l n (somme) ;
}
 
 
x  et y  sontvisibles/connus uniquement à l’intérieur (du
corps) de la fonction f(...)

a et b sont visibles uniquement à l’intérieur (du corps) de
la fonction setup()
15/18
Arrêter l’appel à draw() après 50 itérations

Solution : on utilise une variable globale compteur


 
i n t compteur = 0 ;
v o i d setup ( ) {
size (600 ,600) ;
}
v o i d draw ( ) {
compteur = compteur + 1 ;
i f ( compteur <50) {
l i n e ( random ( 6 0 0 ) , random ( 6 0 0 ) , / / p i x e l x
random ( 6 0 0 ) , random ( 6 0 0 ) ) ; / / p i x e l y
}
}
 
Comment faire d’autres dessins après l’itération 50 ?

16/18
Programmation risquée
Soit le même programme en Processing ou C : qu’est ce qu’il
affiche ?

Processing C
  
i n t f o r t u n e = 100000 ; i n t f o r t u n e = 100000 ;
void direSiJeSuisRiche ( ) { void direSiJeSuisRiche ( ) {
i f ( f o r t u n e>=100000) i f ( f o r t u n e>=100000)
p r i n t l n ( " Riche " ) ; p r i n t f ( " Riche " ) ;
} }
v o i d setup ( ) { v o i d main ( ) {
i n t f o r t u n e = 100 ; i n t f o r t u n e = 100 ;
direSiJeSuisRiche ( ) ; direSiJeSuisRiche ( ) ;
} }
  
Réponse : fortune 6= fortune
la première est une variable globale, la deuxième est locale
17/18
Programmation risquée
Soit le même programme en Processing ou C : qu’est ce qu’il
affiche ?

Processing C
  
i n t f o r t u n e = 100000 ; i n t f o r t u n e = 100000 ;
void direSiJeSuisRiche ( ) { void direSiJeSuisRiche ( ) {
i f ( f o r t u n e>=100000) i f ( f o r t u n e>=100000)
p r i n t l n ( " Riche " ) ; p r i n t f ( " Riche " ) ;
} }
v o i d setup ( ) { v o i d main ( ) {
i n t f o r t u n e = 100 ; i n t f o r t u n e = 100 ;
direSiJeSuisRiche ( ) ; direSiJeSuisRiche ( ) ;
} }
  
Réponse : fortune 6= fortune
la première est une variable globale, la deuxième est locale
17/18
Programmation ultra-risquée
 
i n t fortune ;
void f ( i n t fortune ) {
f o r t u n e=9 ;
}
void g ( ) {
i n t fortune ;
f o r t u n e = 15 ;
}
void h ( ) {
fortune = 9 ;
} Que affiche ce programme ?
v o i d setup ( ) {
f o r t u n e = 12 ;
f ( fortune ) ;
p r i n t l n ( fortune ) ;
g() ;
p r i n t l n ( fortune ) ;
h() ;
p r i n t l n ( fortune ) ;
} 18/18
Programmation ultra-risquée
 
i n t fortune ;
void f ( i n t fortune ) {
f o r t u n e=9 ;
} Attention :
void g ( ) {
i n t fortune ; fortune 6= fortune 6= fortune
f o r t u n e = 15 ;
}
void h ( ) { la première est une va-
fortune = 9 ; riable gloable
} visible partout
v o i d setup ( ) {
la deuxème est une va-
f o r t u n e = 12 ;
f ( fortune ) ; riable locale, un argument
p r i n t l n ( fortune ) ; de la fonction f()
g() ; la troisème est une variable
p r i n t l n ( fortune ) ;
locale dans la fonction g()
h() ;
p r i n t l n ( fortune ) ;
} 18/18
Programmation ultra-risquée
 
i n t fortune ;
void f ( i n t fortuneArg ) {
f o r t u n e A r g=9 ;
}
void g ( ) { Solution : utiliser des noms de
i n t fortuneLocal ; variables différents!!
f o r t u n e L o c a l = 15 ;
}
void h ( ) {
fortune = 9 ;
}
v o i d setup ( ) {
f o r t u n e = 12 ;
f ( fortune ) ;
p r i n t l n ( fortune ) ;
g() ;
p r i n t l n ( fortune ) ;
h() ;
p r i n t l n ( fortune ) ;
} 18/18

Vous aimerez peut-être aussi