Listes de personnes et calculatrice polonaise inverse en Java



Documents pareils
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Chapitre 10. Les interfaces Comparable et Comparator 1

Premiers Pas en Programmation Objet : les Classes et les Objets

Java Licence Professionnelle CISII,

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Programmer en JAVA. par Tama

Un ordonnanceur stupide

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmation par les Objets en Java

Gestion distribuée (par sockets) de banque en Java

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TP1 : Initiation à Java et Eclipse

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Tp 1 correction. Structures de données (IF2)

TD/TP PAC - Programmation n 3

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Les structures de données. Rajae El Ouazzani

Programmation avec des objets : Cours 7. Menu du jour

Traduction des Langages : Le Compilateur Micro Java

Auto-évaluation Programmation en Java

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

TD3: tableaux avancées, première classe et chaînes

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation Par Objets

Projet de programmation (IK3) : TP n 1 Correction

Utilisation d objets : String et ArrayList

Corrigé des exercices sur les références

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Algorithmique, Structures de données et langage C

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours 1: Java et les objets

Programmation Objet Java Correction

Les arbres binaires de recherche

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Arbres binaires de recherche

Exercices sur les interfaces

Chapitre VI- La validation de la composition.

Environnements de développement (intégrés)

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

TD/TP PAC - Programmation n 3

TP, première séquence d exercices.

Programmation Objet I

Certificat Big Data - Master MAthématiques

as Architecture des Systèmes d Information

Présentation du langage et premières fonctions

Corrigés des premiers exercices sur les classes

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Initiation à la Programmation en Logique avec SISCtus Prolog

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Bases de programmation. Cours 5. Structurer les données

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Une introduction à Java

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Package Java.util Classe générique

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Solutions du chapitre 4

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Les structures. Chapitre 3

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Langage Java. Classe de première SI

Cours d initiation à la programmation en C++ Johann Cuenin

Définition des Webservices Ordre de paiement par . Version 1.0

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Plateforme PAYZEN. Définition de Web-services

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

TP3 : Manipulation et implantation de systèmes de fichiers 1

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Cours 1 : La compilation

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Héritage presque multiple en Java (1/2)

PROGRAMMATION PAR OBJETS

Chapitre V. Les classes : Object, Vector, etc.

INF 321 : mémento de la syntaxe de Java

Flux de données Lecture/Ecriture Fichiers

TP 1. Prise en main du langage Python

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

1 Recherche en table par balayage

RMI le langage Java XII-1 JMF

Plan du cours. Historique du langage Nouveautés de Java 7

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Java c est quoi? Java pourquoi?

TD3 - Facturation avec archivage automatisé

Objets et Programmation. origine des langages orientés-objet

Compression de Données - Algorithme de Huffman Document de Conception

Recherche dans un tableau

Synchro et Threads Java TM

Génie Logiciel avec Ada. 4 février 2013

Notions fondamentales du langage C# Version 1.0

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Apprendre Java en 154 minutes

Design patterns. Design patterns - définition. Design patterns - avantages

Bases Java - Eclipse / Netbeans

Transcription:

Listes de personnes et calculatrice polonaise inverse en Java Université Paris Sud Motivation Le but de cet exercice est de manipuler les listes chaînées et les piles et de voir leur application en analyse syntaxique et exécution de calculs élémentaires. Exercice 1 Listes de personnes non triée L objet est de réaliser des listes chaînées de Personne (classe vue dans une feuille précédente). Nous allons pour cela : Enrichir la classe Personne Créer deux classes : Liste, la liste proprement dite et NoeudListe, un élément de cette liste Créer une interface, ComportementListe codant le comportement d une liste chaînée. Voici le code de l interface ComportementListe : public interface ComportementListe { // Teste si la liste est vide public boolean estvide(); // Insere des donnees en tete de liste public boolean inserer(object o); // enleve l element de donnees o et renvoie false // si l element est introuvable public boolean enlever(object o); // Renvoie une ref vers l elt de la liste de donnees o // ou null sinon public NoeudListe trouve(object o); // Renvoie la tete de liste public NoeudListe gettete(); 1

2 Listes de personnes et calculatrice polonaise inverse en Java 1. Enrichir la classe Personne dont le squelette est le suivant : class Personne { protected String nom; protected int age; // Constructeurs Personne(String lenom, int lage) {... Personne() {... Personne(Personne p) {... // Pour affichage public String tostring() {... // Accesseurs public String getnom() {... public int getage() {... 2. Créer la classe NoeudListe, de squelette suivant : public class NoeudListe { protected Object protected NoeudListe donnees; suivant; // Constructeurs NoeudListe(Object donnees, NoeudListe suivant) {... NoeudListe(Object donnees) {... // Accesseurs public Object getdonnees() {... public NoeudListe getsuivant() {... // Modificateurs public void setsuivant(noeudliste s) {... public void setdonnees(object o) {... // tostring() delegue le travail a donnees public String tostring() {... Le champ donnees est une référence vers les données à stocker ; le champ suivant est une référence vers le noeud suivant de la liste. 3. Créer la classe Liste, qui implante l interface ComportementListe. Cette classe comporte un champ, tete, de type NoeudListe et accessible seulement dans la classe et ses sous classes. Rajouter une méthode tostring() qui affiche tous les éléments de la liste séparés par des -> en déléguant l affichage de chaque noeud à la classe NoeudListe. Pour l instant, ne rien faire dans la méthode enlever(). On rappelle, pour la méthode trouve(), que le parcours d une liste se fait à partir de la tête de liste, en passant d un élément au suivant (par le biais du champ suivant de NoeudListe) 4. Créer la classe ListePersonnesMain, contenant juste une méthode main(). Dans cette méthode, créer une nouvelle Liste, créer 4 Personne et les inserer()

Exercice 2 Listes de personnes triée 3 dans la liste ; afficher la liste (au moyen d un unique appel à println()). Essayer de trouver() un élément de la liste et un élément qui n y appartient pas ; afficher le résultat de ces deux recherches. Exercice 2 Listes de personnes triée L objet de cet exercice est de créer des listes avec une insertion triée. 1. Écrire la méthode enlever() de Personne. Modifier ListePersonneMain en enlevant deux éléments à la liste (constituée des 4 éléments insérés à la fin de l exercice précédent). Afficher la liste résultante. 2. Créer l interface ObjetOrdonne dont voici le code : public interface ObjetOrdonne { // renvoie true si this <= objo public boolean infouegal(objetordonne objo); public boolean equals(object objo); Cette interface contient deux méthodes : infouegal() dont la sémantique est la suivante : elle renvoie true si l objet appelant a un contenu inférieur ou égal (au sens d une relation d ordre propre au type de l objet) à l objet fourni en paramètre. equals() qui redéfinit celle de la classe Object et qui doit renvoyer true si l objet appelant est égal (au sens d une relation d ordre propre au type de l objet) à l objet fourni en paramètre. 3. Créer la classe PersonneOrdonnee héritant de Personne et implantant l interface ObjetOrdonne dont voici le squelette : class PersonneOrdonnee extends Personne implements ObjetOrdonne { // Constructeurs PersonneOrdonnee(String lenom, int lage) {... PersonneOrdonnee() {... PersonneOrdonnee(PersonneOrdonnee p) {... public boolean equals(object other) {... public boolean infouegal(objetordonne o) {... La relation d ordre associée à infouegal() sera l ordre lexicographique du champ nom (hérité de Personne). Deux PersonneOrdonnee seront déclarées égales (au sens d equals()) si leurs champs nom et age ont des contenus identiques. 4. Créer la classe ListeTriee héritant de Liste de squelette public class ListeTriee extends Liste { // Insere un element de maniere triee public boolean inserer(object obj) {... Pour l insertion triée, distinguer les cas suivants : Cas d une liste vide (premier élément inséré). Insertion en tête de liste. Insertion entre deux éléments (le suivant étant éventuellement null).

4 Listes de personnes et calculatrice polonaise inverse en Java 5. Créer la classe ListePersonnesOrdonneeMain, contenant juste une méthode main(). Dans cette méthode, créer une nouvelle ListeTriee, créer 4 Personne et les inserer() dans la liste ; afficher la liste (au moyen d un unique appel à println()). Puis enlever() deux éléments ; afficher à nouveau la liste. Exercice 3 Calculatrice en notation post-fixée Description générale L objet est de réaliser une calculatrice qui admet une expression arithmétique postfixée (voir plus loin) en entrée et effectue le calcul correspondant. Les expressions arithmétiques considérées seront constituées de nombres flottants (des double) et de l un des caractères suivants : +, -, *, /, ˆ,, q. Le caractère sert de délimiteur, le caractère q sert à quitter l application, les autres ont le sens d opérateur binaire usuel (l expression ˆ correspond à l opérateur puissance). Parmi les différentes notations possibles, deux sont les plus utilisées : La notation infixée, dans laquelle les opérateurs sont entourés par les opérandes ; par exemple 3 * 4 et (3 + 4) * 5 sont des expressions en notation infixée. La notation postfixée, dans laquelle les opérateurs suivent les opérandes ; par exemple 3 4 * et 3 4 + 5 * sont les expressions en notation postfixée correspondant aux précédentes. L algorithme général de calcul d une expression en notation postfixée s effectue simplement à l aide d une pile. Les opérateurs considérés sont tous binaires (par souci de simplification). Les termes entrés sont nommés des lexèmes, entrecoupés de séparateurs ; ici le seul séparateur sera le caractère espace et les lexèmes seront soit un nombre flottant, soit un opérateur binaire (parmi {+,-,*,/,ˆ). L algorithme de calcul s explicite comme suit : (i) Si le lexème courant est un nombre, l empiler. (ii) Si le lexème courant est un opérateur, dépiler les deux opérandes, effectuer l opération, puis empiler le résultat. (iii) L algorithme s arrête lorsqu il n y a plus de lexème à extraire du flux d entrée et que la pile ne contient plus qu un seul élément. Prenons par exemple l expression 3 4 5 + * (correspondant à l expression infixée suivante : 3 * (4 + 5)). On effectue les traitements suivants, écrits en pseudo-code :

Exercice 3 Calculatrice en notation post-fixée 5 Traitements extrairelexeme(3), empiler(3) extrairelexeme(4), empiler(4) extrairelexeme(5), empiler(5) extrairelexeme(+), depiler(), depiler(), calculer(5+4), empiler(9) extrairelexeme(*), depiler(), depiler(), calculer(9*3), empiler(27) État de la pile 3 -> null 4 -> 3 -> null 5 -> 4 -> 3 -> null 9 -> 3 -> null 27 -> null Calculatrice avec PileEnListe Nous allons créer une classe PileEnListe réalisant l implantation d une pile en liste chaînée. Créer une exception FamineException dont le code est le suivant : class FamineException extends Exception { public FamineException(String mess) { super("famine : " + mess); Cette exception sera typiquement générée lorsque l on tente une opération sur une pile vide. Créer l interface ComportementPile dont le code est le suivant : public interface ComportementPile { // Teste si la pile est vide public boolean estvide(); // Empile un element public void empiler(object o); // Depile un element // genere une exception en cas de pile vide public Object depiler() throws FamineException; // Renvoie la hauteur de la pile public int renvoyerhauteur(); // Renvoie le sommet de la pile (sans le depiler) // genere une exception en cas de pile vide public Object renvoyersommet() throws FamineException; Créer la classe PileEnListe de squelette public class PileEnListe implements ComportementPile { private NoeudListe private int sommet; hauteur;

6 Listes de personnes et calculatrice polonaise inverse en Java public PileEnListe() {... // Test de pile vide public boolean estvide() {... // Accesseurs public int renvoyerhauteur() {... public Object renvoyersommet() throws FamineException {... // empiler un element au sommet de la pile public void empiler(object o) {... // depiler un element du sommet de la pile public Object depiler() throws FamineException {... public String tostring() {... On se servira autant que possible de la méthode utilitaire estvide() au sein de la classe. Crér la classe CalcPostFixee admettant le squelette suivant : public class CalcPostFixee { static final int EOL = 0; // Fin de ligne ou d entree static final int VALEUR = 1; // valeur flottante (operande) static final int PUISS = 2; // ^ static final int MULT = 3; // * static final int DIV = 4; // / static final int PLUS = 5; // + static final int MOINS = 6; // - static final int FIN = 7; // On s en va PileEnListe pilepostfixee; // pile de calcul StringTokenizer chaine; // chaine entree au clavier boolean bavarde; // drapeau d affichage de la pile double valeurcourante; // operande courante int lexemecourant; // valeur du lexeme courant public CalcPostFixee(String s, boolean estbavarde) {... public double renvoyervaleur() {... private int renvoyerlexeme() {... private void calculer() {... private void opbinaire(int operateur) {... Les différentes méthodes doivent réaliser les opérations suivantes : CalcPostFixee() initialise les trois premiers champs. En particulier chaine sera initialisé en créant un objet de type StringTokenizer. Le premier argument du constructeur de StringTokenizer est égal à s (premier argument du constructeur CalcPostFixee()). Le dernier argument du constructeur de StringTokenizer sera mis à true indiquant que les séparateurs (ici un espace) sont également renvoyés (par la méthode nexttoken()) comme des lexèmes. renvoyervaleur() effectue : Mise à jour de lexemecourant avec le résultat fourni par la méthode renvoyerlexeme() et appel de calculer() ; ceci est fait en boucle tant que lexemecourant est différent de EOL.

Exercice 3 Calculatrice en notation post-fixée 7 Dépilage du résultat des opérations (effectuées dans les appels successifs à calculer()) pour le renvoyer. On gérera l apparition d exception de type NoSuchElementException (auquel cas on affiche un message d erreur approprié et on renvoie 0) et on traitera le cas de pile vide, en affichant un message d erreur approprié. renvoyerlexeme(), après un appel à la méthode nexttoken() de la classe StringTokenizer, renvoie le code approprié (parmi les différentes constantes définies au début de la classe CalcPostFixee : EOL, VALEUR, PUISS,... ). On renverra EOL en cas de NoSuchElementException. calculer() effectue les actions appropriées pour les valeurs suivantes de la variable lexemecourant : EOL, FIN, VALEUR, default. Ces actions seront souvent l empilage ou l appel de opbinaire(). Pour cette méthode ainsi que pour la suivante, on appliquera l algorithme de calcul postfixé explicité dans les points (i) à (iii) de la description générale de cet exercice. On se servira de méthodes de PileEnListe. La valeur bavarde mise à true provoquera un affichage de la pile à l empilage des points (i) et (ii). opbinaire() effectue l opération. On se servira de méthodes de PileEnListe. La valeur bavarde mise à true provoquera un affichage de la pile à l empilage des points (i) et (ii). Crér la classe CalcPostMain contenant une unique méthode main(). Cette méthode effectue en boucle les opérations suivantes : elle attend que l utilisateur entre une chaîne postfixée au clavier (au moyen d un readline()), elle crée une pile de type CalcPostFixee, puis affiche la valeur renvoyée par renvoyervaleur(). La boucle s arrête lorsque la valeur renvoyée par readline() est égale à null. Ne pas oublier qu entrer le caractère q sert à quitter l application. Calculatrice avec LinkedList Modifier la classe CalcPostFixee en CalcPostFixeeLL de façon à utiliser une LinkedList au lieu de la classe PileEnListe. On se servira des méthodes addfirst() et removefirst() pour empiler et dépiler une valeur. Modifier la classe CalcPostMain pour qu elle utilise une CalcPostFixeeLL.