Ejemplo n.º 1
0
        public void SqrtTest(double first, double expected)
        {
            IoneCalculate calc   = new sqrt();
            double        result = calc.Calculate(first);

            Assert.AreEqual(expected, result);
        }
Ejemplo n.º 2
0
        private void clic_operateur(object sender, EventArgs e)
        {
            if (enterPressed)   //SI on a appuyé sur entrée avant de taper sur un opérateur, on veut travailler sur le résultat d'une opération précédente
            {
                labelOperation.Text = "";
                enterPressed        = false;
            }

            String text = ((Button)sender).Text;              //On récupère le texte de l'opérateur

            if (text != "(" && text != ")" && text != "sqrt") //Si ce n'est pas une parenthèses ou une racine, alors on ajoute dans le libellé de l'opération la valeur saisie dans le champ résultat
            {
                labelOperation.Text += resultat.Text;

                if (text != "=") //Si c'est un opérateur de type + - * /, on l'ajoute également pour avoir "XVal+"
                {
                    if (racineEnCours)
                    {
                        labelOperation.Text += ")";
                        racineEnCours        = false;
                        nbParentheses--;
                    }
                    labelOperation.Text += text;
                }
            }

            //if (resultat.Text != "" && resultat.Text != "(" && resultat.Text != ")")
            //{
            //    try
            //    {
            //        val.valeur = Decimal.Parse(resultat.Text, System.Globalization.CultureInfo.InvariantCulture);
            //    }
            //    catch (FormatException)
            //    {
            //    }
            //}

            if (resultat.Text != "")
            {
                try
                {
                    val.valeur = Decimal.Parse(resultat.Text, System.Globalization.CultureInfo.InvariantCulture); //On ajoute la valeur saisie dans la variable val, en convertissant la virgule selon la langue du système
                    //Pour éviter les problèmes avec les "." et les ","
                }
                catch (FormatException)
                {
                    resultat.Text = "Erreur format saisie!";
                }
            }

            if (!val.valeur.HasValue)
            {
                //Si malgré les tests précédents, val n'est pas initialisée, alors elle est nulle
                val.valeur = 0;
            }

            switch (text)                       //On commence le traitement de l'opérateur
            {
            case "+":                           //Si c'est une addition
                Operation add = new Addition(); //On crée notre operation tampon

                if (nbParentheses != 0)         //Si on a une parenthèse ouverte
                {
                    if (OpParentheses != null)  //Si une opération est en cours dans les parenthèses
                    {
                        if (OpParentheses is Soustraction)
                        {
                            add.setOperandeA((decimal)val.valeur);
                            OpParentheses = add;
                        }
                        else
                        {
                            if (OpParentheses.getOperandeB() == null)
                            {
                                OpParentheses.setOperandeB((decimal)val.valeur);        //On ajoute seulement si notre opération n'est pas complète (si on vient de fermer une parenthèse, l'opération est déjà remplie)
                            }
                            if (OpParentheses != troncParentheses)
                            {
                                troncParentheses.setOperandeB(OpParentheses.Clone());
                                OpParentheses = troncParentheses;
                            }
                            add.setOperandeA(troncParentheses.Clone());
                            OpParentheses    = add;
                            troncParentheses = OpParentheses;
                        }
                    }
                    else
                    {
                        add.setOperandeA((decimal)val.valeur);
                        troncParentheses = add;
                        OpParentheses    = troncParentheses;
                    }
                }
                else                                                            //Si on a pas de parenthèse ouverte
                {
                    if (OperationEnCours != null)                               //Si une opération est en cours
                    {
                        if (OperationEnCours.getOperandeB() == null)            //Si l'opérandeB n'a pas été remplie (cas d'un calcul sans parenthèses)
                        {
                            OperationEnCours.setOperandeB((decimal)val.valeur); //on ajoute a l'opération en cours l'opérande tapée
                        }
                        if (OperationEnCours != tronc)                          //Si l'opération en cours est avancée dans l'arbre des opérations
                        {
                            tronc.setOperandeB(OperationEnCours.Clone());       //On ajoute l'opération en cours dans l'arbre
                        }
                        add.setOperandeA(tronc.Clone());                        //On ajoute a l'opération tampon l'arbre
                        OperationEnCours = add;                                 //L'opération en cours devient la dernière opération de l'arbre
                        tronc            = OperationEnCours;                    //On avance l'opération dans le tronc pour le calcul final
                    }
                    else
                    {
                        add.setOperandeA((decimal)val.valeur); //Si l'opération est null, on est dans une nouvelle opération
                        OperationEnCours = add;                //L'opération en cours devient l'opération tampon
                        tronc            = OperationEnCours;   //On avance l'opération dans l'arbre
                    }
                }

                break;

            case "-":
                Operation sub = new Soustraction();

                if (nbParentheses != 0)        //Si on a une parenthèse ouverte
                {
                    if (OpParentheses != null) //Si une opération est en cours dans les parenthèses
                    {
                        if (OpParentheses is Soustraction)
                        {
                            sub.setOperandeA((decimal)val.valeur);
                            OpParentheses = sub;
                        }
                        else
                        {
                            if (OpParentheses.getOperandeB() == null)
                            {
                                OpParentheses.setOperandeB((decimal)val.valeur);        //On ajoute seulement si notre opération n'est pas complète (si on vient de fermer une parenthèse, l'opération est déjà remplie)
                            }
                            if (OpParentheses != troncParentheses)
                            {
                                troncParentheses.setOperandeB(OpParentheses.Clone());
                                OpParentheses = troncParentheses;
                            }
                            sub.setOperandeA(troncParentheses.Clone());
                            OpParentheses    = sub;
                            troncParentheses = OpParentheses;
                        }
                    }
                    else
                    {
                        sub.setOperandeA((decimal)val.valeur);
                        troncParentheses = sub;
                        OpParentheses    = troncParentheses;
                    }
                }
                else                                                            //Si on a pas de parenthèse ouverte
                {
                    if (OperationEnCours != null)                               //Si une opération est en cours
                    {
                        if (OperationEnCours.getOperandeB() == null)            //Si l'opérandeB n'a pas été remplie (cas d'un calcul sans parenthèses)
                        {
                            OperationEnCours.setOperandeB((decimal)val.valeur); //on ajoute a l'opération en cours l'opérande tapée
                        }
                        if (OperationEnCours != tronc)                          //Si l'opération en cours est avancée dans l'arbre des opérations
                        {
                            tronc.setOperandeB(OperationEnCours.Clone());       //On ajoute l'opération en cours dans l'arbre
                        }
                        sub.setOperandeA(tronc.Clone());                        //On ajoute a l'opération tampon l'arbre
                        OperationEnCours = sub;                                 //L'opération en cours devient la dernière opération de l'arbre
                        tronc            = OperationEnCours;                    //On avance l'opération dans le tronc pour le calcul final
                    }
                    else
                    {
                        sub.setOperandeA((decimal)val.valeur); //Si l'opération est null, on est dans une nouvelle opération
                        OperationEnCours = sub;                //L'opération en cours devient l'opération tampon
                        tronc            = OperationEnCours;   //On avance l'opération dans l'arbre
                    }
                }

                break;

            case "*":
                Operation mul = new Multiplication();

                if (nbParentheses != 0)
                {
                    if (OpParentheses != null)
                    {
                        if (OpParentheses is Addition || OpParentheses is Soustraction)
                        {
                            mul.setOperandeA((decimal)val.valeur);
                            OpParentheses = mul;
                        }
                        else
                        {
                            if (OperationEnCours.getOperandeB() == null)                //Si l'opérandeB n'a pas été remplie (cas d'un calcul sans parenthèses)
                            {
                                OperationEnCours.setOperandeB((decimal)val.valeur);     //on ajoute a l'opération en cours l'opérande tapée
                            }
                            if (OpParentheses != troncParentheses)
                            {
                                troncParentheses.setOperandeB(OpParentheses.Clone());
                                OpParentheses = troncParentheses;
                            }
                            mul.setOperandeA(troncParentheses.Clone());
                            OpParentheses    = mul;
                            troncParentheses = OpParentheses;
                        }
                    }
                    else
                    {
                        mul.setOperandeA((decimal)val.valeur);
                        troncParentheses = mul;
                        OpParentheses    = troncParentheses;
                    }
                }
                else
                {
                    if (OperationEnCours != null)
                    {
                        if (OperationEnCours is Addition || OperationEnCours is Soustraction)
                        {
                            mul.setOperandeA((decimal)val.valeur);
                            OperationEnCours = mul;
                        }
                        else
                        {
                            if (OperationEnCours.getOperandeB() == null)                //Si l'opérandeB n'a pas été remplie (cas d'un calcul sans parenthèses)
                            {
                                OperationEnCours.setOperandeB((decimal)val.valeur);     //on ajoute a l'opération en cours l'opérande tapée
                            }
                            if (OperationEnCours != tronc)
                            {
                                tronc.setOperandeB(OperationEnCours.Clone());
                                OperationEnCours = tronc;
                            }
                            mul.setOperandeA(tronc.Clone());
                            OperationEnCours = mul;
                            tronc            = OperationEnCours;
                        }
                    }
                    else
                    {
                        mul.setOperandeA((decimal)val.valeur);
                        tronc            = mul;
                        OperationEnCours = tronc;
                    }
                }

                break;

            case "/":
                Operation div = new Division();


                if (nbParentheses != 0)                                                 //Une parenthèse est ouverte
                {
                    if (OpParentheses != null)                                          //Une opération est en cours dans les parenthèses
                    {
                        if (OpParentheses is Addition || OpParentheses is Soustraction) //si l'opération présente dans les parenthèses est une Addition ou Soustraction
                        {
                            div.setOperandeA((decimal)val.valeur);                      //On ajoute la division avant, pour qu'elle soit prioritaire
                            OpParentheses = div;                                        //
                        }
                        else
                        {
                            OpParentheses.setOperandeB((decimal)val.valeur);
                            if (OpParentheses != troncParentheses)
                            {
                                troncParentheses.setOperandeB(OpParentheses.Clone());
                                OpParentheses = troncParentheses;
                            }
                            div.setOperandeA(troncParentheses.Clone());
                            OpParentheses    = div;
                            troncParentheses = OpParentheses;
                        }
                    }
                    else
                    {
                        div.setOperandeA((decimal)val.valeur);
                        troncParentheses = div;
                        OpParentheses    = troncParentheses;
                    }
                }
                else
                {
                    if (OperationEnCours != null)
                    {
                        if (OperationEnCours is Addition || OperationEnCours is Soustraction)
                        {
                            div.setOperandeA((decimal)val.valeur);
                            OperationEnCours = div;
                        }
                        else
                        {
                            OperationEnCours.setOperandeB((decimal)val.valeur);
                            if (OperationEnCours != tronc)
                            {
                                tronc.setOperandeB(OperationEnCours.Clone());
                                OperationEnCours = tronc;
                            }
                            div.setOperandeA(tronc.Clone());
                            OperationEnCours = div;
                            tronc            = OperationEnCours;
                        }
                    }
                    else
                    {
                        div.setOperandeA((decimal)val.valeur);
                        tronc            = div;
                        OperationEnCours = tronc;
                    }
                }

                break;

            case "(":
                if (racineEnCours)
                {
                    return;
                }
                nbParentheses++;
                labelOperation.Text += "(";

                break;

            case ")":

                if (nbParentheses > 0)      //Si on a une parenthèse ouverte
                {
                    nbParentheses--;        //On peut la fermer
                    if (racineEnCours)
                    {
                        racineEnCours = false;
                    }

                    if (OpParentheses != null)                                                       //Si l'opération entre parenthèses n'est pas null
                    {
                        if (labelOperation.Text[labelOperation.Text.Length - 1].CompareTo(')') == 0) //Si on a saisie une parenthèse fermante juste après une autre parenthèse fermante
                        {
                            Addition tmp = new Addition(); tmp.setOperandeA(OpParentheses.Clone()); tmp.setOperandeB(new Valeur(0)); OpParentheses = tmp; val.valeur = null;
                        }
                        if ((val != null && val.valeur.HasValue))       //Si on a une valeur en cours de saisie
                        {
                            if (OpParentheses.getOperandeB() == null)
                            {
                                OpParentheses.setOperandeB((decimal)val.valeur); //alors on peut la stocker dans l'opérandeB de l'opération en cours
                            }
                            labelOperation.Text += resultat.Text;                //Et on l'ajoute au libellé de l'opération
                        }

                        if (troncParentheses != null)   //Si l'arbre existe
                        {
                            if (nbParentheses == 0)     //Si on vient de fermer la dernière parenthèse
                            {
                                //if (troncParentheses.getOperandeB() == null)    //Si l'OperandeB de l'arbre n'est pas définie
                                //    troncParentheses.setOperandeB(OpParentheses.Clone());   //On y stock l'opération en cours
                                if (OpParentheses != troncParentheses)
                                {
                                    if (troncParentheses.getOperandeB() == null)
                                    {
                                        troncParentheses.setOperandeB(OpParentheses.Clone());
                                        OpParentheses = troncParentheses;
                                    }
                                    else
                                    {
                                        troncParentheses = OpParentheses;
                                    }
                                }

                                if (OperationEnCours != null)     //Il faut remettre l'arbre des parenthèses dans l'arbre global
                                {
                                    if (OperationEnCours.getOperandeB() == null)
                                    {
                                        OperationEnCours.setOperandeB(troncParentheses.Clone());
                                    }
                                }
                                else
                                {
                                    OperationEnCours = troncParentheses.Clone();
                                    if (tronc == null)
                                    {
                                        tronc = OperationEnCours;
                                    }
                                }
                                troncParentheses = null;
                                OpParentheses    = null;
                            }
                        }
                        else
                        {
                            if (nbParentheses == 0)
                            {
                                OperationEnCours = OpParentheses.Clone();
                                if (tronc == null)
                                {
                                    tronc = OperationEnCours;
                                }
                            }
                        }
                    }
                    else
                    {
                        OperationEnCours = troncParentheses.Clone();
                        if (tronc == null)
                        {
                            tronc = OperationEnCours;
                        }
                    }
                    //OpParentheses = null;

                    labelOperation.Text += ")";
                }

                break;

            case "sqrt":
                Operation sqrt = new sqrt();

                if (val != null && val.valeur.HasValue)
                {
                    labelOperation.Text += "sqrt(" + val.valeur;
                    nbParentheses++;
                    racineEnCours = true;

                    if (nbParentheses != 0)     //Si on a une parenthèse ouverte
                    {
                        sqrt.setOperandeA((decimal)val.valeur);
                        if (OpParentheses != null)      //Si une opération est en cours dans les parenthèses
                        {
                            if (OpParentheses.getOperandeB() == null)
                            {
                                OpParentheses.setOperandeB(sqrt);        //On ajoute seulement si notre opération n'est pas complète (si on vient de fermer une parenthèse, l'opération est déjà remplie)
                            }
                            if (OpParentheses != troncParentheses)
                            {
                                troncParentheses.setOperandeB(OpParentheses.Clone());
                                OpParentheses = troncParentheses;
                            }
                        }
                        else
                        {
                            troncParentheses = sqrt;
                            OpParentheses    = troncParentheses;
                        }
                    }
                }

                break;

            case "=":
                if (nbParentheses != 0)
                {
                    resultat.Text = "Parenthesis!";
                    return;
                }
                if (tronc != null)
                {
                    if (OperationEnCours != null && tronc.getOperandeA() != null)
                    {
                        if (OperationEnCours.getOperandeB() == null)
                        {
                            OperationEnCours.setOperandeB((decimal)val.valeur);
                        }

                        if (OperationEnCours != tronc)
                        {
                            tronc.setOperandeB(OperationEnCours.Clone());
                            OperationEnCours = tronc;
                        }
                        resultat.Text = tronc.calculerOperation().ToString(System.Globalization.CultureInfo.InvariantCulture);
                        val.valeur    = null;
                        tronc.setOperandeA(tronc.Clone());
                    }
                    else
                    {
                        if (val.valeur.HasValue)
                        {
                            resultat.Text = val.valeur.ToString();
                        }
                    }

                    OperationEnCours = null;
                    enterPressed     = true;
                    if (racineEnCours)
                    {
                        racineEnCours = false;
                    }

                    return;
                }

                break;
            }
            resultat.Clear();
            val.valeur = null;
        }