Solutions du chapitre 4 Structures de contrôle: première partie 4.9 Identifiez et corrigez les erreurs (il peut y en avoir plus d une par segment de code) de chacune des proposition suivantes: a) if ( age >= 65 ); System.out.println( "Age est plus grand ou égal à 65" ); else System.out.println( "Age est inférieur à 65 )"; Il faut supprimer le point virgule à la fin de la condition du if. Le guillemet droit de fermeture de la seconde instruction System.out.println doit se trouver avant la parenthèse de fermeture. b) int x = 1, total; while ( x <= 10 ) { total += x; ++x; Il faut initialiser la variable total à zéro. c) While ( x <= 100 ) total += x; ++x; Le W du While doit être en minuscule. Les deux instructions seront enfermées entre des accolades pour les grouper correctement dans le corps du while; sinon, la boucle est infinie. d) while ( y > 0 ) { System.out.println( y ); ++y; Il faut changer l opérateur ++ en un --. L accolade fermante de la boucle while manque. 4.10 Qu affiche le programme suivant? public class Mystere { public static void main( String args[] ) { int y, x = 1, total = 0; while ( x <= 10 ) { y = x * x; System.out.println( y ); total += y; ++x; System.out.println( "Le total vaut " + total );
1 4 9 16 25 36 49 64 81 100 Le total vaut 385 Pour les exercices 4.11 à 4.14, effectuez chacune de ces étapes: a) Lire la déclaration du problème. b) Formuler l algorithme à l aide du pseudocode et l affinage par étapes descendant. c) Écrire un programme en Java. d) Tester, déboguer et exécuter le programme Java. e) Traiter trois jeux complets de données. 4.11 Les conducteurs s intéressent au nombre de kilomètres parcourus par leurs automobiles. Un conducteur a effectué plusieurs pleins de carburant en relevant chaque fois le nombre de kilomètres parcourus et le nombre de litres d essence nécessaires pour les pleins. Développez une application Java qui demande le kilométrage et le nombre de litres sous la forme de valeurs entières lors de chaque plein, puis calcule et affiche le nombre de kilomètres parcourus par litre de carburant. Le programme doit afficher aussi les nombres de kilomètres par litre combinés jusqu à ce point. Tous les calculs de moyenne doivent générer des valeurs en virgule flottante. Exploitez les boîtes de dialogue d entrée pour demander à l utilisateur les données nécessaires. Intitulé: Déterminer la moyenne kilomètres/litre pour chaque réservoir de carburant et le rapport global des kilomètres par litre d un nombre quelconque de réservoirs de carburant. Premier affinage: Initialiser les variables Entrer les litres utilisés et les kilomètres parcourus, calculer et afficher les rapports kilomètres/litres pour chaque réservoir de carburant, puis calculer et afficher le rapport global kilomètres parcourus par litre. Conserver une trace du nombre total de kilomètres et du nombre total de litres. Second affinage: Initialiser totallitres à zéro. Initialiser totalkilomètres à zéro. Entrer les kilomètres parcourus et les litres de carburant utilisés du premier réservoir. Lorsque le nombre de litres est introduit, Prendre le nombre de litres utilisés du réservoir courant Ajouter les litres au total courant de totallitres Prendre le nombre de kilomètres parcourus avec le réservoir courant Ajouter les kilomètres au total courant de totalkilometres Calculer le rapport kilomètres/litre Calculer le total des kilomètres/litre Afficher les kilomètres par litre de ce plein de carburant et le nombre total de kilomètres par litre 1 // Solution de l exercice 4.11. 2 // Carburant.java 3 // Ce programme calcule le nombre de kilomètres par litre. 4 import javax.swing.joptionpane; 5 6 public class Carburant { 7 public static void main( String args[] ) 8 { 9 int kilometres, litres; 10 int totalkilometres = 0, totallitres = 0;
11 float kilometresparlitre; 12 float totalkmparlitre; 13 String entree1, entree2, resultat = ""; 14 15 // Lire le premier nombre de l utilisateur sous la forme d une chaîne. 16 entree1 = 17 JOptionPane.showInputDialog( "Entrer les kilometres (-1 pour quitter):" ); 18 19 while( ( kilometres = Integer.parseInt( entree1 ) )!= -1 ) { 20 // Lire le second nombre de l utilisateur sous la forme d une chaîne. 21 entree2 = 22 JOptionPane.showInputDialog( "Entrer les litres:" ); 23 24 // Convertir les litres du type String au type int. 25 litres = Integer.parseInt( entree2 ); 26 27 totalkilometres += kilometres; 28 totallitres += litres; 29 30 if ( litres!= 0 ) { 31 kilometresparlitre = ( float ) kilometres / litres; 32 resultat = "Km//l de ce plein: " + kilometresparlitre + "\n"; 33 34 35 totalkmparlitre = ( float ) totalkilometres / totallitres; 36 resultat += "\nkm//l total: " + totalkmparlitre; 37 38 JOptionPane.showMessageDialog( 39 null, resultat, "Kilométrage", 40 JOptionPane.INFORMATION_MESSAGE ); 41 42 // Lire la valeur suivante de kilomètres. 43 entree1 = 44 JOptionPane.showInputDialog( "Entrer les kilomètres (-1 pour quitter):" ); 45 46 47 System.exit( 0 ); 48 49 4.12 Développez une application Java qui determine si un client d un magasin d alimentation a dépassé sa limite de crédit sur son compte débiteur. Pour chaque consommateur, vous disposez des données suivantes: a) Numéro de compte b) Solde au début du mois. c) Total des articles portés en compte de ce client ce mois-ci. d) Total de tous les crédits appliqués au compte de ce client ce mois-ci. e) Limite de crédit autorisée. Le programme doit entrer chaque donnée sous la forme d entiers dans des boîtes de dialogue d entrée, calculer le nouveau solde (= solde du début + coûts crédits), afficher le nouveau solde et déterminer si le nouveau solde dépasse la limite de crédit du client. Pour les clients qui dépassent leur limite de crédit, le programme affiche le message «Limite de crédit dépassée.» Intitulé: Déterminer si les clients d un nombre quelconque de magasins ont dépassé leur limite de crédit sur un compte débiteur. Premier affinage:
Entrer le numéro de compte, la balance initiale, le total des achats portés en compte, le crédit total et la limite de crédit d un client, calculer le nouveau solde du client et déterminer si le solde dépasse la limite de crédit. Traiter ensuite le client suivant. Deuxième affinage: Entrer le numéro de compte du client Entrer le solde initial du client Entrer le total des achats portés en compte du client Entrer le total des crédits du client Entrer la limite de crédit du client Lorsque l utilisateur appuie sur OK dans la boîte de dialogue de la limite de crédit Calculer le nouveau solde du client Afficher le nouveau solde Si le solde dépasse la limite de crédit Afficher "Limite de crédit dépassée" 1 // Solution de l exercice 4.12. 2 // Credit.java 3 // Ce programme gère des comptes créditeurs. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Credit { 8 public static void main( String args[] ) 9 { 10 String entreechaine; 11 int compte, nouveausolde, 12 anciensolde, credits, limitecredit, achats; 13 14 entreechaine = 15 JOptionPane.showInputDialog( "Entrer le n de compte (-1 pour quitter):" ); 16 17 while ( ( compte = Integer.parseInt( entreechaine ) )!= -1 ) { 18 entreechaine = 19 JOptionPane.showInputDialog( "Entrer le solde: " ); 20 anciensolde = Integer.parseInt( entreechaine ); 21 22 entreechaine = 23 JOptionPane.showInputDialog( "Entrer le montant des achats: " ); 24 achats = Integer.parseInt( entreechaine ); 25 26 entreechaine = 27 JOptionPane.showInputDialog( "Entrer le montant remboursé: " ); 28 credits = Integer.parseInt( entreechaine ); 29 30 entreechaine = 31 JOptionPane.showInputDialog( "Entrer la limite de crédit accordée: " ); 32 limitecredit = Integer.parseInt( entreechaine ); 33 34 nouveausolde = anciensolde + achats - credits; 35 36 String chaineresultats, chaineetatcredit; 37 chaineresultats = "Le nouveau solde est de " + nouveausolde; 38 39 if ( nouveausolde > limitecredit ) 40 chaineetatcredit = "LIMITE DE CRÉDIT DÉPASSÉE"; 41 else 42 chaineetatcredit = "Report de crédit"; 43 44 JOptionPane.showMessageDialog( 45 null, chaineresultats, 46 chaineetatcredit, 47 JOptionPane.INFORMATION_MESSAGE ); 48 49 entreechaine =
50 JOptionPane.showInputDialog( "Entrer le n de compte (-1 pour quitter):" ); 51 52 53 System.exit( 0 ); 54 55 4.13 Une grande société paie ses vendeurs sur base d une commission. Les vendeurs reçoivent 200 $ par semaine plus 9% de leurs ventes brutes de la semaine. Par exemple, un vendeur qui vend pour 5000 $ de marchandises sur une semaine reçoit 200 $ plus 9% de 5000 $, soit un total de 650 $. Vous avez obtenu une liste des articles vendus la semaine dernière par un vendeur, qui se répartit comme suit: Article Valeur 1 239,99 2 129,75 3 99,95 4 350,89 Développez une application Java qui entre les articles vendus par un vendeur sur la semaine précédente, puis calcule et affiche la commission du vendeur. Il n y a pas de limite au nombre d articles vendus par une personne. N oubliez pas d introduire les virgules décimales sous la forme de points décimaux dans le programme. Intitulé: Premier affinage: Déterminer les gains d un vendeur sur la semaine précédente. Initialiser les variables et entrer les articles vendus. Calculer et afficher les gains du vendeur Deuxième affinage: Initialiser le brut à zéro Entrer le premier article Tant que la valeur de la sentinelle n a pas été entrée Déterminer la valeur de l article et l ajouter au brut Prendre l article suivant Calculer les gains du vendeur Afficher les gains du vendeur 1 // Solution de l exercice 4.13. 2 // Ventes.java 3 // Ce programme calcule des chiffres de vente. 4 import javax.swing.joptionpane; 5 6 public class Ventes { 7 public static void main( String args[] ) 8 { 9 double brut = 0.0, gains; 10 int produit = 0, nombre; 11 String entree; 12 13 while ( produit < 4 ) {
14 produit++; 15 // Lire un nombre de l utilisateur sous forme d une chaîne. 16 entree = 17 JOptionPane.showInputDialog( 18 "Entrer la quantité vendue du produit #" + produit + ":" ); 19 20 // Convertir les nombres du type String au type int. 21 nombre = Integer.parseInt( entree ); 22 23 if ( produit == 1 ) 24 brut += nombre * 239.99; 25 else if ( produit == 2 ) 26 brut += nombre * 129.75; 27 else if ( produit == 3 ) 28 brut += nombre * 99.95; 29 else if ( produit == 4 ) 30 brut += nombre * 350.89; 31 32 33 gains = 0.09 * brut + 200; 34 String resultat = "Commission de cette semaine: " + gains; 35 36 JOptionPane.showMessageDialog( 37 null, resultat, "Ventes", 38 JOptionPane.INFORMATION_MESSAGE ); 39 System.exit( 0 ); 40 41 4.14 Développez une application Java qui détermine le salaire brut individuel de trois employés. Pour chaque employé, la société paie des heures pleines sur les 40 premières heures prestées par cet employé et paie à 150% les heures supplémentaires prestées au delà des 40 premières heures. Vous avez une liste des employés de la société, des nombres d heures prestées par chacun d eux sur la semaine précédente et du taux horaire individuel. Le programme que vous devez mettre au point demande ces informations pour chaque employé et calcule le salaire hebdomadaire brut de chacun des employés. Utilisez des boîtes de dialogue d entrée pour introduire les données. Intitulé: Pour un nombre quelconque d employés, calculer la paie de l employé. Premier affinage: Entrer les heures de travail, entrer le taux horaire, déterminer s il y a eu heures supplémentaires, et sortir le montant de la paie. Deuxième affinage: Entrer le nombre d heures prestées Quand les heures prestées sont entrées Prendre le taux horaire Si le nombre d heures prestées est inférieur ou égal à 40
Calculer le salaire Sinon Calculer le salaire en heures supplémentaires Afficher le montant du salaire 1 // Solution de l exercice 4.14. 2 // Salaire.java 3 // Ce programme calcule des salaires. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Salaire { 8 public static void main( String args[] ) 9 { 10 String entreechaine; 11 double paie; 12 int heures, taux; 13 14 entreechaine = 15 JOptionPane.showInputDialog( "Entrer le taux horaire (-1 pour quitter): " ); 16 17 while ( ( heures = Integer.parseInt( entreechaine ) )!= -1 ) { 18 entreechaine = 19 JOptionPane.showInputDialog( "Entrer les heures prestées: " ); 20 taux = Integer.parseInt( entreechaine ); 21 22 if ( heures > 40 ) 23 paie = ( 40.0 * taux ) + ( heures - 40 ) * ( taux * 1.5 ); 24 else 25 paie = heures * taux; 26 27 String chaineresultats; 28 chaineresultats = "Le salaire est de " + paie + " $"; 29 30 JOptionPane.showMessageDialog( 31 null, chaineresultats, 32 "Salaire", JOptionPane.INFORMATION_MESSAGE ); 33 34 entreechaine = 35 JOptionPane.showInputDialog( "Entrer le taux horaire (-1 pour quitter): " ); 36 37 38 System.exit( 0 ); 39 40 4.15 Le processus qui consiste à trouver la plus grande valeur, c est-à-dire le maximum d un groupe de valeurs, intervient souvent dans les applications informatiques. Par exemple, un programme qui détermine le gagnant d un concours de ventes a besoin des chiffres de ventes de chaque personne, et la personne qui a le plus vendu gagne le concours. Écrivez un programme en pseudocode, puis une application Java qui entre une suite de 10 nombres à 1 seul chiffre sous la forme de caractères, détermine puis affiche le plus grand de ces nombres. Astuce: le programme doit utiliser trois variables: compteur: nombre: plusgrand: un compteur qui compte jusqu à 10 (c est-à-dire qui garde la trace du nombre d entrées et détermine quand 10 nombres ont été traités). le chiffre entré courant. le plus grand nombre connu jusqu ici.
1 // Solution de l exercice 4.15. 2 // PlusGrand.java 3 // Ce programme détermine et affiche 4 // le plus grand parmi dix nombres. 5 import java.awt.*; 6 import javax.swing.*; 7 8 public class PlusGrand { 9 public static void main( String args[] ) 10 { 11 int plusgrand = 0, nombre = 1, compteur = 0; 12 13 while ( compteur < 10 ) { 14 nombre = Integer.parseInt( 15 JOptionPane.showInputDialog( "Entrer un nombre: " ) ); 16 17 if ( nombre > plusgrand ) 18 plusgrand = nombre; 19 20 ++compteur; 21 22 23 JOptionPane.showMessageDialog( 24 null, "Le plus grand est " + plusgrand, 25 "Exercice 4.15", JOptionPane.INFORMATION_MESSAGE ); 26 27 System.exit( 0 ); 28 29
4.16 Écrivez une application Java qui utilise une boucle pour afficher le tableau de valeurs suivant: N 10*N 100*N 1000*N 1 10 100 1000 2 20 200 2000 3 30 300 3000 4 40 400 4000 5 50 500 5000 1 // Solution de l exercice 4.16. 2 // Table.java 3 // Ce programme affiche une table de valeurs. 4 5 public class Table { 6 public static void main( String args[] ) 7 { 8 int n = 0; 9 10 System.out.println( "N\t10*N\t100*N\t1000*N\n" ); 11 12 while ( ++n <= 5 ) 13 System.out.println( n + "\t" + ( 10 * n ) + 14 "\t" + ( 100 * n ) + "\t" 15 + ( 1000 * n ) ); 16 17 N 10*N 100*N 1000*N 1 10 100 1000 2 20 200 2000 3 30 300 3000 4 40 400 4000 5 50 500 5000 4.17 Par une approche semblable à celle de l exercice 4.15, trouvez les deux plus grandes valeurs parmi les 10 chiffres introduits. Vous ne pouvez entrer qu une seule fois les nombres. 1 // Solution de l exercice 4.17. 2 // DeuxPlusGrands.java 3 // Ce programme détermine et affiche les deux plus grands parmi dix nombres. 4 import java.awt.*; 5 import javax.swing.*; 6 7 public class DeuxPlusGrands { 8 public static void main( String args[] ) 9 { 10 int plusgrand = 0, plusgrandsuivant = 0, nombre = 0, compteur = 1; 11 12 while ( compteur <= 10 ) { 13 nombre = Integer.parseInt( 14 JOptionPane.showInputDialog( "Entrer un nombre: " ) ); 15 16 if ( nombre > plusgrand ) { 17 plusgrandsuivant = plusgrand; 18 plusgrand = nombre; 19 20 else if ( nombre > plusgrandsuivant ) 21 plusgrandsuivant = nombre;
22 23 ++compteur; 24 25 26 JOptionPane.showMessageDialog( 27 null, "Le plus grand et " + plusgrand + 28 "\nle second plus grand est " + plusgrandsuivant, 29 "Exercice 4_17", JOptionPane.INFORMATION_MESSAGE ); 30 31 System.exit( 0 ); 32 33 4.18 Modifiez le programme de la figure 4.11 pour valider ses entrées. À chaque entrée, si la valeur entrée est autre que 1 ou 2, maintenez la boucle pour obliger l utilisateur à entrer une valeur correcte. 1 // Solution de l exercice 4.18. 2 // Analyse.java 3 // Analyse de résultats d examen. 4 import javax.swing.joptionpane; 5 6 public class Analyse { 7 8 public static void main( String args[] ) 9 { 10 // Initialiser les variables dans leur déclaration. 11 int reussites = 0, echecs = 0, etudiant = 1, resultat; 12 String entree, sortie; 13 14 // Traiter 10 étudiants; boucle pilotée par compteur. 15 while ( etudiant <= 10 ) { 16 entree = JOptionPane.showInputDialog( 17 "Entrer un résultat (1=réussite, 2=échec): " ); 18 19 resultat = Integer.parseInt( entree ); 20
21 if ( resultat == 1 ) { // if/else imbriqué dans le while. 22 reussites++; 23 etudiant++; 24 25 else if ( resultat == 2 ) { 26 echecs++; 27 etudiant++; 28 29 else 30 JOptionPane.showMessageDialog( 31 null, "Entrée non valable", "Erreur", 32 JOptionPane.ERROR_MESSAGE ); 33 34 35 sortie = "Réussites: " + reussites; 36 sortie += "\néchecs: " + echecs; 37 38 if ( reussites > 8 ) 39 sortie += "\npromouvoir le cours "; 40 41 JOptionPane.showMessageDialog( 42 null, sortie, "Résultats", 43 JOptionPane.INFORMATION_MESSAGE ); 44 45 System.exit( 0 ); 46 47 4.19 Qu affiche le programme suivant? public class Mystere2 { public static void main( String args[] ) { int compte = 1; while ( compte <= 10 ) { System.out.println( compte % 2 == 1? "****" : "++++++++" ); ++compte;
**** ++++++++ **** ++++++++ **** ++++++++ **** ++++++++ **** ++++++++ 4.20 Qu affiche le programme suivant? public class Mystere3 { public static void main( String args[] ) { int rangee = 10, colonne; while ( rangee >= 1 ) { colonne = 1; while ( colonne <= 10 ) { System.out.print( rangee % 2 == 1? "<" : ">" ); ++colonne; --rangee; System.out.println(); >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< >>>>>>>>>> <<<<<<<<<< 4.21 (Problème du else pendant) Déterminez la sortie de chaque proposition suivante, lorsque x vaut 9 et y vaut 11, puis quand x vaut 11 et y vaut 9. Notez que le compilateur ignore les retraits dans les programmes Java. Également, le compilateur Java associe toujours un else avec le dernier if rencontré, sauf indication contraire par le placement d accolades ({). Du fait que le programmeur ne peut au premier coup d œil garantir avec quel if un else s associe, on qualifie cette situation de «problème du else pendant». Nous avons éliminé les retraits du code suivant pour ajouter un peu de piquant à ce problème. Astuce: appliquez toutes les conventions de retrait que vous avez étudiées. a) if ( x < 10 ) if ( y > 10 ) System.out.println( "*****" ); else System.out.println( "#####" ); System.out.println( "$$$$$" );
Partie a: x = 9, y = 11 ***** $$$$$ Partie b: x = 9, y = 11 ***** b) if ( x < 10 ) { if ( y > 10 ) System.out.println( "*****" ); else { System.out.println( "#####" ); System.out.println( "$$$$$" ); Partie a: x = 11, y = 9 $$$$$ Partie b: x = 11, y = 9 ##### $$$$$ 4.22 (Un autre problème du else pendant) Modifiez le code suivant pour produire la sortie montrée. Utilisez les techniques de retrait adéquates. Vous ne pouvez appliquer d autre changement que l insertion d accolades et le décalage des lignes de code par un retrait approprié. Le compilateur ignore les retraits d un programme en Java. Nous avons éliminé les retraits du code suivant pour ajouter un peu de piquant à ce problème. Note: il est possible qu aucune modification ne soit nécessaire. if ( y == 8 ) if ( x == 5 ) System.out.println( "@@@@@" ); else System.out.println( "#####" ); System.out.println( "$$$$$" ); System.out.println( "&&&&&" ); a) En supposant que x = 5 et y = 8, la sortie suivante est générée. @@@@@ $$$$$ &&&&& if ( y == 8 ) if ( x == 5 ) System.out.println( "@@@@@" ); else System.out.println( "#####" ); System.out.println( "$$$$$" ); System.out.println( "&&&&&" ); b) En supposant que x = 5 et y = 8, la sortie suivante est générée. @@@@@
if ( y == 8 ) if ( x == 5 ) System.out.println( "@@@@@" ); else { System.out.println( "#####" ); System.out.println( "$$$$$" ); System.out.println( "&&&&&" ); c) En supposant que x = 5 et y = 8, la sortie suivante est générée. @@@@@ &&&&& if ( y == 8 ) if ( x == 5 ) System.out.println( "@@@@@" ); else { System.out.println( "#####" ); System.out.println( "$$$$$" ); System.out.println( "&&&&&" ); d) En supposant que x = 5 et y = 7, la sortie suivante est générée. Note: les trois dernières instructions de sortie après le else font toutes partie d une même instruction composée. ##### $$$$$ &&&&& if ( y == 8 ) { if ( x == 5 ) System.out.println( "@@@@@" ); else System.out.println( "#####" ); System.out.println( "$$$$$" ); System.out.println( "&&&&&" ); 4.23 Écrivez une applet qui lise la taille du côté d un carré et affiche un carré évidé de cette taille à l aide d astérisques et qui appelle la méthode drawstring au sein de la méthode paint de l applet. Utilisez une boîte de dialogue d entrée pour demander à l utilisateur la taille du carré. Le programme doit fonctionner avec des carrés de 1 à 20 de côté. 1 // Solution de l exercice 4.23. 2 // Creux.java 3 // Ce programme affiche un carré creux. 4 import javax.swing.*; 5 import java.awt.graphics; 6 7 public class Creux extends JApplet { 8 int etoiles; 9 10 public void init() 11 { 12 String entree; // entrées utilisateur. 13 14 // Lire un nombre de l utilisateur sous forme d une chaîne. 15 entree = 16 JOptionPane.showInputDialog( 17 "Entrer la longueur du côté:" );
18 19 // Convertir le nombre du type String au type int. 20 etoiles = Integer.parseInt( entree ); 21 22 if ( etoiles < 1 ) { 23 etoiles = 1; 24 JOptionPane.showMessageDialog( 25 null, "Utilisation de la valeur prédéfinie de 1", "Erreur", 26 JOptionPane.ERROR_MESSAGE ); 27 28 else if ( etoiles > 20 ) { 29 etoiles = 20; 30 JOptionPane.showMessageDialog( 31 null, "Utilisation de la valeur prédéfinie de 20", "Erreur", 32 JOptionPane.ERROR_MESSAGE ); 33 34 35 36 public void paint( Graphics g ) 37 { 38 int x = 5, y = 70, i = 1, j = 1; 39 40 while ( i <= etoiles ) { 41 42 while ( j <= etoiles ) { 43 44 if ( i == 1 ) 45 g.drawstring( "*", x += 5, y ); 46 else if ( i == etoiles ) 47 g.drawstring( "*", x += 5, y ); 48 else if ( j == 1 ) 49 g.drawstring( "*", x += 5, y ); 50 else if ( j == etoiles ) 51 g.drawstring( "*", x += 5, y ); 52 else 53 g.drawstring( " ", x += 5, y ); 54 55 j++; 56 57 58 j = 1; 59 i++; 60 y += 5; 61 x = 5; 62 63 64
4.24 Un palindrome est un nombre ou une phrase de texte qui se lit identiquement dans un sens et dans l autre. Par exemple, les nombres suivants de cinq chiffres sont tous des palindromes: 12321, 55555, 45554 et 11611. Écrivez une application qui demande un entier de cinq chiffres et détermine si c est un palindrome ou non. Si le nombre ne compte pas cinq chiffres, affichez une boîte de message d erreur indiquant le problème à l utilisateur. Lorsque l utilisateur annule la boîte de message, faites en sorte de permettre à l utilisateur d entrer une nouvelle valeur. 1 // Solution de l exercice 4.24. 2 // Palin.java 3 // Ce programme vérifie la présence d un palindrome. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Palin { 8 public static void main( String args[] ) 9 { 10 String chainevaleur; 11 12 // Entrer le palindrome potentiel sous forme de chaîne. 13 chainevaleur = 14 JOptionPane.showInputDialog( "Entrer un nombre de 5 chiffres: " ); 15 16 int nombre = Integer.parseInt( chainevaleur ); 17 18 if ( nombre < 99999 ) { 19 int chiffre1, chiffre2, chiffre4, chiffre5; 20 21 chiffre1 = nombre / 10000; 22 chiffre2 = nombre % 10000 / 1000; 23 chiffre4 = nombre % 10000 % 1000 % 100 / 10; 24 chiffre5 = nombre % 10000 % 1000 % 100 % 10; 25 26 String chaineresultat; 27 if ( ( chiffre1 == chiffre5 ) && ( chiffre2 == chiffre4 ) ) 28 chaineresultat = chainevaleur + " est un palindrome!!!"; 29 else 30 chaineresultat = chainevaleur + " n est pas un palindrome."; 31 32 // Pas un nombre de cinq chiffres. 33 JOptionPane.showMessageDialog( null, chaineresultat, 34 "Détecteur de palindrome", JOptionPane.INFORMATION_MESSAGE ); 35 36 else { 37 // Pas un nombre de cinq chiffres. 38 JOptionPane.showMessageDialog( 39 null, chainevaleur + " n est pas un nombre de cinq chiffres, ré-essayez", 40 "ERREUR Détecteur de palindrome!!!", 41 JOptionPane.INFORMATION_MESSAGE ); 42 43 44 System.exit( 0 ); 45 46 47 4.25 Écrivez une application qui entre un entier ne contenant que des 0 et des 1 (donc un nombre binaire) et affichez son équivalent en décimal. Astuce: utilisez les opérateurs modulo et de division pour extraire les chiffres binaires du nombre, un à la fois et de droite à gauche. Tout se passe comme dans le système de numération décimal où le chiffre le plus à droite a une valeur position-
nelle de 1, le chiffre suivant à gauche a la valeur positionnelle de 10, et ainsi de suite pour le 100 et le 1000; dans le système de numération binaire, le chiffre le plus à droite a la valeur positionnelle de 1, le suivant à gauche, la valeur positionnelle de 2, puis 4, puis 8, etc. Ainsi, le nombre décimal 234 peut être interprété comme 4 * 1 + 3 * 10 + 2 * 100. L équivalent décimal du nombre binaire 1101 est 1 * 1 + 0 * 2 + 1 * 4 + 1 * 8, ou 1 + 0 + 4 + 8, ou encore 13. 1 // Solution de l exercice 4.25. 2 // Binaire.java 3 // Ce programme affiche l équivalent décimal 4 // d un nombre binaire. 5 import java.awt.*; 6 import javax.swing.joptionpane; 7 8 public class Binaire { 9 public static void main( String args[] ) 10 { 11 String chainevaleur; 12 13 // Entrer les chiffres binaires sous forme de chaîne. 14 chainevaleur = 15 JOptionPane.showInputDialog( "Entrer un nombre binaire: " ); 16 17 int binaire = Integer.parseInt( chainevaleur ); 18 int facteur = 1, bithaut = 1; 19 int decimal = 0; 20 21 while ( ( binaire / facteur )!= 0 ) { 22 // Le bithaut sera 2X plus grand que nécessaire 23 // lorsque la boucle échouera. 24 bithaut *= 2; 25 26 // Le facteur sera 10X plus grand que nécessaire 27 // lorsque la boucle échouera. 28 facteur *= 10; 29 30 31 bithaut /= 2; // corriger bithaut. 32 facteur /= 10; // corriger facteur. 33 34 while ( bithaut >= 1 ) { 35 decimal += ( binaire / facteur ) * bithaut; 36 bithaut /= 2; 37 binaire %= facteur; 38 facteur /= 10; 39 40 41 JOptionPane.showMessageDialog( 42 null, "La valeur décimale est : " + decimal, "Conversion binaire-décimale", 43 JOptionPane.INFORMATION_MESSAGE ); 44 45 System.exit( 0 ); 46 47 48
4.26 Écrivez une application qui affiche le motif d un échiquier tel que celui-ci: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Le programme ne peut utiliser que trois instructions de sortie, une de la forme une de la forme System.out.print( "* " ); System.out.print( " " ); et une autre de la forme System.out.println(); Notez que l instruction précédente indique que le programme doit afficher un seul caractère de nouvelle ligne pour revenir au début de la ligne suivante de l affichage. Astuce: des structures de répétition sont nécessaires dans cet exercice. 1 // Solution de l exercice 4.26. 2 // Etoiles.java 3 // Ce programme affiche un motif en forme de damier. 4 5 public class Etoiles { 6 7 public static void main( String args[] ) 8 { 9 int rangee = 0; 10 11 while ( ++rangee <= 8 ) { 12 int col = 0; 13 14 if ( rangee % 2 == 0 ) 15 System.out.print( " " ); 16 17 while ( ++col <= 8 ) 18 System.out.print( "* " ); 19 20 System.out.println(); 21 22 23 System.exit( 0 ); 24 25 26 4.27 Écrivez une application qui affiche indéfiniment dans la fenêtre de commande les multiples de l entier 2, c est-à-dire 2, 4, 8, 16, 32, 64, et ainsi de suite. Votre boucle ne doit pas avoir de fin; c est une boucle infinie. Que se passe-t il lorsque vous exécutez ce programme? 1 // Solution de l exercice 4.27. 2 // BoucleInfinie.java 3 // Ce programme crée une boucle infinie. 4 // Il dépasse la plage de valeurs des entiers (le nombre est trop grand). 5 6 public class BoucleInfinie {
7 8 public static void main( String args[] ) 9 { 10 int x = 1; 11 12 while ( true ) { 13 x *= 2; 14 System.out.println( x + " " ); 15 16 17 Note: ici, il ne faut surtout pas de System.exit( 0 ); sinon, le compilateur considère que cette instruction n est jamais atteinte et il signale une erreur de compilation. Lors de l exécution, interrompez le programme (dans une fenêtre DOS) par l appui simultané sur les touches Ctrl et C. 4.28 Qu y-a-t il de faux dans l instruction suivante? Donnez l instruction correcte qui ajoute un à la somme de x et y. System.out.println( ++(x + y) ); ++ ne s applique qu à une variable et non à une expression constante. L instruction correcte est: System.out.println( x + y + 1 ); 4.29 Écrivez une application qui demande à l utilisateur trois valeurs non nulles dans des boîtes de dialogue d entrée, détermine puis affiche s ils peuvent représenter les côtés d un triangle. 1 // Solution de l exercice 4.29. 2 // Triangle1.java 3 // Ce programme prend trois valeurs 4 // et détermine s ils forment les côtés d un triangle. 5 import java.awt.*; 6 import javax.swing.joptionpane; 7 8 public class Triangle1 { 9 public static void main( String args[] ) 10 { 11 String entreechaine; 12 13 double cote1, cote2, cote3; 14 // Entrer trois côtés sous forme de chaînes et les convertir en entiers. 15 entreechaine = 16 JOptionPane.showInputDialog( "Entrer le côté 1: " ); 17 cote1 = Double.valueOf( entreechaine ).doublevalue(); 18 19 entreechaine = 20 JOptionPane.showInputDialog( "Entrer le côté 2: " ); 21 cote2 = Double.valueOf( entreechaine ).doublevalue(); 22 23 entreechaine = 24 JOptionPane.showInputDialog( "Entrer le côté 3: " ); 25 cote3 = Double.valueOf( entreechaine ).doublevalue(); 26 27 String chaineresultat; 28 if ( ( cote1 + cote2 > cote3 ) && ( cote2 + cote3 > cote1 ) && 29 ( cote3 + cote1 > cote2 ) ) 30 chaineresultat = "Ils peuvent former les côtés d un triangle."; 31 else 32 chaineresultat = "Ils ne forment pas de triangle."; 33 34 JOptionPane.showMessageDialog( null, chaineresultat, 35 "Détecteur de triangle", JOptionPane.INFORMATION_MESSAGE ); 36 37 System.exit( 0 ); 38 39
4.30 Écrivez une application qui lise trois entiers différents de zéro, détermine puis affiche s ils peuvent figurer les côtés d un triangle droit. 1 // Solution de l exercice 4.30. 2 // Triangle2.java 3 // Ce programme prend trois entiers et détermine 4 // s ils forment les côtés d un triangle droit. 5 import javax.swing.joptionpane; 6 7 public class Triangle2 { 8 public static void main( String args[] ) 9 { 10 int cote1, cote2, hypotenuse; 11 String entree, resultat; 12 13 // Lire un nombre de l utilisateur sous forme d une chaîne. 14 entree = JOptionPane.showInputDialog( 15 "Entrer la longueur du côté 1:" ); 16 17 cote1 = Integer.parseInt( entree ); 18 19 // Lire un nombre de l utilisateur sous forme d une chaîne. 20 entree = 21 JOptionPane.showInputDialog( 22 "Entrer la longueur du côté 2:" ); 23 24 cote2 = Integer.parseInt( entree ); 25 26 // Lire un nombre de l utilisateur sous forme d une chaîne. 27 entree = JOptionPane.showInputDialog( 28 "Entrer la longueur de l hypoténuse:" ); 29 30 hypotenuse = Integer.parseInt( entree ); 31 32 if ( ( cote1 * cote1 + cote2 * cote2 ) == ( hypotenuse * hypotenuse ) ) 33 resultat = "Ce sont les côtés d un triangle droit."; 34 else 35 resultat = "Ce ne sont pas les côtés d un triangle droit."; 36 37 JOptionPane.showMessageDialog( null, resultat, "Résultats", 38 JOptionPane.INFORMATION_MESSAGE ); 39 40 System.exit( 0 ); 41 42
4.31 Une société veut transmettre des données par téléphone, mais elle tient compte de ce que les lignes comportent le risque du piratage, alors toutes les données sont transmises sous la forme de quatre entiers. Elle vous a demandé d écrire un programme qui crypte ses données introduites par l utilisateur dans une boîte de dialogue d entrée comme suit: remplacer chaque chiffre par (la somme de ce chiffre et de 7) modulo 10; puis échanger le premier chiffre et le troisième, puis échanger le deuxième chiffre avec le quatrième, et afficher l entier obtenu. Écrivez un programme distinct qui demande un entier de quatre chiffres ainsi crypté et le décrypte pour restituer l entier initial. 1 // Solution de l exercice 4.31, partie A. 2 // Cryptage.java 3 // Ce programme crypte un nombre de quatre chiffres. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Cryptage { 8 public static void main( String args[] ) 9 { 10 int chiffre1, chiffre2, chiffre3, chiffre4; 11 String entreechaine; 12 13 // Entrer le nombre de quatre chiffres à crypter. 14 entreechaine = 15 JOptionPane.showInputDialog( "Entrer un nombre de quatre chiffres: " ); 16 17 int nombre = Integer.parseInt( entreechaine ); 18 chiffre1 = ( nombre / 1000 + 7 ) % 10; 19 chiffre2 = ( nombre % 1000 / 100 + 7 ) % 10; 20 chiffre3 = ( nombre % 1000 % 100 / 10 + 7 ) % 10; 21 chiffre4 = ( nombre % 1000 % 100 % 10 + 7 ) % 10; 22 23 int temp = chiffre1; 24 chiffre1 = chiffre3 * 1000; 25 chiffre3 = temp * 10; 26 27 temp = chiffre2; 28 chiffre2 = chiffre4 * 100; 29 chiffre4 = temp; 30 31 int nombrecrypte; 32 nombrecrypte = chiffre1 + chiffre2 + chiffre3+ chiffre4; 33 34 JOptionPane.showMessageDialog( 35 null, "Le nombre crypté est " + nombrecrypte, 36 "Crypteur", JOptionPane.INFORMATION_MESSAGE ); 37 38 System.exit( 0 ); 39 40
1 // Solution de l exercice 4.31, partie B. 2 // Decrypteur.java 3 // Ce programme décrypte un nombre de quatre chiffres. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Decrypteur { 8 public static void main( String args[] ) 9 { 10 String entreechaine; 11 12 // Entrer le nombre de quatre chiffres à décrypter. 13 entreechaine = 14 JOptionPane.showInputDialog( "Entrer un nombre de quatre chiffres: " ); 15 16 int nombre = Integer.parseInt( entreechaine ); 17 int chiffre1, chiffre2, chiffre3, chiffre4; 18 chiffre1 = nombre / 1000; 19 chiffre2 = nombre % 1000 / 100; 20 chiffre3 = nombre % 1000 % 100 / 10; 21 chiffre4 = nombre % 1000 % 100 % 10; 22 23 int temp = ( chiffre1 + 3 ) % 10; 24 chiffre1 = ( chiffre3 + 3 ) % 10; 25 chiffre3 = temp; 26 27 temp = ( chiffre2 + 3 ) % 10; 28 chiffre2 = ( chiffre4 + 3 ) % 10; 29 chiffre4 = temp; 30 31 int nombredechiffre = chiffre1 * 1000 + chiffre2 * 100 32 + chiffre3 * 10 + chiffre4; 33 34 JOptionPane.showMessageDialog( 35 null, "Le nombre décrypté est " + nombredechiffre, 36 "Décrypteur", JOptionPane.INFORMATION_MESSAGE ); 37 38 System.exit( 0 ); 39 40 4.32 La factorielle d un entier non négatif n s écrit n!, et se prononce «factorielle n». Elle se calcule comme suit: n! = n (n - 1) (n - 2)... 1 (pour les valeurs de n plus grandes ou égales à 1) et n! = 1 (for n = 0). Par exemple, 5! = 5 4 3 2 1, ce qui correspond à 120. a) Écrivez une application qui lise un entier non négatif à partir d une boîte de dialogue d entrée, calcule et affiche sa factorielle.
b) Écrivez une application qui estime la valeur de la constante mathématique e à l aide de la formule: 1 1 1 e = 1 + ---- + ---- + ---- + 1! 2! 3! c) Écrivez une application qui calcule la valeur de e x par la formule: x 2 x 3 e x = 1 + ---- x + ---- + ---- + 1! 2! 3! 1 // Solution de l exercice 4.32, partie A. 2 // Factorielle.java 3 // Ce programme calcule une factorielle. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class Factorielle { 8 public static void main( String args[] ) 9 { 10 String entreechaine; 11 12 entreechaine = 13 JOptionPane.showInputDialog( "Entrer un entier positif: " ); 14 int nombre = Integer.parseInt( entreechaine ); 15 16 int n = 0; 17 int factorielle = 1; 18 19 while ( ++n <= nombre ) 20 factorielle *= n; 21 22 JOptionPane.showMessageDialog( 23 null, String.valueOf( nombre ) + "! vaut " 24 + String.valueOf( factorielle ), "Factorielle, partie a", 25 JOptionPane.INFORMATION_MESSAGE ); 26 27 System.exit( 0 ); 28 29 1 // Solution de l exercice 4.32, partie B. 2 // E.java 3 // Ce programme calcule la valeur de e. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class E { 8 public static void main( String args[] ) 9 { 10 int n = 0, precision = 15, fact = 1; 11 double e = 1.0; 12 13 while ( ++n < precision ) { 14 fact *= n; 15 e += 1.0 / fact; 16 17
18 JOptionPane.showMessageDialog( 19 null, " e vaut " + e, "Factorielle, partie b", 20 JOptionPane.INFORMATION_MESSAGE ); 21 22 System.exit( 0 ); 23 24 1 // Solution de l exercice 4.32, partie C. 2 // EexposantX.java 3 // Ce programme calcule e à la puissance x. 4 import java.awt.*; 5 import javax.swing.joptionpane; 6 7 public class EexposantX { 8 public static void main( String args[] ) 9 { 10 String entreechaine; 11 entreechaine = 12 JOptionPane.showInputDialog( "Entrer l exposant: " ); 13 int x = Integer.parseInt( entreechaine ); 14 15 int n = 0, precision = 15, fois = 0, compteur; 16 double e = 1, exp = 0.0, fact = 1.0; 17 18 while ( ++n <= precision ) { 19 compteur = n; 20 fact *= n; 21 22 while ( fois < compteur ) { 23 24 if ( fois == 0 ) 25 exp = 1.0; 26 exp *= x; 27 ++fois; 28 29 30 e += exp / fact; 31 32 33 JOptionPane.showMessageDialog( null, 34 " e à la puissance " + x + " vaut " + e, 35 "Factorielle, partie c", JOptionPane.INFORMATION_MESSAGE ); 36 37 System.exit( 0 ); 38 39