IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Parseur de formule


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Parseur de formule
    Bonjour,
    Depuis quelques mois je m'amuse à créer un parseur qui prend une chaine de caractère en entrée (la formule mathématique) et qui me retourne le délégué associé à cette formule mais en vain.
    Je vous met ci dessous le programme tel qu'il est actuellement, il ne bug pas mais ne retourne pas le bon résultat ... J'ai lu sur certain forum que parfois les délégués ne tiennent pas compte de l'ordre dans laquelle les méthodes sont "pointées" (ajouté dans le délégué) mais je ne pense pas que l'erreur vienne de la...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     public class Parseur
        {
            public int parenthesesuivante(List<string> formule)
            {
                int c = 0;
                for (int i = 0; i < formule.Count; i++)
                {
                    if (formule[i] == "(") { c++; }
                    if (formule[i] == ")") { c--; }
                    if (c == 0) { return i; }
                }
                return formule.Count;
            }
            public delegate double fonction(double x);
            public bool parentheseok(string a)
            {
                int c = 0;
                foreach (char i in a)
                {
                    if (i == '(') { c++; }
                    else if (i == ')') { c--; }
                    if (c < 0) { return false; }
                }
                return c == 0;
            }
            public List<string> decoupeformule(string formule)
            {
                List<string> formuledecoupe = new List<string>();
                int a = 0;
                if (parentheseok(formule))
                {
                    for (int i = 0; i < formule.Length; i++)
                    {
                        if (formule[i] == '(' || formule[i]==')' || formule[i]=='*' || formule[i]=='/' || formule[i]=='-' || formule[i]=='+' || formule[i]=='^' || formule[i]=='x') 
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add(formule[i].ToString());
                            a = i + 1;
                        }
                        else if (formule[i] == 'c' && formule.Length < i + 2 && formule[i + 1] == 'o' && formule[i + 2] == 's')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add("cos");
                            a = i + 2;
                        }
                        else if (formule[i] == 's' && formule.Length < i + 2 && formule[i + 1] == 'i' && formule[i + 2] == 'n')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add("sin");
                            a = i + 2;
                        }
                        else if (formule[i] == 't' && formule.Length < i + 2 && formule[i + 1] == 'a' && formule[i + 2] == 'n')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); } 
                            formuledecoupe.Add("tan");
                            a = i + 2;
                        }
                    }
                }
                string fin = formule.slice(a, formule.Count());
                if (fin != "") { formuledecoupe.Add(fin); }
                return formuledecoupe;
            }
            public fonction create(List<string> formule)
            {
                string tamponfonction ="";
                double tamponnombre;
                fonction f;
                f = x => 0;
                if (double.TryParse(formule[0], out tamponnombre))
                {
                    f = x => tamponnombre;
                }
                else if (formule[0] == "-")
                {
                    tamponfonction = "-";
                }
                else if (formule[0] == "x")
                {
                    f = x => x;
                }
                else if (formule[0] == "*" || formule[0] == "/" || formule[0] == "^") { Console.WriteLine("Erreur !!"); return x => -1; }
                else if (formule[0] == "cos")
                {
                    f = x => Math.Cos(create(formule.slice(1,parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule),formule.Count);
                }
                else if (formule[0] == "sin")
                {
                    f = x => Math.Sin(create(formule.slice(1, parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule), formule.Count);
                }
                else if (formule[0] == "tan")
                {
                    f = x => Math.Tan(create(formule.slice(1, parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule), formule.Count);
                }
     
                for (int i = 1; i < formule.Count; i++)
                {
                    fonction tampon = f;
                    if (double.TryParse(formule[i], out tamponnombre))
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + tamponnombre; }
                        else if (tamponfonction == "-") { f = x => tampon(x) - tamponnombre; }
                        else if (tamponfonction == "*") { f = x => tampon(x) * tamponnombre; }
                        else if (tamponfonction == "/") { f = x => tampon(x) / tamponnombre; }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), tamponnombre); }
                    }
                    else if (formule[i] == "x")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + x; }
                        else if (tamponfonction == "-") { f = x => tampon(x) - x; }
                        else if (tamponfonction == "*") { f = x => tampon(x) * x; }
                        else if (tamponfonction == "/") { f = x => tampon(x) / x; }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), x); }
                    }
                    else if (formule[i] == "(")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + create(formule.slice(i+1,parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - create(formule.slice(i+1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * create(formule.slice(i+1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / create(formule.slice(i+1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), create(formule.slice(i+1, parenthesesuivante(formule)))(x)); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "+" || formule[i] == "-" || formule[i] == "*" || formule[i] == "^" || formule[i] == "/")
                    {
                        tamponfonction = formule[i];
                    }
                    else if (formule[i] == "cos")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "sin")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "tan")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                }
                return f;
            }
        }
    Je pense que le problème vien de la méthode create mais j'ai laissé le reste du code pour la compréhension.
    La fonction slice récupère une partie de la liste, le premier élément étant inclus et le dernier exclu.
    Merci d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Up
    Hello,
    Après avoir fait plusieurs test je me suis rendue compte que le programme gardait le délégué de la première formule que j'avais rentré, ce serait donc un conflit ou le délégué ne serait pas recalculé à chaque lancement du programme ce que je ne comprend pas.
    Je vous met ci joint le code entier y compris le main et la fonction slice pour que vous puissiez le testé, il reste encore un problème avec les priorités de calcul sur lequel je travail mais si il pouvait déjà fonctionner en supposant qu'il n'y a pas de priorité de calcul ce serait super.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    class Program
        {
            static void Main(string[] args)
            {
                string formule = "10*x+3";
                Parseur pars = new Parseur();
                List<string> formuledecoupe = pars.decoupeformule(formule);
                Console.WriteLine(pars.create(formuledecoupe)(10));
                Console.ReadKey();
            }
        }
    public class Parseur
        {
            public int parenthesesuivante(List<string> formule)
            {
                int c = 0;
                for (int i = 0; i < formule.Count; i++)
                {
                    if (formule[i] == "(") { c++; }
                    if (formule[i] == ")") { c--; }
                    if (c == 0) { return i; }
                }
                return formule.Count;
            }
            public delegate double fonction(double x);
            public bool parentheseok(string a)
            {
                int c = 0;
                foreach (char i in a)
                {
                    if (i == '(') { c++; }
                    else if (i == ')') { c--; }
                    if (c < 0) { return false; }
                }
                return c == 0;
            }
            public List<string> decoupeformule(string formule)
            {
                List<string> formuledecoupe = new List<string>();
                int a = 0;
                if (parentheseok(formule))
                {
                    for (int i = 0; i < formule.Length; i++)
                    {
                        if (formule[i] == '(' || formule[i] == ')' || formule[i] == '*' || formule[i] == '/' || formule[i] == '-' || formule[i] == '+' || formule[i] == '^' || formule[i] == 'x')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add(formule[i].ToString());
                            a = i + 1;
                        }
                        else if (formule[i] == 'c' && formule.Length < i + 2 && formule[i + 1] == 'o' && formule[i + 2] == 's')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add("cos");
                            a = i + 2;
                        }
                        else if (formule[i] == 's' && formule.Length < i + 2 && formule[i + 1] == 'i' && formule[i + 2] == 'n')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add("sin");
                            a = i + 2;
                        }
                        else if (formule[i] == 't' && formule.Length < i + 2 && formule[i + 1] == 'a' && formule[i + 2] == 'n')
                        {
                            string s = formule.slice(a, i);
                            if (s != "") { formuledecoupe.Add(s); }
                            formuledecoupe.Add("tan");
                            a = i + 2;
                        }
                    }
                }
                string fin = formule.slice(a, formule.Count());
                if (fin != "") { formuledecoupe.Add(fin); }
                return formuledecoupe;
            }
            public fonction create(List<string> formule)
            {
                string tamponfonction = "";
                double tamponnombre;
                fonction f;
                f = x => 0;
                if (double.TryParse(formule[0], out tamponnombre))
                {
                    f = x => tamponnombre;
                }
                else if (formule[0] == "-")
                {
                    tamponfonction = "-";
                }
                else if (formule[0] == "x")
                {
                    f = x => x;
                }
                else if (formule[0] == "*" || formule[0] == "/" || formule[0] == "^") { Console.WriteLine("Erreur !!"); return x => -1; }
                else if (formule[0] == "cos")
                {
                    f = x => Math.Cos(create(formule.slice(1, parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule), formule.Count);
                }
                else if (formule[0] == "sin")
                {
                    f = x => Math.Sin(create(formule.slice(1, parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule), formule.Count);
                }
                else if (formule[0] == "tan")
                {
                    f = x => Math.Tan(create(formule.slice(1, parenthesesuivante(formule)))(x));
                    formule = formule.slice(parenthesesuivante(formule), formule.Count);
                }
     
                for (int i = 1; i < formule.Count; i++)
                {
                    fonction tampon = f;
                    if (double.TryParse(formule[i], out tamponnombre))
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + tamponnombre; }
                        else if (tamponfonction == "-") { f = x => tampon(x) - tamponnombre; }
                        else if (tamponfonction == "*") { f = x => tampon(x) * tamponnombre; }
                        else if (tamponfonction == "/") { f = x => tampon(x) / tamponnombre; }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), tamponnombre); }
                    }
                    else if (formule[i] == "x")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + x; }
                        else if (tamponfonction == "-") { f = x => tampon(x) - x; }
                        else if (tamponfonction == "*") { f = x => tampon(x) * x; }
                        else if (tamponfonction == "/") { f = x => tampon(x) / x; }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), x); }
                    }
                    else if (formule[i] == "(")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + create(formule.slice(i + 1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - create(formule.slice(i + 1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * create(formule.slice(i + 1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / create(formule.slice(i + 1, parenthesesuivante(formule)))(x); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "+" || formule[i] == "-" || formule[i] == "*" || formule[i] == "^" || formule[i] == "/")
                    {
                        tamponfonction = formule[i];
                    }
                    else if (formule[i] == "cos")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "sin")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                    else if (formule[i] == "tan")
                    {
                        if (tamponfonction == "+") { f = x => tampon(x) + Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "-") { f = x => tampon(x) - Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "*") { f = x => tampon(x) * Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "/") { f = x => tampon(x) / Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x)); }
                        else if (tamponfonction == "^") { f = x => Math.Pow(tampon(x), Math.Cos(create(formule.slice(i + 1, parenthesesuivante(formule)))(x))); }
                        i = parenthesesuivante(formule);
                    }
                }
                return f;
            }
        }
    public static class Extension
        {
            public static List<string> slice(this List<string> source, int a, int b)
            {
                List<string> s = new List<string>();
                for (int i = a; i < b; i++)
                {
                    s.Add(source[i]);
                }
                return s;
            }
            public static string slice(this string source, int a, int b)
            {
                string s = "";
                for (int i = a; i < b; i++)
                {
                    s += source[i].ToString();
                }
                return s;
            }
        }

Discussions similaires

  1. Parseur formule Excel <-> Code VBA
    Par gretch dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/08/2007, 19h08
  2. [Crystal] Formules ...
    Par Antichoc dans le forum Formules
    Réponses: 3
    Dernier message: 25/11/2003, 11h52
  3. [Formule] Lever et coucher du soleil
    Par psl dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2002, 17h37
  4. [reseaux] Comment creer un compte user à partir d'un formul avec perl
    Par oulai_evado dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 01/10/2002, 20h54
  5. Réponses: 3
    Dernier message: 04/09/2002, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo