TP 4: Répétition

La répétition

L'ordinateur traite de nombreuses tâches répétitives rapidement . C'est son principal intérêt. On illustre la répétition par l'image d'une boucle qui est parcourue de nombreuses fois. La boucle représente une suite ou bloc d'instructions.

Il y a deux façons de parcourir la boucle:

La boucle for

Regardons sur l'exemple suivant un exemple de boucle for: Il s'agit de simuler le lancer de 10 lancers de dés à 6 faces et d'afficher les résultats. La boucle for sert quand on connaît dès le début de l'exécution le nombre , ici 10 de répétitions dans la boucle.

 
 
void setup(){ 

  for(int i = 0;i < 10;i = i+1){
	println("Le lancer de dé numéro"+ i +" est : "+int(random(6)+ 1));
		
	}
}


 

On pourrait traduire ce programme par : Pour i allant de 0 à 10 exclu et variant d'une unité, afficher le message le lancer numéro i est ...

On constate plusieurs choses: en toute généralité la boucle for peut être définie ainsi

Exercices

  1. Quelle est la différence entre le programme ci-dessous et le programme précédent

     
     
    void setup(){ 
      for(int i = 0;i < 10;i = i+1){
    	println("Le lancer de dé numéro"+ i +" est : "
    	+int(random(6)+ 1);
    		
      }
    }
    
     
  2. Créer un programme qui affiche à l'écran les 20 premiers carrés consécutifs en ordre croissant.
  3. Créer un programme qui affiche à l'écran les 20 premiers carrés consécutifs en ordre décroissant.
  4. Créer un programme qui affiche à l'écran les 10 premiers termes de la suite de Fibonnacci un=un-1+un-2 avec u0 = 1 et u1=1
  5. Créer un programme qui affiche à l'écran les 5 premiers termes de la suite de Sylvester un+1=un*(un-1)+1 avec u0=2

La boucle while

Regardons sur un exemple, le programme de calcul de la racine carrée d'un nombre réel a strictement positif:

Il est basé sur la suite récurrente un+1=0,5*(un+a/un) avec u0=2

On montre en mathématiques que cette suite converge vers la racine carrée de a

Quand va-t-on arrêter les répétitions ?

Lorsque le terme que l'on vient de calculer est très proche de la limite ?

Mais on ne connaît pas la limite! C'est pour cela que la condition d'arrêt de la répétition du while est lorsque que la différence entre deux termes consécutifs est plus petite qu'une valeur fixée au départ par exemple 10-6

Ce qui est appelé racine1 et racine2 dans la suite sont deux termes consécutifs de cette suite

 
void setup(){

	//deux termes consécutifs de la suite
	
	float racine1;
	float 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*/
	 
	float racine;
	float precision = pow(10,-6);
	
	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 (abs(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. Créer un programme qui affiche à l'écran une valeur approchée avec 6 décimales exactes de la limite de la suite convergente pn+1=0,2*pn+0,6 avec p0=0,1
  2. Créer un programme qui affiche à l'écran une valeur approchée avec 6 décimales exactes de la limite de la suite convergente un+1=1+1/un avec u0=1
  3. Créer un programme qui affiche à l'écran une valeur approchée avec 6 décimales exactes de la limite de la suite convergente $u_{n+1}= \sqrt{1+u_n}$ avec $u_0=1$

Répétition avec setup()et draw()

Que fait le programme suivant ?


int COTE = 400;
int cote = int(COTE/4);
//------------------setup----------------------
void setup(){
  
  size(COTE, COTE);
  background(0,150,0);
  for(int i = 0;i < 4;i = i+1){
      line(cote + cote*i,0,cote + cote*i,COTE);
  }
  for(int i = 0;i < 4;i = i+1){
      line(0,cote + cote*i,COTE,cote + cote*i);
  }
  frameRate(5);
}

//-----------------draw---------------------------
void draw(){
  int x = int(random(4));
 
  int rouge = int(random(256));
  int vert = int(random(256));
  int bleu = int(random(256));
  
  fill(rouge,vert,bleu);
  rect(x*cote,x*cote,cote,cote);
}

Le faire évoluer de telle sorte qu'un seul carré change de couleur toutes les 0,2 s

Mini-projet personnel ( à rendre avant J+7)

  1. Cible (/5 points)

    9 cercles alternativement jaune et noir le plus externe et le plus interne est noir

  2. Devine un nombre(/5 points)

    L'ordinateur choisit au hasard un nombre entier compris entre 1 et 1000. Vous devez deviner ce nombre en proposant une solution. A chaque fois l'ordinateur compare votre solution et le nombre qu'il a choisi et vous dit si votre nombre est plus grand , égal, ou plus petit au sien. Tant que vous n'avez pas trouvé le nombre vous pouvez proposer une solution.

    Faire d'abord un algorithme puis un programme en Processing

Voici une boucle dans un script shell (Linux)


#! /bin/bash 

# OUTILS LINUX
#
# Pour supprimer tous les utilisateurs d'un poste 
# sauf celui de l'administrateur

nom=`ls /home/`
#echo $nom
for utilisateur in $nom
do
if [ $utilisateur != 'admin' ]
then
userdel -r $utilisateur
fi
done