• Aucun résultat trouvé

Recherche de motifs avec String

Dans le document Programmation Orientée Objet (Page 64-79)

64 CHAPITRE 10. ´ETUDE D ´ETAILL ´EE DE LA CLASSE STRING

String s1 = "toto";

String s2 = s1;

System.out.println(s1 == s2); // true

s1 += "!"; // s1 pointe sur une nouvelle cha^ıne "toto!"

System.out.println(s1 == s2); // false System.out.println(s1); // "toto!"

System.out.println(s2); // "toto"

String u1 = "toto";

String u2 = "toto";

System.out.println(u1 == u2); // true!!! la cha^ıne est d´etect´ee comme pr´esente et partag´ee

10.5 Recherche de motifs (pattern matching )

On a les m´ethodes suivantes :

Voici comment impl´ementer le c´el`ebre dˆıner des philosophes de Dijkstra en quelques lignes de Java. Il s’agit de faire manger cinq philosophes alternativement sachant que chacun d’eux a besoin de sa fourchette de gauche et de sa fourchette de droite et qu’il n’y a qu’une fouchette intercal´ee entre chaque philosophes sur la table ronde qui les accueille.

Chaque philosophe sera contrˆol´e par un moniteur, c’est-`a-dire un mini-gestionnaire de tˆaches de type Monitorque nous allons d´efinir. La forme d’un philosophe sera la suivante :

class Philosophe extends Thread{

private int i;

private Monitor M;

Philosophe(int i, Monitor M){this.i=i; this.M=M;}

public void run(){

try{

while(true){

M.set_affame(i);

System.out.println(Thread.currentThread().getName() + " mange");

System.out.println(M);

65

66 CHAPITRE 11. THREADSET INTERFACE RUNNABLE

Thread.sleep(600000*(long)Math.random());

M.set_repus(i);

System.out.println(Thread.currentThread().getName() + " pense");

System.out.println(M);

Thread.sleep(600000*(long)Math.random());

}

}catch(InterruptedException e){System.out.println(e + ": r´eveil pr´ematur´e");}

} }

o`u l’on a pr´ealablement d´efini le moniteur comme ´etant :

class Monitor{

private static final int libre = -1;

private int[] fourchette;

private boolean[] mange;

Monitor(){

fourchette = new int[5];

for(int i=0;i<5;i++){

fourchette[i] = libre;

}

mange = new boolean[5];

for(int i=0;i<5;i++){

mange[i] = false;

} }

public String toString(){

String s = "fourchettes = [";

for(int i=0;i<4;i++){

s += (fourchette[i] != libre)?("" + fourchette[i] + ", "):"*, ";

}

s += ((fourchette[4] != libre)?("" + fourchette[4]):"*") + "]";

s += ", convives = [";

for(int i=0;i<4;i++){

s += (mange[i])?("M, "):"P, ";

}

s += (mange[4])?("M]"):"P]";

return s;

}

// le moniteur rend le philosophe affam´e:

public synchronized void set_affame(int i) throws InterruptedException{

while(fourchette[i] != libre || fourchette[(i+1)%5] != libre){wait();}

System.out.println("Le philosophe " + i + " saisit les fourchettes "

+ i + " et " + ((i+1)%5));

mange[i] = true; fourchette[i] = fourchette[(i+1)%5] = i;

}

// le moniteur rend le philosophe repus:

public synchronized void set_repus(int i) throws InterruptedException{

mange[i] = false; fourchette[i] = fourchette[(i+1)%5] = libre;

System.out.println("Le philosophe " + i + " lib`ere les fourchettes "

+ i + " et " + ((i+1)%5));

notifyAll();

} }

On utilise ce qui pr´ec`ede ainsi :

class philosophes{

public static void main(String[] args){

11.2. EXEMPLE : LE DˆINER DES PHILOSOPHES 67

Monitor M = new Monitor();

Philosophe[] convives = new Philosophe[5];

for(int i=0;i<5;i++){

convives[i] = new Philosophe(i,M);

convives[i].setName("Le Philosophe " + i);

convives[i].start();

} } }

dont le r´esultat est :

$ javac philosophes.java; java philosophes Le philosophe 3 saisit les fourchettes 3 et 4 Le Philosophe 3 mange

fourchettes = [*, *, *, 3, 3], convives = [P, P, P, M, P]

Le philosophe 0 saisit les fourchettes 0 et 1 Le Philosophe 0 mange

fourchettes = [0, 0, *, 3, 3], convives = [M, P, P, M, P]

Le philosophe 3 lib`ere les fourchettes 3 et 4 Le Philosophe 3 pense

fourchettes = [0, 0, *, *, *], convives = [M, P, P, P, P]

Le philosophe 0 lib`ere les fourchettes 0 et 1 Le Philosophe 0 pense

fourchettes = [*, *, *, *, *], convives = [P, P, P, P, P]

Le philosophe 1 saisit les fourchettes 1 et 2 Le Philosophe 1 mange

fourchettes = [*, 1, 1, *, *], convives = [P, M, P, P, P]

68 CHAPITRE 11. THREADSET INTERFACE RUNNABLE

Chapitre 12

Application Programming Interface (API) Java

12.1 Introduction

L’API Java est gigantesque. Nous n’en verrons que quelques aspects ici.

70 CHAPITRE 12. APPLICATION PROGRAMMING INTERFACE (API) JAVA Tab. 12.1 – M´ethodes de la classeFile

m´ethode Java sp´ecification

boolean exists() truessi le fichier/r´epertoire existe

boolean canRead() truessi il est possible de lire dans le fichier boolean canWrite() truessi il est possible d’´ecrire dans le fichier void delete() efface le fichier

String getAbsolutePath() le chemin absolu du fichier/r´epertoire String getName() le chemin absolu du fichier/r´epertoire String getParent() le chemin absolu du r´epertoire parent boolean IsDirectory() truessi c’est un r´epertoire

boolean IsFile() truessi c’est un fichier long lastModified() date de derni`ere modification long length() taille

long list() liste des fichiers du r´epertoire

12.2.4 Ecriture dans un fichier texte´ L’´ecriture dans un fichier texte se fait facilement :

import java.io.*;

File f = new File("toto.txt");

PrintWriter out = new PrintWriter(new FileWriter(f));

try{

out.println("Coucou");

}

out.close();

}catch(IOException){} // Pas d’erreur en th´eorie...

12.2.5 Lecture/´ecriture dans un fichier `a acc`es al´eatoire

On peut ´egalement lire et/ou ´ecrire dans des fichiers `a acc`es al´eatoire avec : :

try{

RandomAccessFile fichier = new RandomAccessFile("foo.txt","rw");

fichier.writeUTF("Coucou!");

}catch(Exception e){

System.out.println(e);

}

12.3 Math´ ematiques java.math

Les m´ethodes math´ematiques de base sont d´efinies dans la classe Math et rappel´ees dans la Table 12.2.

12.4 Paquetages utilitaires java.util

12.4.1 Nombres al´eatoires java.util.Random On cr´ee un g´en´erateur pseudo-al´eatoire Ren ´ecrivant :

M´ethode java fonction math´ematique Math.abs(x) |x|

Math.sqrt(x) √ x Math.sin(x) sinx Math.cos(x) cosx Math.tan(x) tanx Math.asin(x) arcsinx Math.acos(x) arccosx Math.atan(x) arctanx Math.exp(x) expx

Math.log(x) logx en (n´eperien) Math.max(x,y) max(x, y)

Math.pow(x,y) xy = exp(ylogx)

Math.floor(x) ⌊x⌋= max{n :n∈N|n≤x} Math.ceil(x) ⌈x⌉= min{n :n∈N |n≥x}

Math.round(x) entier le plus proche avec round(0.5)= 1 Math.random() cf.nextDouble()Section 12.4.1, p. 70

Random R = new Random();

Il est initialis´e sur l’heure courante (mais on peut pr´eciser une valeur au constructeur pour servir de graine) et on dispose ensuite les variables al´eatoires suivantes : R.nextInt()etR.nextLong()qui suivent la loi uniforme sur les int et les long,R.nextFloat() etR.nextDouble()qui suivent la loi uniforme sur les floatet lesdoublerepr´esentant des r´eels de l’intervalle [0,1] etR.nextGaussian() qui suit la loi gaussienne d’esp´erance 0.0 et de variance 1.0 sur les double.

12.4.2 Analyse lexicale java.util.StringTokenizer

On peut tr`es facilement d´efinir un analyseur syntaxique avec StringTokenizer

String s = "Prospere, youpla boume!";

java.util.StringTokenizer st = new java.util.StringTokenizer(s);

while (st.hasMoreTokens()){System.out.println(st.nextToken());}

/* affiche:

Prospere, youpla boume!

*/

st = new java.until.StringTokenizer(s,","); // le s´eparateur est ","

/* affiche:

Prospere, youpla boume!

*/

12.5 Applets java.applets

Une applet est destin´ee `a ˆetre vue `a travers un navigateur web, suite `a une connexion r´eseau. Une applet a donc des restrictions en mati`ere de s´ecurit´e et ne peuvent pas :

1. acc´eder au syst`eme de fichier ;

72 CHAPITRE 12. APPLICATION PROGRAMMING INTERFACE (API) JAVA 2. communiquer avec un autre site Internet que celui sur lequel l’applet a ´et´e charg´e ;

3. ex´ecuter un autre programme que le sien ;

Il faut construire un fichier HTML qui appellera le code de l’applet, comme par exemple :

hello_world.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html"; charset="iso-8859-1">

<title>Hello World Applet</title>

</head>

<body>

<div style="text-align:center;">

<!-- HelloWorldApplet.class est situ´ee dans le r´epertoire mes_applets: -->

<applet code="HelloWorldApplet.class" codebase="mes_applets" width="600" height="400">

<!-- on peut passer une option au programme (souvent issue d’un formulaire): -->

<param name=taille_police value=40>

<!-- le message ci-dessous ne sera visible que si Java est inactif -->

Java est inactif: le programme ne peut ^etre ex´ecut´e.

</applet>

</div>

</body>

</html>

Simultan´ement, on ´ecrit le code du fichier HelloWorldApplet.java:

HelloWorldApplet.java import java.awt.Graphics;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Color;

import java.util.Random;

public class HelloWorldApplet extends java.applet.Applet{

final int x_max = 600, y_max = 400;

// Emplacement o`u l’on va ´ecrire depuis le coin en haut `a gauche:

int x=0,y=0;

Font f = null;

String le_texte="Hello World!";

Random r = new Random();

// On red´efinit la m´ethode init qui organise la cr´eation de l’applet:

public void init(){

setBackground(Color.white);

int taille = Integer.parseInt(getParameter("taille_police"));

if (taille <= 0){taille = 10;}

f = new Font("Courier",Font.BOLD,taille);

FontMetrics fm = getFontMetrics(f); // Informations sur la police x = (x_max - fm.stringWidth(le_texte))/2;

y = (y_max - fm.getHeight())/2;

} /*

// On pourrait aussi red´efinir:

public void start(){} // d´efinit le comportement `a chaque chargement de la page web public void stop(){} // d´efinit le comportement `a chaque d´epart de la page web

12.5. APPLETS JAVA.APPLETS 73

Fig. 12.1 – Visualisation du fichier hello_world.html appelant l’applet HelloWorldApplet.class dans le navigateur Mozilla. Le texte prend une couleur 32 bits al´eatoire toutes les 200 ms environ.

public void destroy(){} // organise la destruction de l’applet

*/

// La m´ethode suivante inclut le "main"

public void paint(Graphics screen){

screen.setFont(f);

while(true){

screen.setColor(new Color((int)(r.nextDouble()*255),(int)(r.nextDouble()*255), (int)(r.nextDouble()*255)));

screen.drawString(le_texte,x,y);

try{Thread.sleep(200);} // dort au moins 200ms entre chaque tour de boucle catch (InterruptedException e){System.out.println("R´eveil inattendu");}

} } }

Le r´esultat est visible dans la Fig. 12.1.

74 CHAPITRE 12. APPLICATION PROGRAMMING INTERFACE (API) JAVA

Chapitre 13

Conclusion et lectures sugg´ er´ ees

Le tr`es bon [1] constitue une introduction p´edagogique et approfondie au langage Java. Les manuels de r´ef´erence officiels de Sun sont [3] et [4]. Une r´ef´erence exhaustive se trouve dans [2].

75

Index

A

abs. . . 70

tan. . . 70

abstract. . . 37

AbstractMethodError. . . 44

abstraite, classe . . . voir classe acos. . . 70

add(). . . 59–61 addAll(). . . 59, 61 affectation . . . 21

Apple. . . 13

applet . . . 71

ArrayIndexOutOfBoundsException. . . 27, 45 ArrayList. . . 61

asin. . . 70

assert. . . 25

assertion . . . 25

AssertionError. . . 25, 44 atan. . . 70

attribut. . . .29

B BigDecimal. . . 22

BigInteger. . . 22

boolean. . . 21

boucles . . . 25

nomm´ees . . . 26

break. . . 24, 26 byte. . . 21

C C . . . 13

emphC++ . . . 13

case. . . voirswitch cast . . . 51

des tableaux . . . 54

ceil. . . 70

champ . . . 29

char. . . 21

class. . . 29

ClassCastException. . . 51

classe . . . 11, 29 abstraite . . . 37

enveloppante. . . 33

interne. . . 33

clear(). . . 59

clonage superficiel. . . .55

clone(). . . 36, 39, 55 Cloneable. . . 39, 55 CloneNotSupportedException. . . .36, 55 Collection. . . 59

collection . . . 59

Comparable. . . 55

comparable, instances . . . 55

Comparator. . . 55

compareTo(). . . 55

compilateur JIT . . . 15

compilation . . . 15

conditionnelles, instructions . . . 24

constructeur . . . 31

de copie . . . 31, 55 par d´efaut . . . 31

contains(). . . 59

containsAll(). . . 59

continue. . . 26

copie, constructeur . . . voir constructeur D d´efaut, constructeur . . . voir constructeur Delphi. . . 13

d´er´ef´erencement des attributs . . . 30

double. . . 21

downcast . . . 51

explicite des types non-primitifs . . . 53

explicite des types primitifs . . . 53

Dunant, Henry . . . 22

E ==. . . 54

´egalit´e . . . 54

Eiffel. . . 13

else. . . 24

else if. . . 24

emacs . . . voir GNU emacs encapsulation . . . 11, 12 enveloppante, classe . . . voir classe EOFException. . . 45

equals(). . . 36, 54, 59 erreurs. . . .44

Error. . . 44

Exception. . . 42

exception . . . 42

exp. . . 70

extends. . . 35

extensibilit´e . . . 11

F File. . . 69

76

INDEX 77

FileNotFoundException. . . 45

final. . . 30, 32 finalize(). . . 36

finalize. . . 32

float. . . 21

Float.NaN. . . 33

Float.POSITIVE_INFINITY. . . 33

floor. . . 70

fonctionnel, langage . . . voir langage fork(). . . 65

G getClass(). . . 36

getInterfaces(). . . 39

GNU emacs . . . 17

Gosling, James . . . 13

H hashCode(). . . 36, 59 HashMap. . . 62

HashSet. . . 60

hasNext(). . . 60

HelloWorld.java. . . 15

h´eritage . . . 11, 12, 35 multiple des interfaces . . . 38

simple des classes . . . 37

I IEEE754 . . . 21

if. . . 24

IllegalStateException. . . 60

immuable, objet . . . 55

imp´eratif, langage . . . voir langage indexOf(). . . 61

indicatrice, interface . . . voir interface instance . . . 11

instanceof. . . 39, 51 int. . . 21

interface . . . 38

indicatrice . . . 39

interface. . . 38

interpr´eteur. . . .77

. . . 14

interruption . . . 41

non-v´erifi´ee . . . 44

v´erifi´ee . . . 45

isEmpty(). . . 59

ISO-88-59-1. . . 21

it´erateur . . . 59

Iterator. . . 59

iterator(). . . 59

J java. . . 15

java virtual machine . . . voir JVM java-mode emacs. . . 17

javac. . . 15, 25 javadoc. . . 48

JIT, compilateur. . . voir compilateur JVM . . . 14

L langage fonctionnel. . . .11

imp´eratif . . . 11

objet . . . 11

lastIndexOf(). . . 61

Latin 1 . . . 21

LinkedList. . . 61

Lisp. . . 13

List. . . 59, 61 ListIterator. . . 61

listIterator(). . . 61

log. . . 70

long. . . 21

Long.MAX_VALUE. . . 33

M Macintosh. . . 13

Map. . . 59, 61 Math. . . 70

max. . . 70

m´ethode . . . 11, 29 N Naughton, Patrick . . . 13

new. . . 21

next(). . . 60

non-v´erifi´ee, interruption . . . voir interruption NoSuchElementException. . . 60

notify(). . . 65

notifyAll(). . . 65

null. . . 21, 27, 29 NullPointerException. . . 45

O Object. . . 36

objectifs (de la POO) . . . 11

Objective Caml. . . 13

objet . . . 11

langage . . . voir langage operateur . . . 22

op´erateurs . . . 23

OutOfMemoryError. . . 44

P package. . . 29, 47 paquetage . . . 47

Pascal. . . 13

polymorphisme . . . 11

d’h´eritage. . . 36

POO . . . voir langage orient´e objet pow. . . 70

pr´ecision arbitraire (calcul) . . . 22

private. . . 29

programmation orient´ee objet . . . voir POO Prolog. . . 13

protected. . . 30

public. . . 30

78 INDEX

Python. . . 13

R Random. . . 70

random. . . 70

remove(). . . 59, 60 removeAll(). . . 59

retainAll(). . . 59

round. . . 70

run(). . . 65

RuntimeException. . . 45

S s´emantique d’affectation . . . 21

d’´egalit´e des types primitifs . . . 21

Set. . . 59, 60 set(). . . 61

short. . . 21

Simula. . . 13

cos. . . 70

size(). . . 59

Smalltalk. . . 13

SortedMap. . . 59, 61 SortedSet. . . 59, 60 sqrt. . . 70

StackOverFlowError. . . 44

start(). . . 65

static. . . 30

strictfp. . . 21

StringTokenizer. . . 71

subList(). . . 61

Sun Microsystems. . . 13

super. . . 35

superficielle, copie . . . voir clonage surcharge . . . 22

uret´e . . . 11

switch. . . 24

synchronized. . . 65

System.gc(). . . 32

System.out.println(). . . 22, 33 T tableaux . . . 27

this(). . . 32

this. . . 29, 31 Thread. . . 65

thread. . . 65

Thread.sleep(). . . 65

throw. . . 41

Throwable. . . 41

toArray(). . . 59

toString(). . . 36

transtypage . . . 51

TreeMap. . . 62

TreeSet. . . 61

typage . . . 29

U Unicode . . . 21

upcast . . . 51

implicite des types non-primitifs . . . 53

implicite des types primitifs . . . 52

UTF-16 . . . 21

V v´erifi´ee, interruption . . . voir interruption W wait(). . . 65

while. . . 25

X Xerox. . . 13

Dans le document Programmation Orientée Objet (Page 64-79)

Documents relatifs