Exercices sur les boucles en java
b. Le code source complet :
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.
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.
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