Pages - Menu

Pages

la boucle do while en java - boucle while java - exercices corrigés solution tp

Exercices sur les boucles en java
Comprendre la boucle do…while

Exercice 1 :

Afin d’exécuter le programme suivant :


public class Exercice1
{
public static void main (String [] argument)
{
int a,b,r;
System.out.println("Entrer un entier : ");
a = Lire.i();
System.out.println("Entrer un entier : ");
b = Lire.i();
do
{
r = a%b;
a = b;
b = r;
} while (r !=0 );
System.out.println("Le resultat est " + a);
}
}

a. Examinez le code source (programme), repérez les instructions concernées par la boucle répétitive, et déterminez les instructions de début et fin de boucle.

b. Quelle est l’instruction qui permet de modifier le résultat du test de sortie de boucle ?

c. En supposant que l’utilisateur entre les valeurs 30 et 42, exécutez le programme à la main (pour vous aider, construisez le tableau d’évolution de chaque variable déclarée).

d. En supposant que l’utilisateur entre les valeurs 35 et 6, exécutez le programme à la main (pour vous aider, construisez le tableau d’évolution de chaque variable déclarée).

e. Quel est le calcul réalisé par ce programme ?

Apprendre à compter, accumuler et rechercher une valeur


Exercice 2 :


Écrivez en français, en faisant ressortir la structure répétitive de la marche à suivre, le programme résolvant les quatre points suivants :

a. Lire un nombre quelconque de valeurs entières non nulles. La saisie des valeurs se termine lorsque entre la valeur 0.

b. Afficher la plus grande des valeurs.

c. Afficher la plus petite des valeurs.

d. Calculer et afficher la moyenne de toutes les valeurs.

Exercice 3 :


Traduisez la marche à suivre précédente en un programme Java. Utilisez pour cela une boucle do…while. Pour trouver la plus grande ou la plus petite valeur, vous pouvez vous aider de l’exemple « Rechercher le plus grand de deux éléments », décrit au cours du chapitre 3, « Faire des choix ».

Comprendre la boucle while, traduire une marche à suivre en programme Java

Exercice 4 :


Écrivez un programme Devinette, qui tire un nombre au hasard entre 0 et 10 et demande à l’utilisateur de trouver ce nombre. Pour ce faire, la méthode est la suivante :

a. Tirer au hasard un nombre entre 0 et 10.

b. Lire un nombre.

c. Tant que le nombre lu est différent du nombre tiré au hasard :

           – Lire un nombre.
           – Compter le nombre de boucle.

d. Afficher un message de réussite ainsi que le nombre de boucles.

Exercice 5 :


Reprenez chaque point énoncé ci-dessus, et traduisez-le en langage Java. Notez que, pour tirer un nombre au hasard entre 0 et 10, l’instruction s’écrit :

           i = (int) (10*Math.random());

où i est une variable entière qui reçoit la valeur tirée au hasard.

Exercice 6 :


Déclarez toutes les variables utilisées dans votre programme en veillant à ce qu’elles soient bien initialisées.

-------------------------------------------------------------------------------

Correction - Solution

-------------------------------------------------------------------------------


Solution Exercice 1 :

public class Exercice1 {
public static void main (String [] argument) {
int a,b,r;
System.out.print("Entrer un entier : ");
a = Lire.i();
System.out.print("Entrer un entier : ");
b = Lire.i();
do {
r = a%b;
a = b;
b = r;
} while (r != 0 );
System.out.println("Le resultat est " + a);
}
}

a. Repérez les instructions concernées par la boucle : voir tracé orange sur le programme ci-dessus.

Déterminez les instructions de début et fin de boucle.: voir tracé vert sur le programme ci-dessus.

b. Recherchez l'instruction permettant de modifier le résultat du test de sortie de boucle : voir tracé jaune sur le programme ci-dessus.

c.


Le programme affiche : le resultat est 6.
d.


Le programme affiche : le resultat est 1.

e. Pour comprendre ce que réalise ce programme, examinons les résultats des deux exécutions précédentes. Pour les valeurs 30 et 42, le résultat vaut 6. Pour les valeurs 35 et 6, le résultat vaut 1.

Remarquons que 30 et 42 sont divisibles par 6, alors que 35 et 6 n'ont aucun diviseur commun mis à part 1. Nous pouvons donc dire que le résultat trouvé est le plus grand diviseur commun aux deux valeurs saisies, autrement dit le PGCD.

Solution Exercice 2 :

public class Exercice2 {
public static void main (String [] argument) {
int valeur;
do {
System.out.print("Entrer un entier : ");
valeur = Lire.i();
} while ( valeur < 0 || valeur > 100) ;
System.out.println("Vous avez saisi : " + valeur);
}
}

Le programme entre dans la boucle do … while sans test préalable. Il demande la saisie d’une entière au clavier. Lorsque la saisie a été effectuée, le programme teste si la valeur saisie est plus petite que 0 ou plus grande que 100. Si tel est le cas - le test est vrai, le programme retourne en début de la boucle et demande à nouveau la saisie d’une valeur. Si la valeur saisie est plus grande que 0 et plus petite que 100 - le test est faux, le programme sort de la boucle et affiche la valeur saisie.

Solution Exercice 3 :


a. Faire

Lire une valeur entière
Mémoriser la plus grande valeur
Mémoriser la plus petite valeur
Calculer la somme des valeurs saisies
Compter le nombre de valeurs saisies

Tant que la valeur saisie est différente de 0
Afficher la plus grande et la plus petite valeur
Calculer et afficher la moyenne des valeurs

b. Le code source complet :

public class Exercice3 {
public static void main (String [] parametre) {
int valeur, laPlusGrande, laPlusPetite, laSomme = 0, leNombre = 0 ;
double laMoyenne;
System.out.print("Entrer une valeur :") ;
valeur = Lire.i() ;
laPlusGrande = valeur ;
laPlusPetite = valeur ;
do {
if (laPlusGrande < valeur) laPlusGrande = valeur ;
if (laPlusPetite > valeur) laPlusPetite = valeur ;
laSomme = laSomme + valeur ;
leNombre = leNombre + 1 ;
System.out.print("Entrer une valeur (0 pour sortir) :") ;
valeur = Lire.i() ;
} while (valeur != 0);
System.out.println("La plus grande valeur est : " + laPlusGrande) ;
System.out.println("La plus petite valeur est : " + laPlusPetite) ;
laMoyenne = (float) laSomme / leNombre ;
System.out.println("La moyenne de ces valeurs : " + laMoyenne) ;
} // Fin du main ()
} // Fin de la Class Maximum

Observez qu'une première valeur est saisie en dehors de la boucle, afin d'initialiser les deux variables laPlusPetite et laPlusGrande. Ainsi, en initialisant par exemple ces valeurs à -1, le programme peut donner un mauvais résultat. Imaginez par exemple que vous n'entriez que des valeurs positives. Le programme affichera en résultat comme plus petite valeur -1, alors que cette dernière ne fait pas partie des valeurs saisies par l'utilisateur. Grâce à l'initialisation des variables à la première valeur saisie, nous sommes surs d'obtenir un résultat cohérent.

Pour finir, remarquez le cast (float) devant le calcul de la moyenne. En effet, les deux variables laSomme et leNombre sont de type entier. Sans ce cast, la division fournit un résultat entier.


Solution Exercice 4 :

Traduction de la marche à suivre en Java

a. Tirer au hasard un nombre entre 0 et 10.
i = (int) (10*Math.random()) ;

b. Lire un nombre.
nombreLu = Lire.i();

c. Tant que le nombre lu est différent du nombre tiré au hasard :
while ( nombreLu != i)
8 Lire un nombre
nombreLu = Lire.i();
8 Compter le nombre de boucle.
nbBoucle = nbBoucle + 1 (ou encore nbBoucle++)

d. Afficher un message de réussite ainsi que le nombre de boucles.
System.out.print("Bravo ! ");
System.out.println("vous avez reussi en " + nbBoucle + " fois");

Solution Exercice 5 :

Le code source complet :

public class Devinette {
public static void main (String [] parametre) {
int i, nombreLu = -1, nbBoucle = 0;
i = (int) (10*Math.random());
System.out.print("Ceci est un jeu, j'ai tire un nombre au ");
System.out.println("hasard entre 0 et 10, devinez lequel ? ");
while (nombreLu != i) {
System.out.print("Votre choix : ");
nombreLu = Lire.i();
nbBoucle = nbBoucle + 1;
}
System.out.print("Bravo ! ");
System.out.println("vous avez reussi en " + nbBoucle + " fois");
} // Fin du main ()
} // Fin de la Class Devinette

Remarquez l'initialisation de la variable nombreLu à –1. En effet, pour être sûr d'entrer dans la boucle while, la variable nombreLu doit contenir une valeur différente de i. Or celle-ci par définition, varieentre 0 et 10. L'initialisation à –1 permet donc de certifier que le programme entrera au moins une fois dans la boucle.



Solution Exercice 6 :


Quelques améliorations :

public class Jeu {
public static void main (String [] parametre) {
int i, nombreLu = -1, nbBoucle = 0;
// a. Les valeurs tirées au hasard soit comprises entre 0 et 50.
i = (int) (50*Math.random());
System.out.print("Ceci est un jeu, j'ai tire un nombre au ");
System.out.println("hasard entre 0 et 50, devinez lequel ? ");
while (nombreLu!= i) {
System.out.print("Votre choix : ");
nombreLu = Lire.i();
nbBoucle++;
// b. Un message d'erreur doit afficher si la réponse est mauvaise.
if (nombreLu != i) System.out.println("Mauvaise reponse");
// c. Indique si la valeur saisie est plus grande
// ou plus petite que la valeur tirée au hasard.
if (nombreLu < i) System.out.println(" Trop petit !");
if (nombreLu > i) System.out.println(" Trop grand !");
}
System.out.print("Bravo ! ");
System.out.println("vous avez reussi en " + nbBoucle + " fois");
} // Fin du main ()
} // Fin de la Class Jeu

d. À titre de réflexion : comment faut-il s’y prendre pour trouver la valeur en donnant le moins de réponses possibles ?

Les valeurs tirées au hasard sont comprises entre 0 et 50. le programme indique si la valeur lue au clavier est plus grande ou plus petite que celle tirée au hasard. La meilleure méthode pour trouver le plus rapidement la réponse est de choisir toujours une valeur de milieu, par rapport à un ensemble de valeurs (essai par dichotomie).

Exemple : nous supposons que l'ordinateur a choisi 8

Notre ensemble de valeurs est initialement [0, 50], choisissons une valeur moyenne dans cet intervalle, soit 25. L'ordinateur répond : trop grand ! (nbBoucle = 1)

Si 25 est une valeur trop grande, notre ensemble de valeurs se restreint à [0, 25[, choisissons une valeur moyenne dans cet intervalle, soit 12. L'ordinateur répond : trop grand ! (nbBoucle = 2)

Si 12 est une valeur trop grande, notre ensemble de valeurs se restreint à [0, 12[, choisissons une valeur moyenne dans cet intervalle, soit 6. L'ordinateur répond : trop petit ! (nbBoucle = 3)

Si 6 est une valeur trop petite, notre ensemble de valeurs se restreint à ]6, 12[, choisissons une valeur moyenne dans cet intervalle, soit 9. L'ordinateur répond : trop grand ! (nbBoucle = 4)

Si 9 est une valeur trop grande, notre ensemble de valeurs se restreint à ]6, 9[, choisissons une valeur moyenne dans cet intervalle, soit 8. L'ordinateur répond : Bravo ! vous avez reussi en 5 fois. (nbBoucle = 5)


Aucun commentaire:

Enregistrer un commentaire