SWING/font/XML/arbre binaire algo URGENT !!!

mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002 - 14 déc. 2002 à 15:12
JHelp Messages postés 261 Date d'inscription jeudi 5 septembre 2002 Statut Membre Dernière intervention 6 octobre 2005 - 19 déc. 2002 à 19:52
salut !

à partir d'une interface swing java, on est supposé pouvoir entrer des formules (dans un certain langage de logique) exemple simple:
(a.b)=(c+d)|(a.c)
ppuis on doit sauvegarder tout ceci dans un fichier XML.....
1er souci : on a dû créer une font qui permet d'écrire des caractères avec une barre au dessus (exigences du langages!!) mais on arrive pas à la rajouter aux fonts disponibles pour l'utiliser.
2ème souci : on arrive pas dans le même Jtextfield et le même Jeditorpane à écrire 2 caractères l'un à côté de l'autre mais avec des polices différentes ! on arrive à changer la police sur tout le Jeditorpane ou tout le Jtextfield.
3ème souci : pour écrire les balises du fichier XML, on a besoin de transformer chaque formule en arbre binaire(on la récupère dans une chaine de caractère d'abord) avec les caractères en tant que feuilles et les opérateurs en tant que noeud. L'algorithme doit être faisable, mais on manque de temps pour finir notre projet et réviser nos partiels..

est-ce que vous pouvez nous aider??????????

merci bien !!!!

mkstraits

mkstraits@yahoo.fr

8 réponses

JHelp Messages postés 261 Date d'inscription jeudi 5 septembre 2002 Statut Membre Dernière intervention 6 octobre 2005 11
15 déc. 2002 à 03:21
Ajouter une police est un peu compliqué, alors je te sugères d'utiliser les caractéres unicodes.

Pour faire un trait sur une letrre tu fais :

surligner=caractere+'\u0305';

En fait le caractère '\u0305' signifie, met un trair sur le caractère qui me précéde

Si tu vauex une liste exaustive des modifieurs unicode : http://www.unicode.org/charts/PDF/U0300.pdf
Ils fonctionnent tous de la même manière

Si tu veux la liste complète :
http://www.unicode.org/charts/

Voilà pour le 1er soucis

Pour le second, il va falloir soit passer par un JTextPane, soit dessiner toi même dans un composant.

Dans la dernière version de java, il y a un parseur XML, ce qui devrait résoudre ton troisième point.

J'espère vous avoir aider, toi et tes collègues.
Bonnes révisions pour le partiel.
Si tu ne comprends pas tout, demande.

JHelp
0
mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002
17 déc. 2002 à 19:45
j'essaie depuis deux jours de poster ce message pour dire merci et demander d'autres précisions, mais le forum n'a pas l'air de fonctionner très bien !!!!!

mkstraits
0
mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002
17 déc. 2002 à 19:53
puisque ça marche maintenant, j'en profite pour poster mon message !!

merci jhelp !

mes questions peuvent paraître un peu bêtes, mais quand j'essaie d'utiliser le +'\u0305', (ou n'importe quel autre d'ailleurs), ça m'affiche un carré à côté de mon caractère ou ma chaîne de caractère.....

concernant le JtextPane, il me semble que c'est une classe qui hérite de JEditorPane... et je ne vois aucune méthode qui me permet de changer la police sur un caractère sans le changer sur l'autre. y a -t-il un tutorial quelconque sur le site de sun ou ailleurs qui explique tout ceci????

concernant lea partie XML, nous avons un nouveau souci :
le fichier .xml est créé sans problème, par contre, il est vide !
out = new PrintWriter(new FileOutputStream("formule.xml"));
puis
out.write("<!DOCTYPE USERS SYSTEM "formule.dtd">"); out.write("<FORMULE>");

ne fait que nous créer le fichier vide !!!! comment est-ce possible ??

merci de l'aide par avance !!!!

mkstraits

mkstraits
0
mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002
17 déc. 2002 à 19:54
ne prends pas en compte ce que j'ai dit concernant la partie XML.... ça marche pour écrire dans le fichier et créer les balises.... le souci maintenant est de relire le fichier XML. Je ne vois pas trop comment faire la parser et le document handler....merci...

mkstraits
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JHelp Messages postés 261 Date d'inscription jeudi 5 septembre 2002 Statut Membre Dernière intervention 6 octobre 2005 11
18 déc. 2002 à 09:50
Pour le caractère surligner, il faut que tu utilises un police qui accèpte l'unicode, chez moi avec Font police=new Font("Dialog",Font.PLAIN,14); çà marche.

Faire un parseur, n'est pas simple et un peu long, donc si tu n'as pas beaucoup de temps, essaie de voir avec (si tu peux) le jdk 1.4. Il y en a des tout fait.
Autrement, il va me falloir plus de détails sur ton programme, et sur XML, çà fait un bout de temps que j'en ai pas fait.
Si mes souvenirs sont bon, quand on a <Quelque chose>, on a un blaise fermante </Quelque chose> pour limité, comme en HTML.
Tupeux déja te servir de cette propriété.
En ademetant que tu as la classe Balise, qui se construit avec un nom et un contenu pouvant etre n'importe qu'elle instruction XML, même du simple texte.
Je suppose que ta structure est du type :

import java.io.*;

public abstract class InstructionXML()
{
public abstract static InstructionXML parser(RandomAcessFile raf,int debut,int lg) throws IOException;
public final static InstructionXML(String fichier) throws IOException
{
RandomAccessFile raf=new RandomAccessFile(fichier,"r");
InstructionXML rep=null;
if(estBalise(raf,0))
rep=Balise.parser(raf,0,raf.length());
esle
rep=SimpleTexte(raf,0,raf.length());
raf.close();
return rep;
}
protected final static boolean estBalise(RandomAccesFile raf,int debut) throws IOException
{
raf.seek(debut);
return raf.readChar()=='<';
}
}

--------

import java.io.*;
public class SimpleTexte extends InstructionXML
{
//ton code
//...........

public static InstructionXML parser(RandomAccesFile raf,int debut,int lg) throws IOException
{
raf.seek(debut);
String rep="";
for(int i=0;i<lg;i++)
rep += raf.readChar();
return new SimpleTexte(rep);
}
}

-------------------

import java.io.*;
public class Balise extends InstructionXML
{
//ton code
//...........

public static InstructionXML parser(RandomAccesFile raf,int debut,int lg) throws IOException
{
raf.seek(debut+1);
String nom="";
char c=' ';
int i=0;
for(;(i<lg)&&(c!='>');i++)
{
c=raf.readChar();
if(c!='>')
nom += c;
}
int deb=i+1;
boolean autre=true;
while(autre)
{
if(readChar()=='<')
{
String nom2="";
c=' ';
while(c!='>')
{
c=raf.readChar();
if(c!='>')
nom2 += c;
}
autre=!nom.toUpperCase().equals(nom2.toUpperCase());
if(autre)
i += nom2.length(); // +1 ? -1 ? j'ai un doute
}
if(autre)
i++;
}
InstructionXML contenu=null;
if(estBalise(raf,deb))
contenu=Balise.parser(raf,deb,i-deb+1); //le +1 n'est pas sur
esle
contenu=SimpleTexte.parser(raf,deb,i-deb+1);//le +1 n'est pas sur
return new Balise(nom,contenu);
}
}

Pour le JTextPane, je te conseille de regarder les tutoriaux de sun sur www.java.sun.com. Il permet tout, mais pas toujours simple.

Bon j'espére vous avoir aider

JHelp
0
mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002
18 déc. 2002 à 21:53
merci bien !!
je vais voir tout ceci et te tiendrai au courant !!

merci vraiment pour l'aide, c'est gentil !!

mkstraits
0
mkstraits Messages postés 6 Date d'inscription samedi 14 décembre 2002 Statut Membre Dernière intervention 19 décembre 2002
19 déc. 2002 à 17:15
bonsoir !!!!

merci beaucoup JHELP !!!

en effet, c'est bon pour les caractères surlignés !!!! il reste quelques détails à gérer, mais le plus important est que ça marche !!!!

nous avons créé notre fichier XML à partir d'une formule qu'on entre en dur dans notre programme. En effet, une formule va être lue comme un arbre, mais l'arbre ne sera pas créé, c'est les balises XML qui seront créées. leur structure sera celle d'un arbre. exemple : a=b donnera en XML, <egalite>
<caractere>a</caractere>
<caractere>b</caractere>
</egalite>

ce qu'il nous manque, c'est le code qui nous permet de lire dans le fichier XML et reconstituer notre formule. le but étant d'implanter le tout dans nos fonctions sauvegarder et ouvrir de notre editeur, pour permettre à l'utilisateur de sauvegarder ses formules en un fichier XML (chaque ligne dans l'éditeur correspond à une formule) et de réafficher ses formules à partir du fichier XML.

Voici le code qui permet de créer le fichier XML. Il me faudra des indications, explications concernant ce qu'il faut faire pour lire le fichier XML, car j'avoue qu'on est un peu perdu.

package creationxml;

import java.lang.*;

public abstract class Arbre
{

protected Arbre filsGauche, filsDroit;
public Arbre()
{
}

public Arbre(Arbre fg, Arbre fd)
{
filsDroit = fd;
filsGauche = fg;
}


public Arbre getFilsGauche()
{
return filsGauche;
}

public Arbre getFilsDroit()
{
return filsDroit;
}

public abstract String toString();

}

**************************************************
package creationxml;

import java.io.*;
import java.util.*;
import java.lang.*;

public class ArbreCreation
{
private String form;
private Arbre tree, treefinal;
private BufferedWriter ecrire;
//private String ENCODING = "ISO-8859-1";

public ArbreCreation(String formule)
{
try
{
ecrire = new BufferedWriter(new FileWriter("formule.xml"));
System.out.println("hello");
//ecrire.write("<?xml version="1.0" encoding=""+ENCODING+""?>"+"/n");

ecrire.write("<!DOCTYPE USERS SYSTEM "formule.dtd">"+"\n");
ecrire.write("<FORMULE>"+"\n");
System.out.println("hello world");
}
catch(IOException ioe){System.out.println("erreur : " + ioe );}

this.form= formule;
treefinal=construction(formule, null);

}

public Arbre construction(String formule, Arbre arb)
{
int indexEgalite;
Arbre fd, fg;

if (formule.equals(""))
{
try
{
ecrire.write("</FORMULE>"+"\n");
}
catch(IOException ioe){System.out.println("erreur : " + ioe );}
return null;
}

// on recherche d'abord l'egalite// indexEgalite formule.indexOf("=");
if(indexEgalite != -1)
{
try
{
ecrire.write("<EGALITE>"+"\n");
fg = construireArbre(formule.substring(0, indexEgalite), arb);
}
catch(IOException ioe){System.out.println("erreur Egalite: " + ioe );}
try
{
fd = construireArbre(formule.substring(indexEgalite+1, formule.length()), arb);
ecrire.write("</EGALITE>"+"\n");
}
catch(IOException ioe){System.out.println("erreur Egalite: " + ioe );}
}
else
{
tree= construireArbre(formule,arb);
}
try
{
ecrire.write("</FORMULE>"+"\n");
ecrire.flush();
ecrire.close();
}
catch(IOException ioe){System.out.println("erreur fin : " + ioe );}
return arb;

}

public Arbre construireArbre(String formule, Arbre arb)
{
int indexdebut, indexfin;
String membregauche, membredroit;
Arbre filsgauche, filsdroit;

//parentheses simples
indexdebut= formule.indexOf("(");
indexfin= formule.lastIndexOf(")");
if((indexdebut != -1)&&(indexfin != -1))
{
try
{
// L'expression entre ()
ecrire.write(""+"\n");
Arbre a = construireArbre(formule.substring(indexdebut+1, indexfin), arb);
ecrire.write("

"+"\n");
}
catch(IOException ioe){System.out.println("erreur : " + ioe );}

//L'expression avant et aprés les parentheses
membregauche = formule.substring(0, indexdebut);
membredroit = formule.substring(indexfin+1, formule.length());
return construireArbre(membregauche+"EEE"+membredroit, arb);
}

// +
indexdebut = formule.indexOf("+");
if(indexdebut != -1)
{
try
{
ecrire.write(""+"\n");
filsgauche = construireArbre(formule.substring(0, indexdebut), arb);
}
catch(IOException ioe){System.out.println("erreur plus : " + ioe );}

try
{
filsdroit = construireArbre(formule.substring(indexdebut+1, formule.length()), arb);
ecrire.write("

"+"\n");
}
catch(IOException ioe){System.out.println("erreur : plus" + ioe );}

}

// .
indexdebut = formule.indexOf(".");
if(indexdebut != -1)
{
try
{
ecrire.write("<SEQUENCE>"+"\n");
filsgauche = construireArbre(formule.substring(0, indexdebut), arb);
}
catch(IOException ioe){System.out.println("erreur sequence: " + ioe );}
try
{
filsdroit = construireArbre(formule.substring(indexdebut+1, formule.length()), arb);
ecrire.write("</SEQUENCE>"+"\n");
}
catch(IOException ioe){System.out.println("erreur sequence: " + ioe );}
}

// |
indexdebut = formule.indexOf("|");
if(indexdebut != -1)
{
try
{
ecrire.write(""+"\n");
filsgauche = construireArbre(formule.substring(0, indexdebut), arb);
}
catch(IOException ioe){System.out.println("erreur pipe: " + ioe );}
try
{
filsdroit = construireArbre(formule.substring(indexdebut+1, formule.length()), arb);
ecrire.write("

"+"\n");
}
catch(IOException ioe){System.out.println("erreur pipe: " + ioe );}
}

// in
indexdebut = formule.indexOf(" in ");
if(indexdebut != -1)
{
try
{
ecrire.write(""+"\n");
filsgauche = construireArbre(formule.substring(0, indexdebut), arb);
}
catch(IOException ioe){System.out.println("erreur in: " + ioe );}
try
{

filsdroit = construireArbre(formule.substring(indexdebut+4, formule.length()), arb);
ecrire.write(""+"\n");
}
catch(IOException ioe){System.out.println("erreur in: " + ioe );}
}

/*
**** le new qui marche pas faudra trouver une parade
indexdebut = formule.indexOf(" new ");
System.out.println("notre index debut est:" + indexdebut);
indexfin= formule.indexOf("b",5);
System.out.println("notre index fin est:" + indexfin);
if(indexdebut != -1)
{
try
{ //l'expression que l'on vient de déclarer
ecrire.write("<NOUVEAU>"+"\n");
ecrire.write(formule.substring(indexdebut+5, indexfin)+"\n");
ecrire.write("</NOUVEAU>"+"\n");
}
catch(IOException ioe){System.out.println("erreur in: " + ioe );}

membregauche = formule.substring(0, indexdebut);
membredroit = formule.substring(indexfin+1, formule.length());
return construireArbre(membregauche+"EEE"+membredroit, arb);

}*/

if(formule.equals("EEE")) return arb;

if (formule!= form)
{
if ((formule.indexOf("="))==-1)
{
if ((formule.indexOf("+"))==-1)
{
if ((formule.indexOf("."))==-1)
{
if ((formule.indexOf(" new "))==-1)
{
if ((formule.indexOf(" in "))==-1)
{
if ((formule.indexOf("|"))==-1)
{
try
{
ecrire.write("<CARACTERE>");
ecrire.write(formule+"\n");
ecrire.write("</CARACTERE>"+"\n");
}
catch(IOException ioe){System.out.println("erreur caractere: " + ioe );}
}
}
}
}
}
}
}

return arb;
}

public String toString()
{
return tree.toString();
}
}
**************************************************
package creationxml;

import java.io.*;

class Chaine
{
private BufferedReader in;
private String formule;

public Chaine()
{
try
{
in= new BufferedReader( new InputStreamReader(System.in));
formule= in.readLine();
}
catch(IOException e) {};
}

public String getFormule()
{
return formule;
}
}

public class TestArbre
{
private static ArbreCreation A;

public static void main (String[] args)
{

System.out.println("entrer votre formule:");
Chaine Chaine1= new Chaine();
A = new ArbreCreation(Chaine1.getFormule());
System.out.println("votre fichier a été créé");

}
}
**************************************************

merci d'avance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

mkstraits
0
JHelp Messages postés 261 Date d'inscription jeudi 5 septembre 2002 Statut Membre Dernière intervention 6 octobre 2005 11
19 déc. 2002 à 19:52
Bonsoir,
Bon j'ai pas le temps ce soir de développer plus, mais je peux te donner quelques pistes.
En supposant que ton fichier XML est syntaxiquement corecte, tu récupére la première balise entre < et > en fonction de son nom tu fait le traitement approprié.
Je m'explique pour :
<egalite>
<caractere>a</caractere>
<caractere>b</caractere>
</egalite>
tu récupéres egalite donc tu sait qu'il s'iagit du symbol =, qu'il posséde 2 arguments, construit fils gauche, puis fils droit.
Don tu traites d'abord le fils gauche, par récusion, cette fois-ci tu trouves caracter ,donc tu sais qu'il ne poséde qu'un seul argument entre > et <, tu peux ainsi le rcupérer, puis l'écrire. Tu avnt ensiute j'uqu'au > et tu termines le traitement pour le caractére.
Par récursion, ton prog, va se retrouvé à avoir fini le premier argument de l'égalité, donc tu met le =
Et en suite tu taites le second.
Ca va tu vois ce que je veux dire. Dans ma tête l'algo est clair, mais je ne suis pas sur de l'avoir été.
JHelp
0
Rejoignez-nous