les boucles en java : do-while et while exercices et solutions
Comprendre la boucle do…while
Apprendre à
compter, accumuler et rechercher une valeur
Exercice
2 :
Exercice
3 :
Exercice
4 :
Exercice
5 :
Exercice
6 :
-------------------------------------------------------------------------------
Correction - Solution
Solution
Exercice 1 :
Solution
Exercice 2 :
Solution
Exercice 3 :
Solution
Exercice 4 :
Solution
Exercice 5 :
Solution
Exercice 6 :
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.
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
valeursaisie 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. Sila 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)
Article plus récent Article plus ancien