• Aucun résultat trouvé

Algorithmique avancéeTD n° 5

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmique avancéeTD n° 5"

Copied!
4
0
0

Texte intégral

(1)

IUT de Villetaneuse Département informatique – 2

ème

année

F. Lévy – JM Barrachina 1 Année 2004/2005

Algorithmique avancée TD n° 5

Ecritures infixée, préfixée, postfixée.

Introduction .

La classe Arbre comporte une variable membre de type Nœud (la racine) et une méthode qui renvoie la racine. La classe Noeud est détaillée ci-dessous (vous remarquerez qu'elle a deux variables membre de type Noeud). La classe DefaultMutableTreeNode est une classe modèle pour l'affichage graphique d'arbres dans le schéma MVC. Elle sert à la visualisation de l'arbre.

a. En laissant de coté les lignes marquées //v qui servent à la visualisation, cette classe est-elle conforme à l'implémentation des arbres donnée en cours ?

b. Quel est le principe de l'appel aux fonctions de visualisation ? import java.io.*;

import javax.swing.tree.* ; import javax.swing.* ;

// Classe Nœud pour la construction d'arbres, avec affichage graphique incorporé.

public class Noeud implements Serializable { private DefaultMutableTreeNode noeud; //v private Noeud filsGauche;

private Noeud frere;

// --- CONSTRUCTEURS public Noeud()

{ noeud = new DefaultMutableTreeNode();

filsGauche = null; frere = null;

}

public Noeud(String nomFich)throws FileNotFoundException, IOException, ClassNotFoundException {charger(nomFich);}

// --- CREATIONS

public void creerFilsGauche() // sans y mettre de valeur { filsGauche= new Noeud();

noeud.insert(filsGauche.noeud,0); //v }

public void creerFilsGauche(Noeud n) { filsGauche= n;

noeud.insert(filsGauche.noeud,0); //v }

public void creerFrere() // sans y mettre de valeur { frere= new Noeud();

DefaultMutableTreeNode pere = (DefaultMutableTreeNode) noeud.getParent() ; //v pere.add(frere.getNoeud()); //v

}

(2)

IUT de Villetaneuse Département informatique – 2

ème

année

F. Lévy – JM Barrachina 2 Année 2004/2005

public void creerFrere(Noeud n) { frere= n ;

DefaultMutableTreeNode pere = (DefaultMutableTreeNode) noeud.getParent() ; //v pere.add(frere.getNoeud());//v

}

// --- METHODES DE SERVICE

public Object getObjet() { return (noeud.getUserObject()); } public Noeud getFilsGauche() { return (filsGauche) ; } public Noeud getFrere() { return (frere) ; }

private DefaultMutableTreeNode getNoeud() { return(noeud); } public void setObjet(Object o) { noeud.setUserObject(o); }

public String toString() {return getObjet().toString() ; // --- IDENTITE

public boolean estRacine(){return(noeud.isRoot()); } //v

public boolean estFeuille(){ return(noeud.isLeaf()); } // peut être fait directement // --- SAUVEGARDE

public void sauver(String nomFich) throws FileNotFoundException, IOException { FileOutputStream fich=new FileOutputStream(nomFich);

ObjectOutputStream out = new ObjectOutputStream(fich) ; out.writeObject(noeud); //v

out.writeObject(filsGauche);

out.writeObject(frere);

out.close();

fich.close();

}

public void charger(String nomFich)throws FileNotFoundException, IOException, ClassNotFoundException { FileInputStream fich=new FileInputStream(nomFich);

ObjectInputStream inp = new ObjectInputStream(fich) ; noeud=(DefaultMutableTreeNode)inp.readObject(); //v filsGauche=(Noeud)inp.readObject();

frere=(Noeud)inp.readObject();

inp.close();

fich.close();

}

// INTERFACAGE GRAPHIQUE public JTree getJTree() //v

{ return new JTree(new DefaultTreeModel(noeud));

}

} // end class Noeud

(3)

IUT de Villetaneuse Département informatique – 2

ème

année

F. Lévy – JM Barrachina 3 Année 2004/2005

Expressions arithmétiques :

Une expression arithmétique peut prendre trois formes : préfixée, postfixée et infixée.

Cette expression peut s'insérer dans un arbre binaire

A une expression arithmétique donnée correspond donc trois écritures et un arbre binaire.

L'objectif du td est de rédiger trois classes Infixee , Prefixee , et Postfixee permettant de passer d'une forme d'écriture à l'arbre binaire et réciproquement.

Ces trois classes ayant la même structure, elles dériveront d'une même classe abstraite Expression qui stocke à la fois l'écriture et l'arbre (il suffit de pointer sur sa racine), et dont voici le code (disponible dans tpinfo) :

import java.io.*;

public abstract class Expression { protected String expression;

protected Noeud arbre;

public Expression(String s) { expression = new String(s);

fabriquerArbre();

}

public Expression(Noeud a) { arbre = a;

reconstituerExpression();

}

// constructeur à partir d’un arbre enregistré public Expression(String chemin,String nomFich)

throws FileNotFoundException, IOException,ClassNotFoundException { nomFich = chemin + nomFich;

arbre = new Noeud(nomFich);

reconstituerExpression();

}

protected abstract void reconstituerExpression();

protected abstract void fabriquerArbre();

public String getExpression() {return(expression);}

public Noeud getArbre() { return(arbre);}

public void sauver(String nomFich) throws FileNotFoundException, IOException {arbre.sauver(nomFich);}

public int valeur() { // à completer } // end valeur

} // end class Expression

Question 1 :

Pour chacune des trois classes Prefixee , Postfixee et Infixee quel algorithme permet de reconstituer une expression à partir de l'arbre ? Implémenter cet algorithme dans la méthode :

protected void reconstituerExpression();

(4)

IUT de Villetaneuse Département informatique – 2

ème

année

F. Lévy – JM Barrachina 4 Année 2004/2005

qui est appelée quand on crée une expression en lui passant un arbre, et qui calcule l'écriture (préfixée, postfixée, infixée) de l'arbre (un algorithme et une méthode par classe !). Pour les tests, on pourra utiliser la classe TreeMaker fournie : la méthode newtree(String s) de cette classe reçoit une expression infixée totalement parenthésée, crée un arbre et renvoie un Nœud qui est la racine de cet arbre. A l'aide de cet arbre, on peut tester que la reconstitution de l'expression est correcte. Dans le cas d'une expression infixée, la méthode reconstituerExpression() fournira une chaîne entièrement parenthésée. identique à celle passée en entrée, aux espaces près.

La classe Test.java fournie contient un exemple de test.

Question 2

Pour chacune des trois classes Prefixee , Postfixee et Infixee , quels sont les algorithmes qui permettent de reconstituer l'arbre à partir de l'expression ? Implémenter cet algorithme dans la méthode :

protected abstract void fabriquerArbre();

Pour la mise au point, on utilisera la classe FenEssai.class dans laquelle on peut saisir une expression et afficher l'arbre obtenu, et les programmes TestPostfixe.java, TestPrefixe.java et TestInfixe.java.

Dans TPINFO/AlgoA/td5 :

libexpression.jar contient les classes Nœud, Expression, FenEssai

pile.jar contient Pileint et une classe PileObject qui empile les types non-primitifs TreeMaker.class est fourni en version compilée

les fichiers de test sont en code source.

Références

Documents relatifs

Montrer que l'on peut implémenter une file avec deux piles : écrire les opérations spécifiées par la définition de la file en utilisant uniquement les opérations abstraites sur

L'interface Pile peut-elle spécifier une pile dont les données sont des entiers (on dit que l'interface spécifie la classe quand on peut déclarer que la classe implémente

Implanter cet arbre avec la technique (donnée, 1 er fils, frère) expliquée en cours (il y a 11 nœuds abstraits, on donne donc un tableau de 11 nœuds en mémoire. On utilise l'index

On les ajoute tous à une file de priorité, puis on prélève un par un les éléments de la file et on les place au fur et à mesure dans un tableau, jusqu'à ce que la file soit

Comparer les performances des algorithmes en essayant de déterminer pour différentes tailles de tableaux, le gain de temps apporté par un meilleur algorithme, et pour chaque

On calcule facilement les coordonnées de l’intersection I de (AB) et (CD) à partir des équations de ces droites dans un repère orthonormé (Ox ; Oy).. Si on écrit que I appartient

Un repère orthonormé se présente naturellement : origine au centre du cercle, diamètre [O14, O5] portant l'axe des abscisses (orienté de gauche à droite ), unité le rayon

Si on ne connait pas la formule générale, mais on se souvient que le cercueil de Gauss a été bâti sur une base heptadécagonale comme hommage à sa belle découverte, il reste