Bonjour,
Je voudrais vous faire partager mon interpréteur d'expression personnel mais c'est un code C++ dont voici ce qu'il est capable de faire.
Dans sa première version c'était un code pur C++ standard, mais j'avais perdu les sources.Vous pouvez saisir une expression de type fonction comme : f ( x , y ) = x ^ 2 + sin ( y )
ou bien g ( x , y , z ) = x / sqrt( 1 + y ^ 3 + ln ( 5 * z ) )
ou encore v ( t ) = r * sin( w * t + k )
où les variables r, w et k sont préalablement définis comme des expressions de type variable du genre
r = sqrt( 2 / pi ), w = 15, k = e^( -10 ) avec pi et e des constantes
déjà reconnus comme constantes standards de 3.1415927... et 2.718182...
(vous n'avez pas à les définir.)
Vous pouvez saisir des fonctions de fonctions comme : h ( x ) = f( x - 1 , x + 1 ) + r * pi * sin( g( x + 1 , x ^ 2 , -x ) + pi / 4 )
où f() et g() sont préalablement définis tel que ci-haut.
Alors j'ai refais un code plus propre et plus puissant capable d'analyser une expression avant son évaluation et gérant le mécanisme d'exception. Elle peut également évaluer des expressions avec nombres complexes tel que des z = a + b*i ou bien des 3 + 4i.
J'ai profiter de la souplesse qu'offre la classe CString pour la manipulation des chaînes ce qui suppose qu'elle demande la présence des MFC.
Voici la hiérarchie de mes principales classes templates
Voici un code simple d'utilisation :CMcnExpression<T> : comprend toutes les expressions élémentaires de bases et définit et maintient une table des expressions globales.
CMcnLexical<T> : se charge de faire l'analyse lexicale d'une expression et de donner la nature de chaque symbole. Elle dérive de la précédente classe.
CMcnSyntaxic<T> : se charge de faire l'analyse syntaxique d'une expression et de savoir si elle est correctement écrite avec toute les imbrications, les références et les récursivités possibles entrées fonctions ou variables. Elle dérive de la précédente classe.
CMcnVariable<T> : c'est l'objet variable proprement dite comme dans une expression simple comme "x = 2 / 3 + sqrt(pi)". Elle dérive de la précédente classe CMcnSyntaxic<T>.
CMcnFunction<T> : c'est l'objet fonction proprement dite comme dans une expression comme "P(x) = x^5 + 3 * x ^ 4 + 2". Elle dérive de la précédente classe CMcnSyntaxic<T>.
Voici un code peu complexe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 MCN::Math::CFunction g; if ( g.SetFunction("P(x) = x^5 + 3 * x ^ 4 + 2") ) { double res = g(1); res = g(3.2); res = g(23.345); }
Toutes ces expressions peuvent être des input faits par l'utilisateur.
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 MCN::Math::CFunction g; g.SetFunction("B(x) = x^5 + 3 * x ^ 4 + 2"); // une exception est lancé en cas d'erreur MCN::Math::CVariable v1; v1.SetVariable("A = sqrt(pi / 2) + 1"); MCN::Math::CVariable v2; v2.SetVariable("W = 2 * pi"); MCN::Math::CFunction f; f.SetFunction("f(t) = A * sin ( W * t + B(t) )"); double res = f(0); // au temps t = 0 res = f(2.5); // au temps t = 2.5s res = f(10); // au temps t = 10s
On peut même créer sa propre calculatrice performante et tracer des courbes et des surfaces.
Je vous envoie les sources. La version de mon Visual Studio est 2008
Il s'agit d'une dll, Mcn.Math.dll, vous la compilez. Mais vous devez changer quelques paramètres du projet pour que la compilation passe.
Vous n'avez besoin que d'un seul fichier header "Mcn.Math.h" qui comprend tous les fichiers en têtes dont vous avez besoin. Ainsi que de sa librairie Mcn.Math.lib
Partager