Calcul d'expressions mathématiques
Bonjour
je ne n'arrive pas à trouver mon erreur dans ce code: il s'agit de calcul d'expressions mathématiques se trouvant dans un fichier xml.
PS: ça marche pour les expressions R1 et R3 mais pas pour R2.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/**
* @author barry
*
*/
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class ExpMath {
private static double resultat = 0.0f;
private static String expression = "";
/**
* Calcul d'expressions arithmétiques
* contenues dans une feuille xml (exam.xml).
*/
public static double evaluate(Element e, Element rac) {
// TODO Auto-generated constructor stub
double v;
if (e == null){
v = resultat;
resultat = 0.0f;
return v;
}
else if (e.getTagName().equals("op"))
{
expression = expression + " (";
Element child = (Element) e.getFirstChild();
if (child.getTagName().equals("op"))
resultat = evaluate((Element) child.getFirstChild(), rac);
else
resultat = evaluate(child, rac);
}//op
else if (e.getTagName().equals("var"))
{
String varName = e.getAttribute("nom");
double varValeur = 0.0f;
char operateur;
NodeList lesConstantes = rac.getElementsByTagName("const");
for (int j = 0; j < lesConstantes.getLength(); j++)
{
if (((Element) lesConstantes.item(j)).getAttribute("nom").equals(varName))
varValeur = Double.parseDouble(((Element) lesConstantes.item(j)).getAttribute("valeur"));
}
operateur = ((Element) e.getParentNode()).getAttribute("symbole").charAt(0);
expression = expression + varValeur;
if (e.getNextSibling() != null)
e = (Element) e.getNextSibling();
else {
expression += ") ";
e = (Element) e.getParentNode().getNextSibling();
if (e != null) {
operateur = ((Element) e.getParentNode()).getAttribute("symbole").charAt(0);
// Addition
if (operateur == '+')
resultat += evaluate((Element)e.getFirstChild(), rac);
//Soustraction
else if (operateur == '-')
resultat -= evaluate((Element) e.getFirstChild(), rac);
//Multiplication
else if (operateur == '*')
resultat *= evaluate((Element) e.getFirstChild(), rac);
//Division
else if (operateur == '/')
resultat /= evaluate((Element)e.getFirstChild(), rac);
}
}
expression = expression + " " + operateur;
//Addition
if (operateur == '+')
resultat = varValeur + evaluate(e, rac);
//Soustraction
else if (operateur == '-')
resultat = varValeur - evaluate(e, rac);
//Multiplication
else if (operateur == '*')
resultat = varValeur * evaluate(e, rac);
//Division
else if (operateur == '/')
resultat = varValeur / evaluate(e, rac);
}//var
v = resultat;
resultat = 0.0f;
return v;
}
public static String getExpression(){
String exp = expression;
expression = "";
return exp;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setCoalescing(false);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("/home/barry/Oxygen XML Editor 9/exam.xml"));
// rac est l'élément racine du document.
Element rac = document.getDocumentElement();
NodeList lesExp = rac.getElementsByTagName("exp");
System.out.println("---------------------------------------------------");
for (int i = 0; i < lesExp.getLength(); i++)
{
String n = ((Element) lesExp.item(i)).getAttribute("nom");
Element ex = (Element) lesExp.item(i).getFirstChild();
System.out.println(n + " = " + evaluate(ex, rac) + " = " + getExpression());
System.out.println("---------------------------------------------------");
}
}//Main
}//ExpMath |
CODE XML:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE formules SYSTEM "file:/home/barry/Oxygen%20XML%20Editor%209/exam.dtd">
<formules>
<constantes>
<const valeur="3" nom="X"/>
<const valeur="78" nom="Y"/>
<const valeur="45" nom="Z"/>
</constantes>
<exps>
<exp nom="R1">
<op symbole="+">
<var nom="X"/>
<var nom="Z"/>
</op>
</exp>
<exp nom="R2">
<op symbole="+">
<op symbole="*">
<var nom="X"/>
<var nom="X"/>
</op>
<op symbole="*">
<var nom="Y"/>
<var nom="Y"/>
</op>
</op>
</exp>
<exp nom="R3">
<op symbole="*">
<var nom="X"/>
<op symbole="*">
<var nom="X"/>
<op symbole="*">
<var nom="X"/>
<op symbole="+">
<var nom="Y"/>
<var nom="Z"/>
</op>
</op>
</op>
</op>
</exp>
</exps>
</formules> |
DTD:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT formules (constantes, exps) >
<!ELEMENT constantes (const+) >
<!ELEMENT const EMPTY >
<!ATTLIST const valeur CDATA #REQUIRED nom ID #REQUIRED >
<!ELEMENT exps (exp*) >
<!ELEMENT exp (op) >
<!ATTLIST exp nom ID #REQUIRED >
<!ELEMENT op ((var, var+) | (op, op+) | (var, op+,var*) | (var*, op+, var)) >
<!ATTLIST op symbole CDATA #REQUIRED >
<!ELEMENT var EMPTY >
<!ATTLIST var nom IDREF #REQUIRED > |