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 +
.
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 +
.
On peut essayer : http://partow.net/programming/exprtk/index.html
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;
}
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;
}
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 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.