Академический Документы
Профессиональный Документы
Культура Документы
Algorithmes sur des structures de donnes ..........p.340 Thread pour baignoire et robinet .....P.380
EXERCICES -
page
303
Algorithme
Calcul de la valeur absolue d'un nombre rel
Objectif : Ecrire un programme Java servant calculer la valeur absolue d'un nombre rel x partir de la dfinition de la valeur absolue. La valeur absolue du nombre rel x est le nombre rel |x| : |x| = x , si x |x| = -x si x < 0 Spcifications de lalgorithme :
lire( x ); si x 0 alors crire( '|x| =', x) sinon crire( '|x| =', -x) fsi
Implantation en Java
Ecrivez avec les deux instructions diffrentes "if...else.." et "...?.. : ...", le programme Java complet correspondant l'affichage ci-dessous :
EXERCICES -
page
304
Algorithme
Algorithme de rsolution de l'quation du second degr dans R.
Objectif : On souhaite crire un programme Java de rsolution dans R de l'quation du second degr : Ax2 + Bx +C = 0 Il s'agit ici d'un algorithme trs classique provenant du cours de mathmatique des classes du secondaire. L'exercice consiste essentiellement en la traduction immdiate
Spcifications de lalgorithme :
Algorithme Equation Entre: A, B, C Rels Sortie: X1 , X2 Rels Local: Rels dbut lire(A, B, C); Si A=0 alors dbut{A=0} Si B = 0 alors Si C = 0 alors crire(R est solution) Sinon{C 0} crire(pas de solution) Fsi Sinon {B 0} X1 C/B; crire (X1) Fsi fin Sinon {A 0}dbut B2 - 4*A*C ; Si < 0 alors crire(pas de solution) Sinon { 0} Si = 0 alors X1 -B/(2*A); crire (X1) Sinon{ 0} X1 (-B + )/(2*A); X2 (-B - )/(2*A);
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
305
Implantation en Java
Ecrivez le programme Java qui est la traduction immdiate de cet algorithme dans le corps de la mthode main.
Conseil : On utilisera la mthode static sqrt(double x) de la classe Math pour calculer la racine carr d'un nombre rel :
EXERCICES -
page
306
Algorithme
Calcul des nombres de Armstrong
Objectif : On dnomme nombre de Armstrong un entier naturel qui est gal la somme des cubes des chiffres qui le composent. Exemple : 153 = 1 + 125 + 27, est un nombre de Armstrong.
Spcifications de lalgorithme :
On sait qu'il n'existe que 4 nombres de Armstrong, et qu'ils ont tous 3 chiffres (ils sont compris entre 100 et 500). Si l'on qu'un tel nombre est crit ijk (i chiffre des centaines, j chiffres des dizaines et k chiffres des units), il suffit simplement d'envisager tous les nombres possibles en faisant varier les chiffres entre 0 et 9 et de tester si le nombre est de Armstrong.
Implantation en Java
Ecrivez le programme Java complet qui fournisse les 4 nombres de Armstrong :
EXERCICES -
page
307
EXERCICES -
page
308
Algorithme
Calcul de nombres parfaits
Objectif : On souhaite crire un programme java de calcul des n premiers nombres parfaits. Un nombre est dit parfait sil est gal la somme de ses diviseurs, 1 compris. Exemple : 6 = 1+2+3 , est un nombre parfait.
Spcifications de lalgorithme :
l'algorithme retenu contiendra deux boucles imbriques. Une boucle de comptage des nombres parfaits qui s'arrtera lorsque le dcompte sera atteint, la boucle interne ayant vocation calculer tous les diviseurs du nombre examin d'en faire la somme puis de tester l'galit entre cette somme et le nombre. Algorithme Parfait Entre: n N Sortie: nbr N Local: somdiv, k, compt N dbut lire(n); compt 0; nbr 2; Tantque(compt < n) Faire somdiv 1; Pour k 2 jusqu nbr-1 Faire Si reste(nbr par k) = 0 Alors // k divise nbr somdiv somdiv + k Fsi Fpour ; Si somdiv = nbr Alors ecrire(nbr) ; compt compt+1; Fsi; nbr nbr+1 Ftant FinParfait
Implantation en Java
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
309
Ecrivez le programme Java complet qui produise le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
Entrez combien de nombre parfaits : 4 6 est un nombre parfait 28 est un nombre parfait 496 est un nombre parfait 8128 est un nombre parfait
EXERCICES -
page
310
Algorithme
Calcul du pgcd de 2 entiers (mthode Euclide)
Objectif : On souhaite crire un programme de calcul du pgcd de deux entiers non nuls, en Java partir de lalgorithme de la mthode d'Euclide. Voici une spcification de l'algorithme de calcul du PGCD de deux nombres (entiers strictement positifs) a et b, selon cette mthode : Spcifications de lalgorithme :
Algorithme Pgcd Entre: a,b N* x N* Sortie: pgcd N Local: r,t N x N dbut lire(a,b); Si ba Alors t a; a b; b t Fsi; Rpter r a mod b ; ab; br jusqu r = 0; pgcd a; ecrire(pgcd) FinPgcd
Implantation en Java
Ecrivez le programme Java complet qui produise le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) : Entrez le premier nombre : 21 Entrez le deuxime nombre : 45 Le PGCD de 21 et 45 est : 3
EXERCICES -
page
311
class ApplicationEuclide { public static void main(String[ ] args) { .. } static int pgcd (int a, int b) { .. } }
EXERCICES -
page
312
Algorithme
Calcul du pgcd de 2 entiers (mthode Egyptienne)
Objectif : On souhaite crire un programme de calcul du pgcd de deux entiers non nuls, en Java partir de lalgorithme de la mthode dite "gyptienne " Voici une spcification de l'algorithme de calcul du PGCD de deux nombres (entiers strictement positifs) p et q, selon cette mthode : Spcifications de lalgorithme :
Lire (p, q ) ; Tantque p q faire Si p > q alors ppq sinon qqp FinSi FinTant; Ecrire( " PGCD = " , p )
Implantation en Java
Ecrivez le programme Java complet qui produise le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
EXERCICES -
page
313
class ApplicationEgyptien { public static void main(String[ ] args) { .. } static int pgcd (int p, int q) { .. } } La mthode pgcd renvoie le pgcd des deux entiers p et q .
EXERCICES -
page
314
Algorithme
Calcul de nombres premiers (boucles while et dowhile)
Objectif : On souhaite crire un programme Java de calcul et d'affichage des n premiers nombres premiers. Un nombre entier est premier sil nest divisible que par 1 et par lui-mme On oprera une implantation avec des boucles while et do...while. Exemple : 37 est un nombre premier Spcifications de lalgorithme :
Algorithme Premier Entre: n N Sortie: nbr N Local: Est_premier {Vrai , Faux} divis,compt N2; dbut lire(n); compt 1; ecrire(2); nbr 3; Tantque(compt < n) Faire divis 3; Est_premier Vrai; Rpter Si reste(nbr par divis) = 0 Alors Est_premier Faux Sinon divis divis+2 Fsi jusqu (divis > nbr / 2)ou (Est_premier=Faux); Si Est_premier =Vrai Alors ecrire(nbr); compt compt+1 Fsi; nbr nbr+1 Ftant FinPremier
EXERCICES -
page
315
Implantation en Java
Ecrivez le programme Java complet qui produise le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
Proposition de squelette de classe Java implanter avec une boucle while et une boucle do...while imbrique :
On tudie la primalit de tous les nombres systmatiquement
EXERCICES -
page
316
Algorithme
Calcul de nombres premiers (boucles for)
Objectif : On souhaite crire un programme Java de calcul et d'affichage des n premiers nombres premiers. Un nombre entier est premier sil nest divisible que par 1 et par lui-mme. On oprera une implantation avec des boucles for imbriques. Exemple : 19 est un nombre premier
EXERCICES -
page
317
Implantation en Java
Ecrivez le programme Java complet qui produise le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
Proposition de squelette de classe Java implanter avec deux boucles for imbriques :
On tudie la primalit des nombres uniquement impairs
Le fait de n'tudier la primalit que des nombres impairs acclre la vitesse d'excution du programme, il est possible d'amliorer encore cette vitesse en ne cherchant que les diviseurs dont le carr est infrieur au nombre ( test : jusqu (divis2 > nbr )ou (Est_premier=Faux) )
EXERCICES -
page
318
Algorithme
Calcul du nombre d'or
Objectif : On souhaite crire un programme Java qui calcule le nombre d'or utilis par les anciens comme nombre idal pour la sculpture et l'architecture. Si l'on considre deux suites numriques (U) et (V) telles que pour n strictement suprieur 2 :
et On montre que la suite (V) tend vers une limite appele nombre d'or (nbr d'Or = 1,61803398874989484820458683436564). Spcifications de lalgorithme :
n,Un ,Un1 ,Un2 : sont des entiers naturels Vn ,Vn1 , : sont des nombres rels lire( ); // prcision demande Un2 1; Un1 2; Vn1 2; n 2; // rang du terme courant Itration n n + 1; Un Un1 + Un2 ; Vn Un / Un1 ; si |Vn - Vn1| alors Arrt de la boucle ; // la prcision est atteinte sinon Un2 Un1 ; Un1 Un ; Vn1 Vn ; fsi fin Itration ecrire (Vn , n);
Ecrire un programme fond sur la spcification prcdente de l'algorithme du calcul du nombre d'or. Ce programme donnera une valeur approche avec une prcision fixe de du
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
319
nombre d'or. Le programme indiquera en outre le rang du dernier terme de la suite correspondant.
Implantation en Java
On entre au clavier un nombre rel ci-dessous 0.00001, pour la prcision choisie (ici 5 chiffres aprs la virgule), puis le programme calcule et affiche le Nombre d'or (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
class AppliNombredOr {
Remarquons que nous proposons une boucle for ne contenant pas de condition de rebouclage dans son en-tte (donc en apparence infinie), puisque nous effectuerons le test "si |Vn - Vn1| <= Eps alors Arrt de la boucle" qui permet l'arrt de la boucle. Dans cette ventualit , la boucle for devra donc contenir dans son corps, une instruction de rupture de squence.
EXERCICES -
page
320
Algorithme
Conjecture de Goldbach
Objectif : On souhaite crire un programme Java afin de vrifier sur des exemples, la conjecture de GoldBach (1742), soit : "Tout nombre pair est dcomposable en la somme de deux nombres premiers". Dans cet exercice nous rutilisons un algorithme dj trait (algorithme du test de la primalit d'un nombre entier), nous rappelons ci-aprs un algorithme indiquant si un entier "nbr" est premier ou non :
Algorithme Premier Entre: nbr N Local: Est_premier {Vrai , Faux} divis,compt N2 ; dbut lire(nbr); divis 3; Est_premier Vrai; Rpter Si reste(nbr par divis) = 0 Alors Est_premier Faux Sinon divis divis+2 Fsi jusqu (divis > nbr / 2)ou (Est_premier=Faux); Si Est_premier = Vrai Alors ecrire(nbr est premier) Sinon ecrire(nbr n'est pas premier) Fsi FinPremier
Conseil : Il faudra traduire cet algorithme en fonction recevant comme paramtre d'entre le nombre entier dont on teste la primalit, et renvoyant un boolen true ou false selon que le nombre entr a t trouv ou non premier
EXERCICES -
page
321
Implantation en Java
On crira la mthode boolenne EstPremier pour dterminer si un nombre est premier ou non, et la mthode generCouples qui gnre les couples rpondant la conjecture.
EXERCICES -
page
322
Algorithme
Mthodes d'oprations sur 8 bits
Objectif : On souhaite crire une application de manipulation interne des bits d'une variable entire non signe sur 8 bits. Le but de l'exercice est de construire une famille de mthodes de travail sur un ou plusieurs bits d'une mmoire. L'application construire contiendra 9 mthodes :
1. Une mthode BitSET permettant de mettre 1 un bit de rang fix. 2. Une mthode BitCLR permettant de mettre 0 un bit de rang fix. 3. Une mthode BitCHG permettant de remplacer un bit de rang fix par son complment. 4. Une mthode SetValBit permettant de modifier un bit de rang fix. 5. Une mthode DecalageD permettant de dcaler les bits d'un entier, sur la droite de n positions (introduction de n zros gauche). 6. Une mthode DecalageG permettant de dcaler les bits d'un entier, sur la gauche de n positions (introduction de n zros droite). 7. Une mthode BitRang renvoyant le bit de rang fix d'un entier. 8. Une mthode ROL permettant de dcaler avec rotation, les bits d'un entier, sur la droite de n positions (rintroduction gauche). 9. Une mthode ROR permettant de dcaler avec rotation, les bits d'un entier, sur la gauche de n positions (rintroduction droite).
EXERCICES -
page
323
Implantation en Java
La conception de ces mthodes ne dpendant pas du nombre de bits de la mmoire oprer on choisira le type int comme base pour une mmoire. Ces mthodes sont classiquement des outils de manipulation de l'information au niveau du bit. Lors des jeux de tests pour des raisons de simplicit de lecture il est conseill de ne rentrer que des valeurs entires portant sur 8 bits. Il est bien de se rappeler que le type primaire int est un type entier sign sur 32 bits (reprsentation en complment deux).
class Application8Bits { public static void main(String [ ] args){ .. } static int BitSET (int nbr, int num) { .. } static int BitCLR (int nbr, int num) { .. } static int BitCHG (int nbr, int num) { .. } static int SetValBit (int nbr, int rang, int val) { .. static int DecalageD (int nbr, int n) { .. } static int DecalageG (int nbr, int n) { .. } static int BitRang (int nbr, int rang) { .. } static int ROL (int nbr, int n) { .. } static int ROR (int nbr, int n) { .. } }
EXERCICES -
page
324
EXERCICES -
page
325
Objectif : Ecrire un programme Java servant calculer la valeur absolue d'un nombre rel x partir de la dfinition de la valeur absolue. La valeur absolue du nombre rel x est le nombre rel |x| : |x| = x , si x |x| = -x si x < 0 Spcifications de lalgorithme :
lire( x ); si x>=0 alors crire( '|x| =', x) sinon crire( '|x| =', -x) fsi
EXERCICES -
page
326
Objectif : Ecrire un programme Java de rsolution dans R de l'quation du second degr : Ax2 + Bx +C = 0 Implantation en Java de la classe
EXERCICES -
page
327
Objectif : On dnomme nombre de Armstrong un entier naturel qui est gal la somme des cubes des chiffres qui le composent. Ecrire un programme Java qui affiche de tels nombres. Exemple : 153 = 1 + 125 + 27, est un nombre de Armstrong.
Implantation en Java
EXERCICES -
page
328
Objectif : On souhaite crire un programme java de calcul des n premiers nombres parfaits. Un nombre est dit parfait sil est gal la somme de ses diviseurs, 1 compris. Ecrire un programme Java qui affiche de tels nombres. Exemple : 6 = 1+2+3 , est un nombre parfait. Implantation en Java
Ci-dessous le programme Java complet qui produit le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
Entrez combien de nombre parfaits : 4 6 est un nombre parfait 28 est un nombre parfait 496 est un nombre parfait 8128 est un nombre parfait
EXERCICES -
page
329
Objectif : Ecrire un programme de calcul du pgcd de deux entiers non nuls, en Java partir de lalgorithme de la mthode d'Euclide. Implantation en Java
Ci-dessous le programme Java complet qui produit le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
EXERCICES -
page
330
Objectif : Ecrire un programme de calcul du pgcd de deux entiers non nuls, en Java partir de lalgorithme de la mthode dite "gyptienne ".
Implantation en Java
Ci-dessous le programme Java complet qui produit le dialogue suivant lcran (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
EXERCICES -
page
331
Objectif : On souhaite crire un programme Java de calcul et d'affichage des n premiers nombres premiers.
Implantation en Java avec une boucle while et une boucle do...while imbrique
EXERCICES -
page
332
Objectif : On souhaite crire un programme Java de calcul et d'affichage des n premiers nombres premiers.
EXERCICES -
page
333
Objectif : On souhaite crire un programme Java qui calcule le nombre d'or utilis par les anciens comme nombre idal pour la sculpture et l'architecture (nbr d'Or = 1,61803398874989484820458683436564). Implantation en Java avec un boucle for :
Le programme ci-dessous donne une valeur approche avec une prcision fixe de du nombre d'or. Le programme indique en outre le rang du dernier terme de la suite correspondant la valeur approche calcule. Exemple : On entre au clavier un nombre rel ci-dessous 0.00001, pour la prcision choisie (ici 5 chiffres aprs la virgule), puis le programme calcule et affiche le Nombre d'or (les caractres gras reprsentent ce qui est crit par le programme, les italiques ce qui est entr au clavier) :
EXERCICES -
page
334
Objectif : On souhaite crire un programme Java afin de vrifier sur des exemples, la conjecture de GoldBach (1742), soit : "Tout nombre pair est dcomposable en la somme de deux nombres premiers".
Implantation en Java :
EXERCICES -
page
335
Objectif : On souhaite crire une application de manipulation interne des bits d'une variable entire non signe sur 8 bits.
Implantation en Java
La conception de ces mthodes ne dpendant pas du nombre de bits de la mmoire oprer on choisira le type int comme base pour une mmoire. Ces mthodes sont classiquement des outils de manipulation de l'information au niveau du bit. Lors des jeux de tests pour des raisons de simplicit de lecture il est conseill de ne rentrer que des valeurs entires portant sur 8 bits.
EXERCICES -
page
336
EXERCICES -
page
337
EXERCICES -
page
338
BitCHG(n,3) =1 BitCHG(n,2) =1101 p = 1, q = 13, r = 1, t = 13 n=-2^31 : n=10000000000000000000000000000000 p=4 n=-2^31+1 : n=10000000000000000000000000000001 p = 12 n=3 : n=11 ROR(n,1) = -2147483647= 10000000000000000000000000000001 ROR(n,2) = -1073741824= 11000000000000000000000000000000 ROR(n,3) = 1610612736= 1100000000000000000000000000000
EXERCICES -
page
339
EXERCICES -
page
340
La fonction Pos recherche une sous-chane, Substr, l'intrieur d'une chane. Substr et S sont des expressions de type chane. Pos recherche Substr l'intrieur de S et renvoie une valeur entire correspondant l'indice du premier caractre de Substr l'intrieur de S. Pos fait la distinction majuscules/minuscules. Si Substr est introuvable, Pos renvoie zro.
La classe principale contenant la mthode main et utilisant les mthodes de la classe string :
EXERCICES -
page
341
La classe principale contenant la mthode main et utilisant les mthodes de la classe string :
EXERCICES -
page
342
Travail effectuer : Ecrire les mthode compresser et Inverser , il est demand d'crire une premire version de la mthode Inverser. La premire version de la mthode Inverser construira une chane locale la mthode caractre par caractre avec une boucle for un seul indice.
EXERCICES -
page
343
La mthode compresser limine les caractres non recevables comme : blanc, virgule, point et apostrophe de la String s passe en paramtre. Remarquons que l'instruction strLoc +=s.charAt(i) permet de concatner les caractres recevables de la chane locale strLoc, par balayage de la String s depuis le caractre de rang 0 jusqu'au caractre de rang s.length()-1. La rfrence de String strLoc pointe chaque tour de la boucle for vers un nouvel objet cr par l'oprateur de concatnation + La premire version de la mthode Inverser :
EXERCICES -
page
344
Travail effectuer : Ecrire les mthode compresser et Inverser , il est demand d'crier une deuxime version de la mthode Inverser. La deuxime version de la mthode Inverser modifiera les positions des caractres ayant des positions symtriques dans la chane avec une boucle for deux indices et en utilisant un tableau de char.
EXERCICES -
page
345
EXERCICES -
page
346
Algorithme
Tri bulles sur un tableau d'entiers
Objectif : Ecrire un programme Java implmentant l'algorithme du tri bulles. Proposition de squelette de classe Java implanter :
Spcifications de lalgorithme :
Algorithme Tri_a_Bulles local: i , j , n, temp Entiers naturels Entre - Sortie : Tab Tableau d'Entiers naturels de 1 n lments dbut pour i de n jusqu 1 faire // recommence une sous-suite (a1, a2, ... , ai) pour j de 2 jusqu i faire // change des couples non classs de la sous-suite si Tab[ j-1 ] > Tab[ j ] alors // aj-1et aj non ordonns temp Tab[ j-1 ] ; Tab[ j-1 ] Tab[ j ] ; Tab[ j ] temp //on change les positions de aj-1et aj Fsi fpour fpour Fin Tri_a_Bulles
EXERCICES -
page
347
Solution en Java
Tri bulles sur un tableau d'entiers
EXERCICES -
page
348
Algorithme
Tri par insertion sur un tableau d'entiers
Objectif : Ecrire un programme Java implmentant l'algorithme du tri par insertion. Proposition de squelette de classe Java implanter :
Spcifications de lalgorithme :
Algorithme Tri_Insertion local: i , j , n, v Entiers naturels Entre : Tab Tableau d'Entiers naturels de 0 n lments Sortie : Tab Tableau d'Entiers naturels de 0 n lments (le mme tableau) { dans la cellule de rang 0 se trouve une sentinelle charge d'viter de tester dans la boucle tantque .. faire si l'indice j n'est pas infrieur 1, elle aura une valeur infrieure toute valeur possible de la liste }
EXERCICES -
page
349
dbut pour i de2 jusqu n faire// la partie non encore trie (ai, ai+1, ... , an) v Tab[ i ] ; // l'lment frontire : ai ji; // le rang de l'lment frontire Tantque Tab[ j-1 ]> v faire//on travaille sur la partie dj trie (a1, a2, ... , ai) Tab[ j ] Tab[ j-1 ]; // on dcale l'lment j j-1; // on passe au rang prcdent FinTant ; Tab[ j ] v //on recopie ai dans la place libre fpour Fin Tri_Insertion
On utilise une sentinelle place dans la cellule de rang 0 du tableau, comme le type d'lment du tableau est un int, nous prenons comme valeur de la sentinelle une valeur ngative trs grande par rapport aux valeurs des lments du tableau; par exemple le plus petit lment du type int, soit la valeur Integer.MIN_VALUE.
EXERCICES -
page
350
Solution en Java
Tri par insertion sur un tableau d'entiers
EXERCICES -
page
351
Algorithme
Recherche linaire dans une table non trie
Objectif : Ecrire un programme Java effectuant une recherche squentielle dans un tableau linaire (une dimension) non tri
Version Tantque avec "et alors" (oprateur et optimis) i 1; Tantque (i n) et alors (t[i] Elt) faire i i+1 finTant; si i n alors rang i sinon rang -1 Fsi
Version Tantque avec "et" (oprateur et non optimis) i 1; Tantque (i < n) et (t[i] Elt) faire i i+1 finTant; si t[i] = Elt alors rang i sinon rang -1 Fsi
EXERCICES -
page
352
Version Tantque avec sentinelle en fin de tableau (rajout d'une cellule) t[n+1] Elt ; // sentinelle rajoute i1; Tantque (i n) et alors (t[i] Elt) faire i i+1 finTant; si i n alors rang i sinon rang -1 Fsi
Version Pour avec instruction de sortie (Sortirsi) pour i 1 jusqu n faire Sortirsi t[i] = Elt fpour; si i n alors rang i sinon rang -1 Fsi
Traduire chacune des quatre versions sous forme d'une mthode Java. Proposition de squelette de classe Java implanter :
class ApplicationRechLin { static int max = 20; static int[ ] table = new int[max] ; //20 cellules examiner de 1 19 static int[ ] tableSent = new int[max+1] ; // le tableau examiner de 1 20 static void AfficherTable (int[ ] t ) { // Affichage du tableau int n = t.length-1; for ( int i = 1; i <= n; i++) System.out.print(t[i]+" , "); System.out.println(); }
static void InitTable ( ) { // remplissage alatoire du tableau int n = table.length-1; for ( int i = 1; i <= n; i++) {
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
353
table[i] = (int)(Math.random( )*100); tableSent[i] = table[i]; } } static int RechSeq1( int[ ] t, int Elt ) { } static int RechSeq2( int[ ] t, int Elt ) { } static int RechSeq3( int[ ] t, int Elt ) { } static int RechSeq4( int[ ] t, int Elt ) { } public static void main(String[ ] args) { InitTable ( ); System.out.println("Tableau initial :"); AfficherTable (table ); int x = Readln.unint(), rang; //appeler ici les mthodes de recherche if (rang > 0) System.out.println("Elment "+x+" trouv en : "+rang); else System.out.println("Elment "+x+" non trouv !"); } }
EXERCICES -
page
354
Solution en Java
Recherche linaire dans une table non trie
Les diffrentes mthodes Java implantant les 4 versions d'algorithme de recherche linaire (table non trie) : Version Tantque avec "et alors" (optimis) Version Tantque avec "et" (non optimis)
class ApplicationRechLin { static int max = 20; static int[ ] table = new int[max] ; //20 cellules examiner de 1 19 static int[ ] tableSent = new int[max+1] ; // le tableau examiner de 1 20 static void AfficherTable (int[ ] t ) { // Affichage du tableau int n = t.length-1; for ( int i = 1; i <= n; i++) System.out.print(t[i]+" , "); System.out.println(); }
EXERCICES -
page
355
static void InitTable ( ) { // remplissage alatoire du tableau int n = table.length-1; for ( int i = 1; i <= n; i++) { table[i] = (int)(Math.random( )*100); tableSent[i] = table[i]; } } static int RechSeq1( int[ ] t, int Elt ) { } static int RechSeq2( int[ ] t, int Elt ) { } static int RechSeq3( int[ ] t, int Elt ) { } static int RechSeq4( int[ ] t, int Elt ) { } public static void main(String[ ] args) { InitTable ( ); System.out.println("Tableau initial :"); AfficherTable (table ); int x = Readln.unint(), rang; //rang = RechSeq1( table, x ); //rang = RechSeq2( table, x ); //rang = RechSeq3( tableSent, x ); rang = RechSeq4( table, x ); if (rang > 0) System.out.println("Elment "+x+" trouv en : "+rang); else System.out.println("Elment "+x+" non trouv !"); } }
EXERCICES -
page
356
Algorithme
Recherche linaire dans une table dj trie
Objectif : Ecrire un programme Java effectuant une recherche squentielle dans un tableau linaire (une dimension) dj tri.
On peut reprendre sans changement les algorithmes prcdents travaillant sur un tableau non tri.
On peut aussi utiliser le fait que le dernier lment du tableau est le plus grand lment et s'en servir comme une sorte de sentinelle. Ci-dessous deux versions utilisant cette dernire remarque.
Version Tantque : si t[n] < Elt alors rang -1 sinon i 1; Tantque t[i] < Elt faire i i+1; finTant; si t[i] Elt alors rang i sinon rang -1 Fsi Fsi
EXERCICES -
page
357
Version pour : si t[n] < Elt alors rang -1 sinon pour i 1 jusqu n-1 faire Sortirsi t[i] Elt // sortie de la boucle fpour; si t[i] Elt alors rang i sinon rang -1 Fsi Fsi
Ecrire chacune des mthodes associes ces algorithmes (prendre soin d'avoir tri le tableau auparavant par exemple par une mthode de tri), squelette de classe propos : class ApplicationRechLinTrie { static int[ ] table = new int[20] ; //20 cellules examiner de 1 19 static void AfficherTable (int[ ] t ) { // Affichage du tableau int n = t.length-1; for ( int i = 1; i<=n; i++) System.out.print(t[i]+" , "); System.out.println( ); } static void InitTable ( ) { // remplissage alatoire du tableau int n = table.length-1; for ( int i = 1; i<=n; i++) { table[i] = (int)(Math.random( )*100); } } static void TriInsert ( ) { // sous-programme de Tri par insertion } static int RechSeqTri1( int[] t, int Elt ) {} static int RechSeqTri2( int[] t, int Elt ) {} public static void main(String[ ] args) {} }
EXERCICES -
page
358
Solution en Java
Recherche linaire dans une table dj trie
Les deux mthodes Java implantant les 2 versions d'algorithme de recherche linaire (table dj trie) :
La mthode main de la classe ApplicationRechLinTrie : public static void main(String[ ] args) { InitTable ( ); System.out.println("Tableau initial :"); AfficherTable (table ); TriInsert ( ); System.out.println("Tableau tri :"); AfficherTable (table ); int x = Readln.unint( ), rang; //rang = RechSeqTri1( table, x ); rang = RechSeqTri2( table, x ); if (rang > 0) System.out.println("Elment "+x+" trouv en : "+rang); else System.out.println("Elment "+x+" non trouv !"); }
EXERCICES -
page
359
Algorithme
Liste trie de noms en Java
Objectif : Effectuer un travail de familiarisation avec la structure de liste dynamique adressable trie correspondant la notion de tableau dynamique tri. Ce genre de structure cumule les avantages d'une structure de liste linaire (insertion, ajout,...) et d'un tableau autorisant les accs direct par un index. La classe concerne se dnomme Vector, elle hrite de la classe abstraite AbstractList et implmente l'interface List ( public class Vector extends AbstractList implements List )
Nous allons utiliser un Vector pour implanter une liste trie de noms, les lments contenus dans la liste sont des chanes de caractres (des noms).. Question n1: Codez la mthode "initialiser" qui permet de construire la liste suivante : Liste = ( voiture, terrien, eau, pied, traineau, avion, source, terre, xylophone, mer, train, marteau ). Codez la mthode "ecrire" qui permet d'afficher le contenu de la liste et qui produit l'affichage suivant : voiture, terrien, eau, pied, traineau, avion, source, terre, xylophone, mer, train, marteau, Taille de la liste chane = 12 squelette propos pour chaque mthode : static void initialiser ( Vector L ) {....} static void ecrire( Vector L ) {....} Remarque importante : Une entit de classe Vector est un objet. un paramtre Java de type objet est une rfrence, donc nous n'avons pas le problme du passage par valeur du contenu d'un objet. En pratique cela signifie que lorsque le paramtre est un objet, il est la fois en entre et en sortie. Ici le Vector L est modifi par toute action interne effectue sur lui dans les mthodes "initialiser" et "ecrire".
Question n 2:
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
360
Ecrire une mthode permettant de trier la liste des noms par odre alphabtique croissant en utilisant l'algorithme de tri par slection. On donne l'algorithme de tri par selection suivant : Algorithme Tri_Selection local: m, i , j , n, temp Entiers naturels Entre : Tab Tableau d'Entiers naturels de 1 n lments Sortie : Tab Tableau d'Entiers naturels de 1 n lments dbut pour i de 1 jusqu n-1 faire // recommence une sous-suite m i ; // i est l'indice de l'lment frontire ai = Tab[ i ] pour j de i+1 jusqu n faire // (ai+1, a2, ... , an) si Tab[ j ] < Tab[ m ] alors // aj est le nouveau minimum partiel m j ; // indice mmoris Fsi fpour; temp Tab[ m ] ; Tab[ m ] Tab[ i ] ; Tab[ i ] temp //on change les positions de ai et de aj fpour Fin Tri_Selection squelette propos pour la mthode : static void triSelect (Vector L ) {....}
Question n3: Ecrire une mthode permettant d'insrer un nouveau nom dans une liste dj trie, selon l'algorithme propos ci-dessous : L : Liste de noms dj trie, Elt : le nom insrer dans la liste L. taille(L) : le nombre d'lments de L dbut si (la liste L est vide) ousinon ( dernierElement de la liste L Elt ) alors ajouter Elt en fin de liste L sinon pour i 0 jusqu taille(L)-1 faire si Elt Element de rang i de L alors insrer Elt cette position ; sortir fsi fpour
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
361
fsi fin squelette propos pour la mthode : static void inserElem (Vector L, String Elt ) {....}
Voici ci-dessous les mthodes de la classe Vector, principalement utiles la manipulation d'une telle liste: Classe Vector : boolean add(Object elem) void add(int index, Objectelem) void clear( ) Object firstElement( ) Object get(int index) Ajoute l'lment "elem" la fin du Vector et augmente sa taille de un. Ajoute l'lment "elem" la position spcifie par index et augmente la taille du Vector de un. Efface tous les lments prsents dans le Vector et met sa taille zro. Renvoie le premier lment du Vector (l'lment de rang 0). Il faudra le transtyper selon le type d'lment du Vector. Renvoie l'lment de rang index du Vector. Il faudra le
EXERCICES -
page
362
transtyper selon le type d'lment du Vector. int indexOf(Object elem) void insertElementAt(Object elem, intindex) boolean isEmpty( ) Cherche le rang de la premire occurence de l'lment "elem" dans le Vector. Renvoie une valeur comprise entre 0 et size()-1 si "elem" est trouv, revoie -1 sinon. Insre l'lment "elem" la position spcifie par index et augmente la taille du Vector de un. Teste si le Vector n'a pas d'lments (renvoie true); renvoie false s'il contient au moins un lment. Renvoi le dernier lment du Vector (l'lment de rang size()-1). Il faudra le transtyper selon le type d'lment du Vector. Efface l'lment de rang index du Vector. La taille du Vector diminue de un. Efface la premire occurence de l'lment elem du Vector, la taille du Vector diminue alors de un et renvoie true. Si elem n'est pas trouv la mthode renvoie false et le Vector n'est pas touch. Renvoie la taille du Vector (le nombres d'lments contenus dans le Vector).
Object lastElement( )
int size( )
EXERCICES -
page
363
Solution en Java
Liste trie de noms en Java
Question n1: Le sous programme Java implantant la mthode "initialiser" construisant la liste :
Question n2: La mthode "triSelect" utilisant l'algorithme de tri par slection sur un tableau d'entiers :
Nous allons construire partir de ce modle la mthode static void triSelect (Vector L )
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
364
Remarques :
Nous devons ranger des noms par ordre alphabtique croissant et non des entiers, les noms sont des String, nous devons considrer le Vector comme un tableau de String pour pouvoir le trier. table[i] de l'algorithme (accs au ime lment) est implant en Vector par L.get(i). Comme la mthode "Object get(int index)" renvoie un Object nous transtypons L.get(i) en type String qui est un descendant d'Object, grce la mthode de classe valueOf de la classe String "static String valueOf(Object obj)", ce qui s'crit ici : String.valueOf(L.get(i)). Les oprateurs de comparaisons <, > etc ne prennent pas en charge le type String comme en Delphi, il est donc ncessaire de chercher dans la liste des mthodes de la classe String une mthode permettant de comparer lexicographiquement deux String. Pour comparer deux String ( s1 < s2 )on trouve la mthode compareTo de la classe String : String.valueOf(L.get(j)).compareTo(String.valueOf(L.get(m))) < 0. Implantera la comparaison : table[j] < table[m]
EXERCICES -
page
365
Question n3: La mthode "inserElem" utilisant l'algorithme d'insertion d'un lment dans une liste trie :
Explications :
Voici les traductions utilises pour implanter l'algorithme d'insertion : Algorithme la liste L est vide ousinon (ou optimis) dernierElement de la liste L dernierElement de la liste L Elt ajouter Elt en fin de liste L taille(L) Element de rang i de L Elt Element de rang i de L insrer Elt cette position sortir L.isEmpty( ) || L.lastElement( ) . Transtyp en String par : String.valueOf(L.lastElement( )) String.valueOf(L.lastElement( )).compareTo(Elt) <= 0 L.add(Elt) L.size( ) String.valueOf(L.get(i)) String.valueOf(L.get(i)).compareTo(Elt) >= 0 L.insertElementAt(Elt , i) break Java Vector et String
EXERCICES -
page
366
static void triSelect (Vector L ) { // sous-programme de Tri par slection de la liste int n = L.size()-1; for ( int i = 0; i <= n-1; i++) { // recommence une sous-suite int m = i; // i est l'indice de l'lment frontire ai = table[ i ] for ( int j = i+1; j <= n; j++) // (ai+1, a2, ... , an) if ( String.valueOf(L.get(j)).compareTo(String.valueOf(L.get(m))) < 0 ) m = j ; // indice mmoris String temp = String.valueOf(L.get(m)); // int temp = table[ m ]; L.set(m, L.get(i)); //table[ m ] = table[ i ]; L.set(i, temp); //table[ i ]= temp; } } static void inserElem (Vector L, String Elt ) { if((L.isEmpty()) || (String.valueOf(L.lastElement()).compareTo(Elt) <= 0)) L.add(Elt); else for(int i=0; i <= L.size()-1; i++){ if (String.valueOf(L.get(i)).compareTo(Elt) >= 0){ L.insertElementAt(Elt , i); break; } } } static void ecrire(Vector L) { for(int i=0; i<L.size(); i++) { System.out.print(L.get(i)+", "); } System.out.println("\nTaille de la liste chane = "+L.size()); } static void initialiser(Vector L) { L.add("voiture" ); L.add("terrien" ); L.add("eau" ); L.add("pied" ); L.add("traineau" ); L.add("avion" ); L.add("source" ); L.add("terre" ); L.add("xylophone" ); L.add("mer" ); L.add("train" ); L.add("marteau" ); }
Les fondements du langage Java - - (rv. 28.05.2005 )
EXERCICES -
page
367
public static void main(String[] Args) { Vector Liste = new Vector( ); //cration obligatoire d'un objet de classe Vector //---> contenu de la Liste - initialisation : initialiser(Liste); ecrire(Liste); //---> Tri de la liste : System.out.println("\nListe une fois trie : "); triSelect(Liste); ecrire(Liste); //---> Insrer un lment dans la liste trie : String StrInserer ="trainard"; System.out.println("\nInsertion dans la liste de : "+StrInserer); inserElem(Liste, StrInserer); ecrire(Liste); //---> Contenu de la Liste - boolean remove(Object x) : System.out.println("\nListe.remove('pied') : "); Liste.remove("pied"); ecrire(Liste); } }
Excution de cette classe : voiture, terrien, eau, pied, traineau, avion, source, terre, xylophone, mer, train, marteau, Taille de la liste chane = 12 Liste une fois trie : avion, eau, marteau, mer, pied, source, terre, terrien, train, traineau, voiture, xylophone, Taille de la liste chane = 12 Insertion dans la liste de : trainard avion, eau, marteau, mer, pied, source, terre, terrien, train, trainard, traineau, voiture, xylophone, Taille de la liste chane = 13 Liste.remove('pied') : avion, eau, marteau, mer, source, terre, terrien, train, trainard, traineau, voiture, xylophone, Taille de la liste chane = 12
EXERCICES -
page
368
Algorithme
Structure de donne de pile LIFO
Objectif : Nous implantons en Java une structure de pile LIFO (Last In First Out) fonde sur l'utilisation d'un objet de classse LinkedList. Nous construisons une pile LIFO de chanes de caractres. Rappel des spcifications d'une pile LIFO :
Oprateurs de base sur une pile LIFO : sommet pointe vers l'lment en haut de pile, fond sert de sentinelle la pile si ncessaire. Dpiler ( [X0, X1,..., Xn, Xn+1] ) --> Pile = [X0, X1,..., Xn ] , Xn+1 Empiler( [X0, X1,..., Xn ] , Xn+1 ) --> Pile = [X0, X1,..., Xn, Xn+1] Premier( [X0, X1,..., Xn ] ) = Xn EstVide( [X0, X1,..., Xn ] ) = false EstVide( [ ] ) = true (sommet = fond)
Notre pile LIFO doit contenir des noms (chanes de caractres donc utilisation des String). La classe LinkedList est une structure dynamique (non synchronize) qui ressemble la classe Vector, mais qui est bien adapte implanter les piles et les files car elle contient des rfrences de type Object et les String hritent des Object.
EXERCICES -
page
369
static void Empiler(LinkedList P, String x) static String Depiler(LinkedList P) static String Premier(LinkedList P) static void initialiserPile(LinkedList P) static void VoirLifo(LinkedList P)
Empiler dans la pile P le nom x. Dpiler la pile P. Renvoyer l'lment au sommet de la pile P. Remplir la pile P avec des noms. Afficher squentiellement le contenu de P.
Voici ci-dessous les mthodes principalement utiles la manipulation d'une telle liste: Classe LinkedList : boolean add(Object elem) void add(int index, Object elem) void clear( ) Ajoute l'lment "elem" la fin de la LinkedList et augmente sa taille de un. Ajoute l'lment "elem" la position spcifie par index et augmente la taille de la LinkedList de un. Efface tous les lments prsents dans la LinkedList et met sa taille zro.
EXERCICES -
page
370
Object getFirst()
Renvoie le premier lment de la LinkedList (l'lment en tte de liste, rang=0). Il faudra le transtyper selon le type d'lment de la LinkedList. Renvoie le dernier lment de la LinkedList (l'lment en fin de liste, rang=size()-1). Il faudra le transtyper selon le type d'lment de la LinkedList. Renvoie l'lment de rang index de la LinkedList. Il faudra le transtyper selon le type d'lment de la LinkedList. Cherche le rang de la premire occurence de l'lment "elem" dans le Vector. Renvoie une valeur comprise entre 0 et size()-1 si "elem" est trouv, revoie -1 sinon. Insre l'lment "elem" en tte de la LinkedList (rang=0). Ajoute l'lment "elem" la fin de la LinkedList et augmente sa taille de un. Teste si la LinkedList n'a pas d'lments (renvoie true); renvoie false si elle contient au moins un lment. Efface l'lment de rang index de la LinkedList. La taille de la LinkedList diminue de un. Efface la premire occurence de l'lment elem de la LinkedList, la taille de la LinkedList diminue alors de un et renvoie true. Si elem n'est pas trouv la mthode renvoie false et la LinkedList n'est pas touch. Efface et renvoie le premier lment (rang=0) de la LinkedList. Il faudra le transtyper selon le type d'lment de la LinkedList. Efface et renvoie le dernier (rang=size()-1) lment de la LinkedList. Il faudra le transtyper selon le type d'lment de la LinkedList. Renvoie la taille de la LinkedList (le nombres d'lments contenus dans la LinkedList).
Object getLast()
int indexOf(Object elem) void addFirst(Object elem) void addLast(Object elem) boolean isEmpty( ) Object remove(int index)
Object removeFirst()
Object removeLast()
int size( )
EXERCICES -
page
371
Solution en Java
Structure de donne de pile LIFO
Dpiler la pile P.
EXERCICES -
page
372
Une classe complte permettant l'excution des mthodes prcdentes : import java.util.LinkedList; class ApplicationLifo { static boolean EstVide (LinkedList P) { return P.size() == 0; } static void Empiler(LinkedList P, String x) { P.addFirst(x); } static String Depiler(LinkedList P) { return String.valueOf(P.removeFirst()); } static String Premier(LinkedList P) { return String.valueOf(P.getFirst()); } static void initialiserPile(LinkedList PileLifo){ Empiler(PileLifo,"voiture" ); Empiler(PileLifo,"terrien" ); Empiler(PileLifo,"eau" ); Empiler(PileLifo,"pied" ); Empiler(PileLifo,"traineau" ); Empiler(PileLifo,"avion" ); Empiler(PileLifo,"source" ); Empiler(PileLifo,"terre" ); Empiler(PileLifo,"xylophone" ); Empiler(PileLifo,"mer" ); Empiler(PileLifo,"train" ); Empiler(PileLifo,"marteau" ); } static void VoirLifo(LinkedList PileLifo) { LinkedList PileLoc = (LinkedList)(PileLifo.clone()); while (! EstVide(PileLoc)) { System.out.println(Depiler(PileLoc)); } }
EXERCICES -
page
373
public static void main(String[ ] Args) { LinkedList Lifo = new LinkedList( ); initialiserPile(Lifo); VoirLifo(Lifo); } }
EXERCICES -
page
374
Exercice
lire et crire un enregistrement dans un fichier texte
Objectif : Nous implantons en Java une classe d'criture dans un fichier texte d'informations sur un client et de lecture du fichier pour rtablir les informations initiales.
Chaque client est identifi l'aide de quatre informations : Numro de client Nom du client Prnom du client Adresse du client Nous rangeons ces quatre informations dans le mme enregistrement-client. L'enregistrement est implant sous forme d'une ligne de texte contenant les informations relatives un client, chaque information est spare de la suivante par le caractre de sparation # . Par exemple, les informations client suivantes : Numro de client = 12598 Nom du client = Dupont Prnom du client = Pierre Adresse du client = 2, rue des moulins 37897 Thiers se touvent ranges dans un enregistrement constitu de quatre zones, sous la forme de la ligne de texte suivante : 12598#Dupont#Pierre#2, rue des moulins 37897 Thiers
Le fichier client se nommera "ficheclient.txt", vous crirez les mthodes suivantes : Signature de la mthode public static void ecrireEnreg (String nomFichier) Fonctionnement de la mthode Ecrit dans le fichier client dont le nom est pass en paramtre, les informations d'un seul client sous forme d'un enregistrement (cf.ci-haut).
public static void lireEnreg (String nomFichier) Lit dans le fichier client client dont le nom est pass en paramtre, un enregistrement et affiche sur la console les informations du client. public static String[] extraitIdentite (String Renvoie dans un tableau de String les 4 informations (n, nom, prnom, adresse)
EXERCICES -
page
375
contenues dans l'enregistrement pass en paramtre. Appele par la mthode lireEnreg. Affiche sur la console les informations du client contenues dans le tableau de String pass en paramtre. Appele par la mthode lireEnreg.
EXERCICES -
page
376
Exercice
Copier un fichier texte dans un autre fichier texte
Objectif : Nous implantons en Java une classe de recopie de tout le contenu d'un fichier texte dans un nouveau fichier texte clone du premier.
Le fichier source se nommera "fiche.txt", le fichier de destination clone se dnommera "copyfiche.txt", vous crirez les 2 mthodes suivantes : Signature de la mthode public static void copyFichier (String FichierSource, String FichierDest) public static void lireFichier (String nomFichier) Squelette java propos pour la classe : Fonctionnement de la mthode Copie le contenu du FichierSource dans le FichierDest. Lit tout le contenu d'un fichier client dont le nom est pass en paramtre, et affiche sur la console les informations de tout le fichier.
EXERCICES -
page
377
solution Java
lire et crire un enregistrement dans un fichier texte
EXERCICES -
page
378
solution Java
Copier un fichier texte dans un autre fichier texte
EXERCICES -
page
379
Une classe Eau qui contient un champ static indiquant le volume d'eau actuel de l'objet auquel il appartient. Une classe Baignoire possdant un contenu (en litres d'eau) et une fuite qui diminue le volume d'eau du contenu de la baignoire. Une classe Robinet qui dbite (augmente) le volume d'eau du contenu de la baignoire d'une quantit fixe.
EXERCICES -
page
380
Une classe Remplir qui permet le dmarrage des actions : mise en place de la baignoire, du robinet, ouverture du robinet et fuite de la baignoire :
Nous programmons les mthodes debite( int quantite) et fuite( int quantite) de telle sorte qu'elles afichent chacune l'tat du contenu de la baignoire aprs que l'apport ou la diminution d'eau a eu lieu. Nous simulerons et afficherons pour chacune des deux mthodes 100 actions de base (100 diminutions pour la mthode fuite et 100 augmentations pour la mthode debite).
EXERCICES -
page
381
Rsultats d'excution :
Contenu de la baignoire = 50 Contenu de la baignoire = 100 Contenu de la baignoire = 150 Contenu de la baignoire = 200 Contenu de la baignoire = 250 Contenu de la baignoire = 300 Contenu de la baignoire = 350 Contenu de la baignoire = 400 Contenu de la baignoire = 450 Contenu de la baignoire = 500 Contenu de la baignoire = 550 Contenu de la baignoire = 600 Contenu de la baignoire = 650 Contenu de la baignoire = 700 Contenu de la baignoire = 750 Contenu de la baignoire = 800 Contenu de la baignoire = 850 Contenu de la baignoire = 900 Contenu de la baignoire = 950 Contenu de la baignoire = 1000 Baignoire enfin pleine !
---- operation complete. Que s'est-il pass ? La programmation squentielle du problme n'a pas permis d'excuter l'action de fuite de la baignoire puisque nous avons arrt le processus ds que la baignoire tait pleine. En outre nous n'avons pas pu simuler le remplissage et le vidage "simultans" de la baignoire.
EXERCICES -
page
382
Nous allons utiliser deux threads (secondaires) pour rendre la simulation plus raliste, en essayant de faire les actions de dbit-augmentation et fuite-diminution en parallle.
De mme en drivant la classe Baignoire de la classe Thread, et en redfinissant la mthode run( ) avec le code de fuite excuter en "parallle" (le corps de la mthode fuite n'a pas chang) :
Enfin la classe RemplirThread qui permet le dmarrage des actions : mise en place de la baignoire, du robinet, puis lancement en parallle de l'ouverture du robinet et de la fuite de la baignoire :
EXERCICES -
page
383
Remplissage, contenu de la baignoire = 300 Remplissage, contenu de la baignoire = 350 Remplissage, contenu de la baignoire = 400 Remplissage, contenu de la baignoire = 450 Remplissage, contenu de la baignoire = 500 Remplissage, contenu de la baignoire = 550 Remplissage, contenu de la baignoire = 600 Fuite, contenu de la baignoire = 580 Remplissage, contenu de la baignoire = 630 Fuite, contenu de la baignoire = 610 Remplissage, contenu de la baignoire = 660 Fuite, contenu de la baignoire = 640 Remplissage, contenu de la baignoire = 690 Fuite, contenu de la baignoire = 670 Remplissage, contenu de la baignoire = 720 Remplissage, contenu de la baignoire = 770 Remplissage, contenu de la baignoire = 820 Remplissage, contenu de la baignoire = 870 Fuite, contenu de la baignoire = 850
Fuite, contenu de la baignoire = 870 Fuite, contenu de la baignoire = 850 Fuite, contenu de la baignoire = 830 Fuite, contenu de la baignoire = 810 Fuite, contenu de la baignoire = 790 Fuite, contenu de la baignoire = 770 Fuite, contenu de la baignoire = 750 Fuite, contenu de la baignoire = 730 Fuite, contenu de la baignoire = 710 Fuite, contenu de la baignoire = 690 Remplissage, contenu de la baignoire = 740 Fuite, contenu de la baignoire = 720 Remplissage, contenu de la baignoire = 770 Remplissage, contenu de la baignoire = 820 Remplissage, contenu de la baignoire = 870 Remplissage, contenu de la baignoire = 920 Remplissage, contenu de la baignoire = 970 Remplissage, contenu de la baignoire = 1020 Baignoire enfin pleine !
---- operation complete. Nous voyons que les deux threads s'excutent cycliquement (mais pas d'une manire gale) selon un ordre non dterministe sur lequel nous n'avons pas de prise mais qui dpend de la java machine et du systme d'exploitation, ce qui donnera des rsultats diffrents chaque nouvelle excution. Le paragraphe suivant montre un exemple ou nous pouvons contraindre des threads de "dialoguer" pour laisser la place l'un l'autre
Privilgions le thread Robinet grce la mthode setPriority : La classe Thread possde 3 champs static permettant d'attribuer 3 valeurs de priorits diffrentes, de la plus haute la plus basse, un thread indpendamment de l'chelle relle du systme d'exploitation sur lequelle travaille la Java Machine :
static int static int static int MAX_PRIORITY MIN_PRIORITY NORM_PRIORITY La priorit maximum que peut avoir un thread. La priorit minimum que peut avoir un thread. La priorit par dfaut attribue un thread.
EXERCICES -
page
384
La mthode setPriority applique une instance de thread change sa priorit d'excution. Nous mettons l'instance UnRobinet la priorit maximum setPriority(Thread.MAX_PRIORITY) : Classe Robinet sans changement
EXERCICES -
page
385
---- operation complete. Nous remarquons bien que le thread de remplissage Robinet a t privilgi dans ses excutions, puisque dans l'excution prcdente le thread Baignoire-fuite n'a pu excuter qu'un seul tour de boucle.
Le corps de la mthode main de la classe principale lanant les actions de remplissage de la baignoire reste inchang :
EXERCICES -
page
386
Annexe
Vocabulaire pratique : interprtation et compilation en java
Rappelons qu'un ordinateur ne sait excuter que des programmes crits en instructions machines comprhensibles par son processeur central. Java comme pascal, C etc... fait partie de la famille des langages volus (ou langages de haut niveau) qui ne sont pas comprhensibles immdiatement par le processeur de l'ordinateur. Il est donc ncesaire d'effectuer une "traduction" d'un programme crit en langage volu afin que le processeur puisse l'excuter. Les deux voies utilises pour excuter un programme volu sont la compilation ou l'interprtation : Un compilateur du langage X pour un processeur P, est un logiciel qui traduit un programme source crit en X en un programme cible crit en instructions machines excutables par le processeur P.
Un interprteur du langage X pour le processeur P, est un logiciel qui ne produit pas de programme cible mais qui effectue lui-mme immdiatement les oprations spcifies par le programme source. Un compromis assurant la portabilit d'un langage : une pseudo-machine Lorsque le processeur P n'est pas une machine qui existe physiquement mais un logiciel simulant (ou interprtant) une machine on appelle cette machine pseudo-machine ou p-machine. Le programme source est alors traduit par le compilateur en instructions de la pseudo-machine et se dnomme pseudocode. La p-machine standard peut ainsi tre implante dans n'importe quel ordinateur physique travers un logiciel qui simule son comportement; un tel logiciel est appel interprteur de la p-machine.
La premire p-machine d'un langage volu a t construite pour le langage pascal assurant ainsi une large diffusion de ce langage et de sa version UCSD dans la mesure o le seul effort d'implmentation pour un ordinateur donn tait d'crire l'interprteur de p-machine pascal, le reste de l'environnement de dveloppement (diteurs, compilateurs,...) tant crit en pascal tait fourni et fonctionnait ds que la p-machine tait oprationnelle sur la plate-forme cible.
EXERCICES -
page
387
Donc dans le cas d'une p-machine le programme source est compil, mais le programme cible est excut par l'interprteur de la p-machine. Beaucoup de langages possdent pour une plate-forme fixe des interprteurs ou des compilateurs, moins possdent une p-machine, Java est l'un de ces langages. Nous dcrivons ci-dessous le mode opratoire en Java.
Programe source java : xxx.java (portable) Programe excutable sous windows : xxx.exe (non portable)
Bytecode La compilation en bytecode (ou pseudo-code ou p-code ou code intermdiaire) est semblable l'ide du p-code de N.Wirth pour obtenir un portage multi plate-formes du pascal. Le compilateur Javac traduit le programme source xxx.java en un code intermdiaire indpendant de toute machine physique et non excutable directement, le fichier obtenu se dnomme xxx.class. Seule une p-machine (dnomme machine virtuelle java) est capable d'excuter ce bytecode. Le bytecode est aussi dnomm instructions virtuelles java.
EXERCICES -
page
388
Figure : un programme source Exemple.java est traduit par le compilateur (dnomm Javac ) en un programme cible crit en bytecode nomm Exemple.class
Inutile d'acheter une machine virtuelle java, tous les navigateurs internet modernes (en tout cas Internet explorer et Netscape) intgrent dans leur environnement une machine virtuelle java qui est donc installe sur votre machine physique et adapte votre systme d'exploitation, ds que votre navigateur internet est oprationnel. Fonctionnement lmentaire de la machine virtuelle Java Une machine virtuelle Java contient 6 parties principales
o o
Un jeu d'instructions en pseudo-code Une pile d'excution LIFO utilise pour stocker les paramtres des mthodes et les rsultats des mthodes Une file FIFO d'oprandes pour stocker les paramtres et les rsultats des instructions du p-code (calculs)
EXERCICES -
page
389
o o
Un segment de mmoire dans lequel s'effectue l'allocation et la dsallocation d'objets Une zone de stockage des mthodes contenant le p-code de chaque mthode et son environnement (tables des symboles,...) Un ensemble de registres (comme dans un processeur physique) servant mmoriser les diffrents tats de la machine et les informations utiles l'excution de l'instruction prsente dans le registre instruction bytecode en cours.
Comme toute machine la machine virtuelle Java est fonde sur l'architecture de Von Neumann et elle excute les instructions squentiellement un une. Figure : un synoptique de la machine virtuelle Java
vars : pointe dans la pile vers la premire variable locale de la mthode en cours d'excution. pc :compteur ordinal indiquant l'adresse de l'instruction de p-code en cours d'excution. optop : sommet de pile des oprandes. frame : pointe sur le code et l'environnement de la mthode qui en cours d'excution.
o o o
JIT , Hotspot
L'interprtation et l'excution du bytecode ligne par ligne peut sembler prendre beaucoup de temps et faire paratre le langage Java comme "plus lent" par rapport d'autres langages. Aussi dans un but d'optimisation de la vitesse d'excution, des techniques palliatives sont employes dans les version rcentes des machines virtuelles Java : la technique Just-in-time et la technique Hotspot sont les principales amliorations en terme de vitesse d'excution.
EXERCICES -
page
390
JIT (Just-in-time) est une technique de traduction dynamique durant l'interprtation que Sun utilise sous le vocable de compilation en temps rel. Il s'agit de rajouter la machine virtuelle Java un compilateur optimiseur qui recompile localement le bytecode lors de son chargement et ensuite la machine virtuelle Java n'a plus qu' faire excuter des instructions machines de base. Cette technologie est disponible en interne sur les navigateurs de dernire gnration.
On peut mentalement considrer qu'avec cette technique vous obtenez un programme java cible compil en deux passages :
o o
le premier passage est d l'utilisation du compilateur Javac produisant du bytecode, le second passage tant le compilateur JIT lui-mme qui optimise et traduit localement le bytecode en instructions du processeur de la plate-forme.
EXERCICES -
page
391
Bibliographie
Livres papier vendus par diteur
EXERCICES -
page
392