us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
10 août 2005 à 21:16
philheiz
Messages postés117Date d'inscriptionmercredi 3 décembre 2003StatutMembreDernière intervention11 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.
il s'agit d'une classe qui à mon sens est vraiment intéressante.
shivhack
Messages postés11Date d'inscriptionmardi 4 octobre 2005StatutMembreDerniè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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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 :
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 :
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és883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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és29Date d'inscriptionmercredi 1 août 2001StatutMembreDerniè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'.
cs_Pingouin
Messages postés262Date d'inscriptionlundi 26 août 2002StatutMembreDernière intervention24 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 :
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és224Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention29 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és883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 10 août 2005 à 21:45
Oupsss... Lire "Evaluate()" au lieu de Eval()...
Us.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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...
1 déc. 2005 à 09:26
http://digilander.libero.it/foxes/mathparser/MathExpressionsParser6.htm
il s'agit d'une classe qui à mon sens est vraiment intéressante.
4 oct. 2005 à 02:43
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. @+
11 août 2005 à 23:22
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.
11 août 2005 à 20:56
Julien.
11 août 2005 à 20:49
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.
11 août 2005 à 13:33
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
11 août 2005 à 10:26
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
11 août 2005 à 10:14
11 août 2005 à 09:01
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.
10 août 2005 à 21:45
Us.
10 août 2005 à 21:16
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.