Vous êtes sur la page 1sur 6

Travaux dirigs Java, sance n 2

Programmation par les Objets en Java


Travaux Dirigs 2
Najib Tounsi
(Lien permanent:

http://www.emi.ac.ma/ntounsi/COURS/Java/TD/tdJava2.html

( .pdf ))

Programmation par abstraction


Classe Pile simple.
Documentation de la classe Pile.
Ajout des cas d'exception.
Programme d'analyse d'une expression arithmtique.

1) Classe Pile simple


On va programmer la classe Pile de caractres, reprsente par un tableau et un indice de
sommet de pile.
Complter la classe suivante ( crer dans un fichier Pile.java):
public class Pile {
//
// Dclarations des attributs de la pile
//
static final int MAX = 8;
char t[];
int top;
//
//
//

Programmation des oprations (mthodes) de la pile


public Pile() {
// Initialise une pile vide
t = new char[MAX];
top = -1;
}
public void empiler(char c) {
// Empile le caractre donn en paramtre
if (!estPleine())
t[++top] = c;
else
System.out.println("Pile pleine");
}
public char sommet() {
// Retourne le caractre au sommet de la pile, sinon '\0'
//
... a complter ...
}
public void depiler() {
//
dcapite la pile (retire le sommet )

1 of 6

Travaux dirigs Java, sance n 2

//

... a complter ...

}
public boolean estVide() {
//
Teste si la pile est vide
return (top < 0);
}
public boolean estPleine() {
// teste si la pile est pleine
// ...
completer ...
}
}; // class Pile

Exercice-1) Ecrire un programme qui lit une chane de caractre et l'imprime inverse.
Algorithme:
Pile p, char c;
lire (c);
Tant que (c != '#')
empiler c sur p;
lire (c)
ftq
Tantque (pile non vide)
c = sommet de p;
crire (c);
dpiler p;
ftq
Indications:
- Crer le programme dans un fichier

TestPile.java

- Utiliser la classe Support.class (cf. TD n1) pour la mthode


lit un caractre sur l'unit standard d'entre. usage:

public static char readChar()

qui

c = Support.readChar();

- La fin de la chane lire est marque par le caractre '#'.


Retrouver la solution ici (

http://www.emi.ac.ma/ntounsi/COURS/Java/TD/TestPile.java

).

Exercice-2) Ecrire un programme qui lit une un texte contenant une srie de parenthses et qui:
la rencontre du caractre '(' il l'empile sur une pile p
la rencontre du caractre ')' il dpile la pile p
ignore tout autre caractre.
s'arrte la lecture du caractre '#'.
A la fin du texte lu, si la pile est vide l'expression est bien parenthse. Sinon, il y a plus de
parenthses ouvrantes que de parenthses fermantes. Si la pile est vide prmaturment, lors d'un
dpilement, alors il y a plus de parenthses fermantes que de parenthses ouvrantes.

2) Documentation de la classe Pile


2 of 6

Travaux dirigs Java, sance n 2

On va crer une page Web de documentation de la classe Pile. Il doit y avoir


D'abord un texte sous forme de commentaire qui documente la classe en gnrale, par
exemple ce qu'est un objet Pile etc.
Ensuite, il doit y avoir un texte qui documente chaque mthode en indiquant ses
paramtres donnes, son rsultat ventuel et le traitement effectu.
Dans le fichier
commence par

contenant la classe Pile, ajouter en dbut de fichier un commentaire qui


C'est le commentaire gnrale de la classe. Exemple:

Pile.java
/** .

/**
Classe Java correspondant une pile
Un pile est un objet sur lequel on empile ...
etc...
*/

Ensuite, avant chaque dclaration de mthode, ajouter le commentaire qui documente la


mthode. Exemple:
/**
* Empile le caractre donn
*/
public void empiler(char c){...}

On peut alors crer les pages documentation de la classe Pile avec la commande

javadoc :

javadoc Pile.java

Un certain nombre de fichiers sont alors crs. L'un des fichiers est
Web principale.

index.html

qui est la page

On peut amliorer la documentation finale en rajoutant des lignes commentaires @param,


@return, @see, pour documenter les paramtres. Exemple: TBD ...

3) Gestion des exceptions en Java


Une exception est un cas particulier (ou erreur) qui se produit dans un programme. Par exemple
pile vide en cas de dpilement, rencontre d'un caractre nom numrique lors de la lecture d'un
nombre etc.
L'exemple simple suivant est une mthode qui calcule la factorielle d'un entier, et qui lve une
exception quand l'entier est ngatif.
static public int fact(int x) throws ExceptionFactNegatif {
if ( x < 0 ) throw new ExceptionFactNegatif();
else {
// calcul factorielle dans int f ...
return f;
}
}

On rajoute au profile de la mthode le mot cl


ExceptionFactNegatif . (voir plus bas).

throws

et le type d'objet lev, qui est ici le classe

L'utilisation de cette mthode doit s'attendre, grce une instruction try , une ventuelle leve
d'exception et la capter, grce une instruction catch , pour pouvoir la traiter.

3 of 6

Travaux dirigs Java, sance n 2

int n = ...
try {
int f = fact(n);
}
catch (ExceptionFactNegatif e) {
System.out.println("Valeur negative pour factorielle");
e.printStackTrace();
}
try indique un bloc d'instructions dans lequel une exception peut tre leve "une erreur peut se
produire".

Le bloc catch contient les instructions excuter dans le cas o un type d'exception s'est produit
dans le try correspondant. Ici, on imprime une message pour la circonstance. catch est
paramtr par l'exception capter. ici objet e de classe ExceptionFactNegatif .
On peut utiliser cet objet e justement, pour suivre la trace de l'exception produite, avec
e.printStackTrace() en plus du message imprimer.
Le rsultat de la squence de programme prcdente excute pour n = -1 est:
Valeur negative pour factorielle
ExceptionFactNegatif
at TestException.fact(TestException.java:17)
at TestException.main(TestException.java:5)

La classe correspondant l'exception souhaite,

ExceptionFactNegatif

ici est donne par:

class ExceptionFactNegatif extends Throwable {};

Classe qui ne contient rien. N'est elle pas une exception?


Le fait c'est qu'elle est sous classe de la classe prdfinie
pouvoir tre souleve comme exception.

Throwable .

Condition ncessaire pour

A un mme bloc try peuvent correspondre deux blocs catch . On peut ajouter l'exemple
ci-dessus le cas de factorielle qui dpasse la capacit d'un int . Factorielle 13 est dj 6 227 020
800.
On cre donc une deuxime exception,
class ExceptionFactSuperieur12 extends Throwable {};

et on crira:
try {
int f = fact(n);
}
catch (ExceptionFactNegatif e) {
System.out.println("Valeur negative pour factorielle");
e.printStackTrace();
}
catch (ExceptionFactSuperieur12 e) {
System.out.println("Valeur > 12 pour factorielle");
e.printStackTrace();
}

Exercice-3)
Suivant ce mme modle, reprendre la classe pile et traiter les cas "Pile vide" (dans dpiler et

4 of 6

Travaux dirigs Java, sance n 2

sommet) et "Pile pleine" (dans empiler).


Indication:
On dfinira deux classes ExceptionPileUnderflow et ExceptionPileOverflow correspondant
respectivement aux cas dbordement de pile par en bas, pile vide, ou dbordement par en haut,
pile pleine.
On reprogrammera les opration de la classe pile en consquence, par exemple:
public char sommet() throws ExceptionPileUnderflow {
// Retourne le caractre au sommet de la pile
if (!estVide())
return t[top];
else
throw new ExceptionPileUnderflow();
}

etc...
On reprendra ensuite le programme

TestPile.java

avec cette fois-ci des blocs

try / catch .

Exercice-4:
a) Rflchir un algorithme qui vrifie si une chane (ou expression) est bien parenthse: une
parenthse fermante est en correspondance avec une parenthse ouverte. "Parenthse" prendre
au sens large parmi les symboles: ( < [ { } ] > ) .
Exemple:
{[(a+51)-(c)]}
{(a+b)]

est correcte

est incorrecte, ainsi que

(a+b))

Indications:
- Le programme doit ignorer (ne pas traiter) les symboles autres que les "parenthses".
- Les tapes sont:

1. On commence par une pile vide (voir figur


2. On lit {, on l'empile
3. On lit [, on l'empile
4. On lit (, on l'empile

5 of 6

Travaux dirigs Java, sance n 2

5. On ignore a+51, on lit ), elle correspond au sommet de la pile (4), on dpile celle-ci
6. On ignore -, on lit (, on l'empile
7. On ignore c, on lit ), elle correspond au sommet de la pile (6), on dpile celle-ci
8. On lit ], il correspond au sommet de la pile (7), on dpile celle-ci
9. On lit }, elle correspond au sommet de la pile (8), on dpile celle-ci. On a fini la lecture. Si on
finit une pile vide, l'expression est correctement parenthse.
b) Utiliser la pile de l'exercice prcdent pour programmer cet algorithme.
That's all folks.

6 of 6

Vous aimerez peut-être aussi