TP n°1.95: Les boucles en Java

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.

 
 
class LancerDe { 
public static void main (String[] args) {
		for(int i = 1;i <= 10;i = i+1){
			System.out.println("Le lancer de dé numéro"+ i +"  est  :"+ Math.floor(6*Math.random() + 1));
		}
	}
}

 

Copier ce programme dans un fichier nommé LancerDe.java et l'executer dans un terminal. Qu' observez vous ?. En utilisant votre manuel ou internet corriger ce problème.

On pourrait traduire ce programme par : Pour i allant de 1 à 10 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. Créer un programme qui affiche à l'écran les 20 premiers carrés consécutifs en ordre croissant.
  2. Créer un programme qui affiche à l'écran les 20 premiers carrés consécutifs en ordre décroissant.
  3. Créer un programme qui affiche à l'écran les 20 premiers entiers dont le reste par la division euclidienne par 3 est 1.
  4. Créer un programme qui affiche à l'écran les 10 premiers termes de la suite d'Euclide un+1=un*(un-1)+1 avec u0=2
  5. 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

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=1

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

 
class RacineCarre { 
public static void main (String[] args) {
		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;
		System.out.println(" Entrez un nombre réel strictement positif");
		double a = Isn.readDouble();
		double precision = Math.pow(10,-8);
		racine1 = 1;
		racine2 = 0.5*(1+a);
		while (Math.abs(racine1 - racine2) > precision){
			racine = racine2;
			racine2 = 0.5*(racine2+a/racine2);
			racine1 = racine;		
		}
		System.out.println("Une valeur approchée de la racine carrée de " + a +" est : "+ racine2 +"  à "+ precision +" près");
	}
}
 
 

Exercice

  1. Créer un programme qui affiche à l'écran une valeur approchée avec 10 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 10 décimales exactes de la limite de la suite convergente un+1=1+1/un avec u0=1

Réaliser un petit jeu

  1. 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. Vous pouvez commencer ainsi:
    	 
    	 class Jeu { 
    		public static void main (String[] args) {
    					int nombreOrdinateur;
    					nombreOrdinateur = .......Voir Lancer de Dé;
    					System.out.println(" Entrez un nombre entier entre 1 et 1000");
    					int nombreUtilisateur = Isn.readInt();	
    					while (....................){
    							
    							if(...................){
    									System.out.println(" Entrez un nombre entier plus grand");
    									nombreUtilisateur = Isn.readInt();
    							}
    							else{
    									System.out.println(" Entrez un nombre entier plus petit");
    									nombreUtilisateur = Isn.readInt();
    							}
    					}
    					System.out.println(" Gagné! Le nombre de l'ordinateur est "+ nombreOrdinateur);
    									
    		
    	}
    }
    
    
    Voir la correction que si vous avez suffisamment cherché
    	 
    	 class Jeu { 
    		public static void main (String[] args) {
    					int nombreOrdinateur;
    					nombreOrdinateur = (int) Math.floor(1000*Math.random())+1;
    					System.out.println(" Entrez un nombre entier entre 1 et 1000");
    					int nombreUtilisateur = Isn.readInt();	
    					while (nombreUtilisateur != nombreOrdinateur){
    							
    							if(nombreUtilisateur < nombreOrdinateur){
    									System.out.println(" Entrez un nombre entier plus grand");
    									nombreUtilisateur = Isn.readInt();
    							}
    							else{
    									System.out.println(" Entrez un nombre entier plus petit");
    									nombreUtilisateur = Isn.readInt();
    							}
    					}
    					System.out.println(" Gagné! Le nombre de l'ordinateur est "+ nombreOrdinateur);
    									
    		
    	}
    }
    
    
  2. Dans un second temps rajouter un compteur qui comptabilise le nombre de vos propositions.
  3. Enfin programmer ce jeu entre l'ordinateur et lui-même.( Analyser votre stratégie et la programmer.)
  4. Réaliser un milliers de parties et calculer le nombre moyen de propositions.