Pile et Interfaces
Vous devez implémenter un type (classe) MaPile capable de
stocker des objets hétérogènes possédant tous une propriété commune.
Une pile est une structure de données dans laquelle on peut
réaliser deux opérations de base empiler et dépiler:
- Empiler: consiste à ajouter une information au sommet de la pile
- Dépiler: est l'opération inverse qui consiste à retirer du sommet
de la pile l'information qui s'y trouve
Il existe déjà un tel type en Java, mais nous vous demandons de ne
pas l'utiliser, mais au contraire de programmer le votre à l'aide d'un
tableau.
Si vous avez du mal à concevoir ce qu'est une pile, transposez à
l'anologie suivante: une pile d'assiettes. Pour prendre une assiette
au milieu de la pile, il vous faut au préalable ôter du sommet de la
pile les assiettes qui la précèdent.
Mise en garde
Ce sujet ne nécessite l'écriture que de très peu de code. Il requiert
en revanche une compréhension du mécanisme des interfaces et une
compréhension des classes. Après tout, c'est le but des exercices de
vous faire comprendre les choses !
Vous êtes nombreux à me poser des questions dont la réponse est
souvent dans l'énoncé. J'ai passé plusieurs heures à l'écrire, prenez
le temps nécessaire pour le lire. Si des questions subsistent (je fais
toujours des erreurs et la matière n'est pas complétement évidente à
assimiler), envoyez les à dift1010, plutôt qu'à moi; les avantages sont:
- vous avez une chance d'avoir une réponse plus rapidement (nous sommes
plusieurs à lire les messages dift1010),
- vous avez une chance d'avoir une réponse de mes démonstrateurs
qui sera plus claire que la mienne,
- vous me donnez une chance de gagner du temps :-)
On vous demande de remettre plusieurs modules java, aussi, si vous
ne respectez pas les conventions de nommage imposées dans le texte,
nous ne corrigerons pas votre travail.
Description des méthodes à coder
Votre classe MaPile doit offrir à son utilisateur
l'interface (on parle ici des methodes public) suivante:
- Un (ou plusieurs) constructeur(s) dont le but est de préparer le
tableau qui vous servira à coder les opérations demandées. L'un de ces
constructeurs devrait offrir à l'utilisateur la possibilité de
spécifier la taille maximale de la pile (voir l'exemple)
bool empile(SeResumeAUnDouble ref) qui permet
d'empiler des références à des objets dont la classe implémente
l'interface SeResumeAUnDouble (voir plus bas). Cette
méthode doit retourner true si l'empilement est possible
(suffisamment de place dans la pile), et false sinon
(auquel cas, un message peut être donné à l'utilisateur pour
l'avertir que la pile est pleine).
SeResumeAUnDouble depile() qui dépile l'élément au
sommet de la pile. La référence de cet objet est retournée par cette
méthode. Dans le cas où la pile est vide, cette méthode se contente
d'afficher le message:
"PILE VIDE"
int size() qui retourne le nombre d'éléments disposés dans la pile.
int capacity() qui retourne la taille maximale de la pile.
- Une méthode
toString qui affiche le contenu de la
pile (voir exemple). Vous devez pour cela appeler la méthode
toString de chaque objet disposé dans la pile et
concaténer le résultat dans une chaîne que votre méthode doit
retourner.
void tri() qui permet de trier la pile en
ordre croissant (du plus petit vers le plus grand). Coder la méthode
de votre choix (nous avons vu trois méthodes de tri en cours). Pour
effectuer votre tri, un appel (polymorphique) à
convertToDouble sera nécessaire pour comparer les deux
valeurs décimales résultantes (voir plus bas pour les informations sur
l'interface SeResumeAUnDouble)
Détails de codage
Vous devez coder votre pile à l'aide d'un tableau:
SeResumeAUnDouble [] pile; . Il vous faut également un
pointeur identifiant le sommet de pile (en pratique un indice sur le
prochain élément de la pile, qui augmente de 1 à chaque ajout, et
diminue de 1 à chaque dépilement)
À propos de l'interface SeResumeAUnDouble
Cette interface ne fait pas partie de Java. En voici le code: SeResumeAUnDouble.java.
Contraintes sur votre programme
Votre programme doit fonctionner avec le programme de test suivant: TestDemo8.java qui n'est pas à
remettre. Ceci vous impose des contraintes:
- habituelles liées au nomage des méthodes et à leur type de retour attendu,
- de conception, lié au fait que les objets gérés par la pile ont la propriété spécifiée par l'interface.
En pratique, cela signifie que vous devez écrire/adapter le code de
chaque type utilisé dans cet exemple de manière à ce qu'ils
implémentent l'interface SeResumeAUnDouble . Les types
suivants sont demandés (vous devez remettre tous ces types):
- MyInteger: un type qui abrite juste un
int , le code
vous est donné, vous pouvez cependant le modifier si vous le voulez.
- MyLong: un type qui abrite juste un
long
- MyFloat: un type qui abrite juste un
float
- MyDouble: un type qui abrite juste un
float
- Rational: la classe vue en cours dont une version est disponible ici: Rational.java
Voici la trace d'execution du programme TestDemo8.java qui vous aidera à comprendre les
points délicats. Comme d'habitude, ce serait une mauvaise idée de
modifier ce code, à d'autres fins que de tester vos modules.
Astuce
Vous n'êtes pas obligé de compiler chaque fichier séparemment. Pour
compiler tous les projets en une seule instruction, vous pouvez par
exemple taper:
javac MyInteger.java MyLong.java MyFloat.java MyDouble.java Rational.java MaPile.java TestDemo8.java
Vous devriez apprécier grandement emacs dans cet exercice, car il vous
permet de passer facilement d'un fichier à l'autre.
Pour remettre votre programme
remise ift1010 demo08 MaPile.java MyInteger.java MyLong.java MyFloat.java MyDouble.java Rational.java
On ne vous demande donc pas de remettre TestDemo8.java .
Prenez note que chaque exercice noté est à remettre individuellement.
|