IFT1010 Programmation I

Département d'informatique et de
recherche opérationnelle

Hiver 2002


Accueil

Professeurs et
Démonstrateurs

Horaires et locaux

Notes de cours

Démonstrations
et devoirs

Examens

Liens utiles

Au sujet du
livre de cours

Consultez vos notes

Foire aux questions
(FAQ)

Démonstration 8: Classes, tableaux et interfaces


Pratique | Exercice Noté

Travail pratique (pas noté)

Recherche dichotomique polymorphique

suivez le lien...

Exercice noté (1 point)

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.



Dernière mise à jour : Mon Mar 18 19:05:38 EST 2002
dift1010@iro.umontreal.ca