65 votes

Évaluation des expressions arithmétiques à partir d'une chaîne en C++

Je recherche un moyen simple d'évaluer une expression mathématique simple à partir d'une chaîne, comme celle-ci :

3*2+4*1+(4+9)*6

Je veux juste les opérations + et * plus les signes ( et ) . Et * a plus de priorité que + .

54voto

Monir Points 1074

On peut essayer : http://partow.net/programming/exprtk/index.html

  1. très simple
  2. seulement besoin d'inclure "exprtk.hpp" à votre code source.
  3. vous pouvez modifier dynamiquement la valeur des variables de l'expression.
  4. bon point de départ : http://partow.net/programming/exprtk/code/exprtk_simple_example_01.cpp

38voto

Henrik Points 16565

Je pense que vous cherchez un simple analyseur de descente récursive .

Voici un exemple très simple :

 const char * expressionToParse = "3*2+4*1+(4+9)*6";

char peek()
{
    return *expressionToParse;
}

char get()
{
    return *expressionToParse++;
}

int expression();

int number()
{
    int result = get() - '0';
    while (peek() >= '0' && peek() <= '9')
    {
        result = 10*result + get() - '0';
    }
    return result;
}

int factor()
{
    if (peek() >= '0' && peek() <= '9')
        return number();
    else if (peek() == '(')
    {
        get(); // '('
        int result = expression();
        get(); // ')'
        return result;
    }
    else if (peek() == '-')
    {
        get();
        return -factor();
    }
    return 0; // error
}

int term()
{
    int result = factor();
    while (peek() == '*' || peek() == '/')
        if (get() == '*')
            result *= factor();
        else
            result /= factor();
    return result;
}

int expression()
{
    int result = term();
    while (peek() == '+' || peek() == '-')
        if (get() == '+')
            result += term();
        else
            result -= term();
    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{

    int result = expression();

    return 0;
}

17voto

IsaacH Points 200

Juste pour ajouter une autre alternative, envisagez d'essayer TinyExpr pour ce problème. Il est open source et autonome dans un fichier de code source. Il est en fait écrit en C, mais il se compilera proprement en C++ d'après mon expérience.

Résoudre votre exemple d'expression ci-dessus est aussi simple que :

 #include "tinyexpr.h"
#include <stdio.h>

int main()
{
    double answer = te_interp("3*2+4*1+(4+9)*6", 0);
    printf("Answer is %f\n", answer);
    return 0;
}

1voto

Yury Points 769

En cherchant une bibliothèque pour une tâche similaire, j'ai trouvé libmatheval . Cela semble être une bonne chose. Malheureusement, GPL, ce qui est inacceptable pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X