INTERPRÈTEUR DE FORMULE

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 10 août 2005 à 21:16
philheiz Messages postés 117 Date d'inscription mercredi 3 décembre 2003 Statut Membre Dernière intervention 11 octobre 2007 - 1 déc. 2005 à 09:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33169-interpreteur-de-formule

philheiz Messages postés 117 Date d'inscription mercredi 3 décembre 2003 Statut Membre Dernière intervention 11 octobre 2007 1
1 déc. 2005 à 09:26
allez voir:

http://digilander.libero.it/foxes/mathparser/MathExpressionsParser6.htm

il s'agit d'une classe qui à mon sens est vraiment intéressante.
shivhack Messages postés 11 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 6 septembre 2006
4 oct. 2005 à 02:43
slt julien

ton sujet a beaucoup attiré mon attention car je pensais faire la meme chose, mais la complexité de la tache m'a bloqué. J'avais télécharger Mathematica 5.2 et j'ai beaucoup aimé son intérpreteur et il m'a beaucoup inspiré (en fait je te conseille de la télécharger sur réseau P2P comme eMule et Gnutella),par exemple:
-Tu traite les fonctions mathématiques et logiques avec "[" et "]" et tu oblige la première lettre en majuscule .

-Tu traite les intervalle avec <var,from,to>
-Tu utilise un arbre de résolution de formule comme l'as dis Warny (brillante idée, bravo), mais la meilleure façon de le faire est de traiter instantanément chaque bloc trouvé et de vider la mémoire allouée aux valeurs calculés (vider le buffer),mais il faut commencer avec les fonctions puis de s'attarder au variables(fonctions basiques comme +,-,*,/,^,mod,%), exemple:

<x,0,Pi><y,-Pi,Pi>((a^b)*(c*Cos(y)+d*Sin(x)+(78 mod 3))/Log(e,f))
La, tu va traiter comme suit:

1)-Tu déclare une boucle For (par exemple tu peut limiter le nombre par défaut à 8 intervalles) avec deux compteurs: x et y.
2)-dans l'arbre d'intérpretation, tu met tous les noeuds (chaque noeud contient ce qu'il y a dans les parenthèses) sans modification et sans traitement
3)-Puis tu commence par traiter les formules mathèmatiques.
4)-Ensuite les formules logiques.
5)-Et enfin les opérations de base.

Tu peux ajouter beaucoup de structures comme:
#) If. ex: If[expression,true_part,false_part]
#) {} pour les ensembles. ex:{expr1;expr2;expr3}
ou {exp1 And exp2 Or exp3}
{commande1;commande2}
{1,2,4,7,89,100,Pi}

Je te souhaite bonne chance, répond-moi ici pour savoir si tu as reçu mon commentaire.

Enfin, je suis en train un intérpreteur intégrant tou ce que je viends de dire et il sera disponible dès aue possible.

Pour plus d'infos, contactez moi sur: minouche_stingo@hotmail.com
ou: 0021262765427 (Pour les collègues marocains).

Bonn chance à tous. @+
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
11 août 2005 à 23:22
Salut,

Bien, comme je pense utiliser plus tard un interprètateur de formule, pour l'utiliser avec mes fonctions sur les grands nombres (peut-être le tient), je me suis lancé dans la recherche des sources sur vbfrance... Je ne prétend pas avoir tout vu, et je n'ai rien choisi non plus... j'ai recensé tous ceux que j'ai trouvé, c'est tout... De plus, j'ai pas beaucoup regardé du côté des calculatrices, ni des construteurs de courbes qui parfois possèdent un interprètateur...

Voici donc la liste (échantillon), répondant à ta première question :

http://www.vbfrance.com/code.aspx?ID=558
http://www.vbfrance.com/code.aspx?ID=559
http://www.vbfrance.com/code.aspx?ID=1048
http://www.vbfrance.com/code.aspx?ID=1297
http://www.vbfrance.com/code.aspx?ID=1973
http://www.vbfrance.com/code.aspx?ID=2209
http://www.vbfrance.com/code.aspx?ID=6666
http://www.vbfrance.com/code.aspx?ID=6955
http://www.vbfrance.com/code.aspx?ID=7713
http://www.vbfrance.com/code.aspx?ID=8009
http://www.vbfrance.com/code.aspx?ID=8418
http://www.vbfrance.com/code.aspx?ID=8495
http://www.vbfrance.com/code.aspx?ID=19166
http://www.vbfrance.com/code.aspx?ID=20949
http://www.vbfrance.com/code.aspx?ID=27437 *
http://www.vbfrance.com/code.aspx?ID=28412
http://www.vbfrance.com/code.aspx?ID=28590
http://www.vbfrance.com/code.aspx?ID=30368

(* Celui-ci, est original, à mon sens...)

=

Pour ton code, comme je l'avais déjà dit, il me semble, pour ma part bien construit. Donc pas de pb de structure... Si, maintenant je force un peu dans la critique (en toute amitié), je pense que j'essayerai de rassembler les lignes de code similaire dans une fonction. Par exemple, je vois :

Eval = Val(Left(f, InStr(1, f, "*") - 1)) * Val(Right(f, Len(f) - InStr(1, f, "*")))

avec les autres qui suivent, qui ont comme seul différence, le signe... Faire une fonction semble plus indiqué, pour la clarté...

Ensuite dans cette même partie de code, pourrait-on pas utiliser un Select case, plutôt que If ? En effet, l'expression de test InStr(1, f, "*") pourrait être mise dans une variable unique... par exemple, OPERATION = mid... , puis Select case OPERATION ... etc... C'est plus ou moins, ce que tu as fait à la fin du code...

Ensuite, j'ai pas analysé en détail... mais une chose encore me gêne, c'est de voir (en quelque sorte) 3 parties du code qui traitent les mêmes opérations, avec :

If InStr(1, f, "*") > 0 Then ... etc...

Select Case Mid(f, i, 1) .... Case "*" ....

Select Case Oper(1).Op ... Case "*" ....

Pourrait-on pas regrouper plus ou moins tout cela ?

Enfin, voilà c'est juste qlq remarques, j'ai pas regardé en détail le fonctionnement, peut-être que cela n'est pas possible...

Amicalement,
Us.
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
11 août 2005 à 20:56
Merci pour tout... Mais vous avez pas aussi des coms sur ma source en passant ? lol...

Julien.
Olilefou Messages postés 29 Date d'inscription mercredi 1 août 2001 Statut Membre Dernière intervention 9 décembre 2005
11 août 2005 à 20:49
Il y a plusieurs interpréteurs tout prêt, voici un exemple :

Private Sub Form_Load()
' quelques exemples
MsgBox Evaluer("21 / 321 * 3221 - 32 + 343432 / 43243.5454 / 54354 * 345 / (543 - 45 / 43 + 343)")
MsgBox Evaluer("sin(3.14159/4)")
MsgBox Evaluer("now")
MsgBox Evaluer("weekdayname(2, False, vbMonday)")
MsgBox Evaluer("""une longueur : "" & len(""azerty"")")
Unload Me
End Sub

Public Function Evaluer(Exp As String) As String
Dim X As New MSScriptControl.ScriptControl
X.Language = "VBScript"

On Error GoTo E:
Evaluer = X.Eval(Exp)

Exit Function
E:
Evaluer = "Expression invalide."
End Function

Il ne faut pas oublier de référencer 'Microsoft Script Control 1.0'.

Sinon, va voir ici :
http://vbfrance.com/code.aspx?ID=2869

bye.
cs_Pingouin Messages postés 262 Date d'inscription lundi 26 août 2002 Statut Membre Dernière intervention 24 août 2005
11 août 2005 à 13:33
Sans vouloir faire de l'auto-promo j'ai déposé une calculatrice scientifique qui devrait répondre à ton probleme (désolé de n'avoir jms vu tes questions sur le sujet ). Elle gère de nombreuses fonctions mathematiques, les parentheses, les priorités. Peut etre n'est elle pas 100% fiables mais bon ... Tout ca est regroupé dans un module facilement réutilisable et je crois assez bien commenté.
Voila si jamais ca peut t'aider j'en serais heureux mais si c'est seulement quelques bricoles :

http://vbfrance.com/code.aspx?id=6666

@+
Pingouin
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
11 août 2005 à 10:26
J'avais fait la même chose que toi quand la fonction Eval n'existait pas.
Pour les parenthèse je fabriquais un arbre en gros :

(a+b)*(c+d) me donne

(*)
|
+- a+b
|
+- c+d

ensuite je décompose les calculs en fonction de leur priorité toujours en décomposant en arbre.
Ensuite tu descends l'arbre en faisant les calculs.
Renseigne toi sur la notation polonaise. C'est ça qui m'avait donné cette idée
rambc Messages postés 224 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 29 mars 2009
11 août 2005 à 10:14
Pour voir des sources similaires, il suffit de regarder du côté des calculatrices proposées. Tu auras différentes méthodes et niveaux d'efficacité.
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
11 août 2005 à 09:01
Oh Parce que je ne savais pas qu'elle existait ! merci, je vais faire un tour par VBA.

Oui c'est mon premier code sur VBFrance pas mon premier code tout court...

Quant aux autres codes similaires, tu as un exemple à me fournir ? J'avais déjà posé (2X) la question et j'ai pas eu de réponses, j'ai un peu cherché aussi mais j'ai rien trouvé...

Merci pour tes comms..

Bonne Prog

Julien.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
10 août 2005 à 21:45
Oupsss... Lire "Evaluate()" au lieu de Eval()...

Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
10 août 2005 à 21:16
Bonjour,

Quand tu dis : "C'est mon premier code, soyez indulgents". Tu veux dire que c'est ton premier déposé sur VBFrance, car au vu de l'emploi des fonctions utilisées et de la strucutre employée, c'est plus tout à fait du niveau débutant...

Afin, bon, je voulais juste dire que sur ce site, d'autres personnes ont déposé des sources similaires. Cela pourrait peut être intéressant d'étudier les astuces et les structures, pour en retirer les bonnes idées...

Et enfin, je me pose une question. Puisque tu es prêt à utiliser plusieurs application utilisant VB (avec vbscript, comme tu l'expliques), pourquoi ne pas utiliser directement la fonction EVAL() présent dans Excel en VBA, qui réalise exactement la même chose...

Amicalement,
Us.
Rejoignez-nous