private decimal EvaluerOperation(NoeudArbreExpression p_noeud)
        {
            decimal valeurGauche = Evaluer(p_noeud.Gauche);
            decimal valeurDroite = Evaluer(p_noeud.Droite);

            switch (p_noeud.Operateur)
            {
            case '+':
                return(valeurGauche + valeurDroite);

            case '-':
                return(valeurGauche - valeurDroite);

            case '/':
                if (valeurDroite == 0)
                {
                    throw new DivideByZeroException();
                }
                return(valeurGauche / valeurDroite);

            case '*':
                return(valeurGauche * valeurDroite);

            default:
                throw new ArgumentException("Opérateur inconnu");
            }
        }
예제 #2
0
 public NoeudArbreExpression(
     char p_operation,
     NoeudArbreExpression p_gauche,
     NoeudArbreExpression p_droite
     )
 {
     this.TypeNoeud = TypeNoeudArbreExpression.Operation;
     this.Operateur = p_operation;
     this.Gauche    = p_gauche;
     this.Droite    = p_droite;
 }
        private void ParcoursInfixe(Action <string> p_action, NoeudArbreExpression p_noeud)
        {
            if (p_noeud.Gauche != null)
            {
                ParcoursInfixe(p_action, p_noeud.Gauche);
            }

            p_action?.Invoke(p_noeud.ToString());

            if (p_noeud.Droite != null)
            {
                ParcoursInfixe(p_action, p_noeud.Droite);
            }
        }
        private decimal Evaluer(NoeudArbreExpression p_noeud)
        {
            //if (p_noeud.TypeNoeud == TypeNoeudArbreExpression.Operation) {
            //    if (p_noeud.Gauche == null || p_noeud.Droite == null)
            //    {
            //        throw new ArgumentException("Noeud incohérent", "p_noeud");
            //    }
            //    return EvaluerOperation(p_noeud);
            //} else if (p_noeud.TypeNoeud == TypeNoeudArbreExpression.Valeur)
            //{
            //    if (p_noeud.Gauche != null || p_noeud.Droite != null)
            //    {
            //        throw new ArgumentException("Noeud incohérent", "p_noeud");
            //    }
            //    return p_noeud.Valeur;
            //}
            //else
            //{
            //    throw new InvalidProgramException();
            //}

            // <=>

            switch (p_noeud.TypeNoeud)
            {
            case TypeNoeudArbreExpression.Operation:
                if (p_noeud.Gauche == null || p_noeud.Droite == null)
                {
                    throw new ArgumentException("Noeud incohérent", "p_noeud");
                }
                return(EvaluerOperation(p_noeud));

            case TypeNoeudArbreExpression.Valeur:
                if (p_noeud.Gauche != null || p_noeud.Droite != null)
                {
                    throw new ArgumentException("Noeud incohérent", "p_noeud");
                }
                return(p_noeud.Valeur);

            default:
                throw new InvalidProgramException();
            }
        }