Partage
  • Partager sur Facebook
  • Partager sur Twitter

Evaluer expression XML java

Sujet résolu
    14 février 2017 à 17:53:00

    Bonjour à tous, 

    Pour des révisions je me trouve face à un exercice sur lequel je bloque. 

    J'ai un document xml :

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE formules SYSTEM "expMath.dtd">
    <formules>
        <constantes>
            <const nom="A" valeur="1"/>
            <const nom="B" valeur="7"/>
            <const nom="C" valeur="50"/>
            <const nom="X" valeur="10"/>
        </constantes>
        <exps>
            <exp nom="exp1">
                <op symbole="mult">
                    <op symbole="plus">
                        <var nom="A"/>
                        <var nom="B"/>
                    </op>
                    <op symbole="moins">
                        <var nom="A"/>
                        <var nom="B"/>
                    </op>
                </op>
            </exp>
            <exp nom="exp2">
                <op symbole="mult">
                    <op symbole="moins">
                        <op symbole="moins">
                            <var nom="A"/>
                            <var nom="B"/>
                        </op>
                        <var nom="C"/>
                    </op>
                    <var nom="A"/>
                </op>
            </exp>
            <exp nom="exp3">
                <op symbole="mult">
                    <var nom="C"/>
                    <op symbole="mult">
                        <var nom="C"/>
                        <op symbole="div">
                            <var nom="B"/>
                            <var nom="A"/>
                        </op>
                    </op>
                </op>
            </exp>
            <exp nom="exp4">
                <op symbole="mult">
                    <op symbole="mult">
                        <var nom="X"/>
                        <var nom="X"/>
                    </op>
                    <var nom="X"/>
                </op>
            </exp>
        </exps>
    </formules>

    ce document représente des formules mathématiques, je dois créer un évaluateur JAVA permettant de calculer l'expression dans les balises exp.

    Comme indication j'ai :*

    public static double evaluate (Node n ...) {
    
    	}

    auriez-vous des indications à me donner concernant la marche à suivre afin d'arriver au bout de cet exercice?

    J'ai essayé de commencer par pas mal de chemin mais j'ai peur de partir sur quelque chose de trop compliqué. J'en suis là :

    public static double evaluate (Node n, NodeList constantes) {
    // constantes contiendrait les valeurs des constantes utiles à l'évaluation
    		String symbole = n.getFirstChild().getAttributes().getNamedItem("symbole").getNodeValue();
    		 switch (symbole) {
    			 //TODO
    		 }
    
    	}

    Merci d'avance !

    Nael


    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2017 à 10:05:37

      Tu peut utilisé l'héritage pour te simplifié la tache, tu aura juste à faire un mapping:

      public abstract class NodeCalcul
      {
      	private List<NodeCalcul> lstNode;
      	
      	public NodeCalcul(List<NodeCalcul> lstNode)
      	{
      		this.lstNode = lstNode;
      	}
      	
      	public abstract int getValue();
      	
      	protected List<NodeCalcul> getlstNode()
      	{
      		return lstNode;
      	}
      	
      }
      
      public class Multiplication extends NodeCalcul{
      	
      	public NodeCalcul(List<NodeCalcul> lstNode)
      	{
      		super(lstNode);
      	}
      	
      	public int getValue()
      	{
      		int value = 1;
      		
      		for(NodeCalcul node : getlstNode())
      		{
      			value *= node.getValue();			
      		}
      		
      	}
      	
      }
      
      public class Variable extends NodeCalcul{
      	
      	private int value=0;
      	
      	public NodeCalcul(int value)
      	{
      		this.value = value;
      		super(null);
      	}
      	
      	public int getValue()
      	{
      		return value;
      	}
      	
      }
      



      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2017 à 16:03:38

        Bonjour,

        Merci pour ta réponse, mais je dois partir de l'indication fournie donc ce n'est pas la méthode que je dois adopter..

        • Partager sur Facebook
        • Partager sur Twitter
          16 février 2017 à 9:06:49

          Dans se cas là tu peu utilisé la récursivité:

          public static double evaluate (Node n, NodeList constantes) {
          	// constantes contiendrait les valeurs des constantes utiles à l'évaluation
          	String nodeType = n.getFirstChild().getLocalName();
          	
          	
          	switch(nodeType)
          	{
          		case "exp":
          			
          			if(n.getChildNodes() != null && n.getChildNodes().size() == 1)
          			{
          				return evaluate(n.getChildNodes().item(0));
          			}
          			else
          			{
          				return 0;
          			}
          		break;
          		case "op"
          			String symbole = n.getFirstChild().getAttributes().getNamedItem("symbole").getNodeValue();
          			switch (symbole) {
          				case "mult" :
          				{
          					
          					double val = 1;
          					
          					boolean first = true
          					
          					for(int i = 0; i <  n.getChildNodes().lenght(); i++)
          					{
          						
          						if(first)
          						{
          							val = evaluate( n.getChildNodes().item(i));
          							first = false;
          						}
          						else
          						{
          							val *= evaluate( n.getChildNodes().item(i));
          						}
          						
          					}
          					
          					return val;
          					
          				}
          				
          				[...]
          			}
          		break;
          		case "var":
          			String name = n.getFirstChild().getAttributes().getNamedItem("nom").getNodeValue();
          				for(int i = 0; i <  constantes.lenght(); i++)
          				{
          					if(name.equals(constantes.item(i).getAttributes().getNamedItem("nom").getNodeValue()))
          					{
          						
          						return Double.parseDouble(constantes.item(i).getAttributes().getNamedItem("valeur").getNodeValue());
          						
          					}
          				}
          		break;
          		
          		
          	}
          	
          	
          	
          
          }

          Par contre le code n'est pas complet et est largement factorisable mais sa peut te donner une idée.



          • Partager sur Facebook
          • Partager sur Twitter
            20 février 2017 à 22:20:37

            Je vois un peu tard ta réponse mais je te remercie quand même beaucoup ! C'est comme cela que je voyais l'implémentation sans savoir comment m'y prendre.. 

            Je vais me servir de ta réponse pour retravailler cet exercice. 

            Encore une fois merci!

            • Partager sur Facebook
            • Partager sur Twitter

            Evaluer expression XML java

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown