TP 6: Fonctions

Factoriser le code

Lorsque des lignes de code se répètent à plusieurs endroits du programme on va les mettre en ...facteur ou plutôt en ...fonction

Ainsi dans le programme ci-dessous on répète deux fois l'affichage des 4 dés

 
 
void setup(){ 
  int de1,de2,de3,de4;
  
  de1 = int(random(6)+ 1;
  de2 = int(random(6)+ 1;
  de3 = int(random(6)+ 1;
  de4 = int(random(6)+ 1;
  	
  if((de1 != 6) && (de2 != 6) && (de3 != 6) && (de4 != 6)){
  	println("dé 1 vaut "+de1);
    println("dé 2 vaut "+de2);
    println("dé 3 vaut "+de3);
    println("dé 4 vaut "+de4);
    println("*************");
  	println("Perdu");
  else{
  	println("dé 1 vaut "+de1);
    println("dé 2 vaut "+de2);
    println("dé 3 vaut "+de3);
    println("dé 4 vaut "+de4);
    println("*************");
  	println("Gagné");
  }
  
}


 

On va donc créer une fonction afficher4D() et par la même occasion créer une fonction lancer4D()

 
 

int de1,de2,de3,de4;

void lancer4D(){
  de1 = int(random(6)+ 1;
  de2 = int(random(6)+ 1;
  de3 = int(random(6)+ 1;
  de4 = int(random(6)+ 1;
}

void afficher4D(){
	println("dé 1 vaut "+de1);
    println("dé 2 vaut "+de2);
    println("dé 3 vaut "+de3);
    println("dé 4 vaut "+de4);
}

void setup(){ 
  
  
  
  lancer4D();
  if((de1 != 6) && (de2 != 6) && (de3 != 6) && (de4 != 6)){
  	afficher4D();
    println("*************");
  	println("Perdu");
  else{
  	afficher4D();
    println("*************");
  	println("Gagné");
  }
  
}


 

On peut encore augmenter la lisibilité du programme en créant une fonction testerResultat()

Voilà le programme


int de1,de2,de3,de4;
//------------------------------------------------------------------------
void lancer4D(){
  de1 = int(random(6))+ 1;
  de2 = int(random(6))+ 1;
  de3 = int(random(6))+ 1;
  de4 = int(random(6))+ 1;
}
//------------------------------------------------------------------------
void afficher4D(){
	println("dé 1 vaut "+de1);
    println("dé 2 vaut "+de2);
    println("dé 3 vaut "+de3);
    println("dé 4 vaut "+de4);
}
//------------------------------------------------------------------------
void testerResultat(){
if((de1 != 6) && (de2 != 6) && (de3 != 6) && (de4 != 6)){
  	afficher4D();
    println("*************");
  	println("Perdu");
}
  else{
  	afficher4D();
    println("*************");
  	println("Gagné");
  }
}
//--------------------fonction principale--------------------------------
void setup(){ 
  lancer4D();
  testerResultat(); 
}

Vrai fonction

Une fonction en mathématique prend une ou plusieurs variables en entrée et retourne une valeur

Nous avons vu que la fonction abs() de Processing ne fonctionne que pour les variables de type float. Nous allons étendre cette fonction au type double, en créant notre fonction nommée valAbs qui prend en paramètre un double et retourne un double

Ceci nous permettra d'étendre le programme de calcul d'une valeur approchée de racine de 2 aux double


double valAbs(double x){
  if(x < 0) return -x;
  else return x;
}

void setup(){

	//deux termes consécutifs de la suite
	
	double racine1;
	double racine2;
	
	/*on utilise une variable intermédiaire racine 
	pour mettre le contenu de racine2 dans racine1
	et recalculer une nouvelle valeur de racine2 
	à partir de racine1 sans perdre ni la valeur
	 de racine1 ni la valeur de racine2*/
	 
	double racine;
	double precision = pow(10,-10);
	
	racine1 = 2;
	racine2 = 1.5;
	
	/* On arrête la répétition lorsque la distance 
	entre deux termes consécutifs racine1 et racine2 
	est inférieure à une precision fixée au départ ici 10^(-6)*/
	
	while (valAbs(racine1 - racine2) > precision){
			racine = racine2;
			racine2 = 0.5*(racine2+2/racine2);
			racine1 = racine;		
	}
	println("Une valeur approchée de la racine carrée de 2 est" 
	+racine2+"  à "+ precision +" près");
	
	
}

Exercices

  1. Aller voir dans Reference la documentation sur la fonction dist() (dans maths). Tester le programme qui illustre cette fonction. Créer une fonction distance() qui fait la même action et tester la
  2. Créer une fonction max(int a,int b) qui prend en paramètres deux entiers et retourne le plus grand des deux
  3. Créer une fonction min(int a,int b) qui prend en paramètres deux entiers et retourne le plus petit des deux
  4. Créer une fonction FToC(float temp) qui convertit une température exprimée en degré Fahrenheit, en degré Celsius. On utilisera la formule T(°C) =T(°F)*1,8 + 32. Ray Bradbury a écrit un roman de science fiction intitulé Fahrenheit 451. Convertir 451 °F en °C
  5. Créer une fonction qui élève un entier au carré. Utiliser la dans une boucle pour calculer la somme des 100 premiers carrés

Analyse

Déjà chez le philosophe français René Descartes on trouve une méthode d' analyse :

"...au lieu de ce grand nombre de préceptes dont la logique est composée, je crus que j'aurais assez des quatre suivants, pourvu que je pris une ferme et constante résolution de ne manquer pas une seule fois à les observer.

Le premier était de ne recevoir jamais aucune chose pour vraie que je ne la connusse évidemment être telle; c'est à dire d'éviter soigneusement la précipitation et la prévention; et de ne comprendre rien de plus en mes jugements que ce qui se présenterait si clairement et si distinctement à mon esprit que je n'eusse aucune occasion de le mettre en doute.

Le second, de : diviser chacune des difficultés que j'examinerais en autant de parcelles qu'il se pourrait et qu'il serait requis pour les mieux résoudre.

Le troisième, de conduire par ordre mes pensées, en commençant par les objets les plus simples et les plus aisés à connaître, pour monter peu à peu, comme par degrés, jusques à la connaissance des plus composés; et supposant même de l'ordre entre ceux qui ne se précédent point naturellement les uns les autres.

Et le dernier, de faire partout des dénombrements si entiers, et des revues si générales, que je fusse assuré de ne rien omettre." (Discours de la méthode).

Par conséquent dès le début de la conception du programme il faut décomposer le problèmes en sous-problèmes suffisamment élémentaires

Programmation collective

Créer une fonction qui trace dans la fenêtre graphique un cercle tangent à un des bords de la fenêtre

Mini-projet personnel (en évaluation par ses pairs: à rendre pour la rentrée : 02/11/14)

(Balle rebondissante) (/10 points)

Il s'agit de faire un programme qui fait déplacer une balle blanche sur un fonds noir. Cette balle rebondit sur les parois de la fenêtre

Le mouvement de la balle est une illusion : la balle est redessinée 60 fois par seconde. Autrement dit si la position du centre de la balle est un couple d'entiers $(n_0;m_0)$ à un instant donné alors sa nouvelle position après $\dfrac{1}{60}$ s est $(n;m)$ tel que $n= n_0+v_x$ et $m=m_0+v_y$

La balle est repérée par ses coordonnées (x,y) et a un vecteur vitesse de coordonnées (vx,vy)

On déclare quatre variables globales de type int x,y,vx,vy et RAYON intialisé à 20

  1. (1 point) Créer une fonction initialisationVitesse() qui initialise vx et vy aléatoirement avec des valeurs de l'ordre de l'unité positif ou négatif
  2. (1 point) Créer une fonction generationBalle() qui crée une balle blanche de rayon 20 pixels au centre du terrain et qui appelle initialisationVitesse()

    Tester la fonction

  3. (2 points) Créer la fonction miseAJourPosition(int a,int b) et l'insérer dans draw() pour que la position de la balle soit mise à jour 60 fois par seconde

    Si vous testez le programme la balle va disparaître il faut à présent gérer les rebonds

  4. (2 points) Créer une fonction toucheBord() qui retourne vrai si la balle touche le bord de la fenêtre (tenir compte de la variable RAYON)

    Cette fonction sera appelée dans draw()

  5. (2 points) Créer une fonction reflexion() qui change vx et vy lorsque la balle touche le bord

    Cette fonction sera appelée dans draw()

  6. (2 points) Pour la lisibilité du code =
    • 0,5 = commentaires
    • 0,5 = indentation
    • 0,5 = No Magic number
    • 0,5 = aération autour des symboles = & etc...