EVALUER UNE EXPRESSION MATHֹMATIQUE

TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011 - 14 avril 2011 à 11:43
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011 - 15 mai 2011 à 08:38
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/53058-evaluer-une-expression-math-1465-matique

aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
15 mai 2011 à 08:38
non le frameworks n'est pas inclue, mais impossible de le faire tourner sans celui si... donc pas de probleme.
et quand au fait qu'il change la synctax, ... il faut arettter de rever, tu pense que tout les professionel laisserai faire ?
de plus tu as comme je l'es expliquer la compilation dinamyque qui resoud egalement le probleme.

Pour info j'ai migrer mes projet de VS2002 a 2003 a 2005 a 2008 et enfin 2010 sans aucun probleme ... d'ailleur tu peu encors utiliser dans 2010 des projets enterieur, meme selectionner le framewroks cible dans un environnement plus recent.

Donc peu probable que cela arrive. et meme si sa arrivais qu'un nouveau composant ce pointe, l'ancien pourrait toujours etres utiliser dans des projets recent ...
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
14 mai 2011 à 20:41
Le framework est pas inclus dans ce que tu compiles, si ?
Genre le jour où, lors d'une mise à jour du framework, la syntaxe change, tu dois réécrire tes expressions.
C'est peu susceptible d'arriver dans ce cas-ci, mais l'idée est là
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
13 mai 2011 à 21:40
Je ne comprend pas en quoi tu te retrouve avec une dépendance. La datatable est intégrer au framewors. Alors que ton code nécessitera dans chaqu projet de rajouter ta class.... Perso je trouve moin de dépendance dans une fonction de 3 lignes.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
13 mai 2011 à 16:49
C'est une faute dans le principe pour moi d'utiliser la fonction d'évaluation sql dans ton code, t'introduis de la dépendance dans ton code là où tu peux (donc dois!) t'en passer

Comme ça a déjà été dit ce serait intéressant (et hautement pédagogique ^^) de rendre tout ça plus maniable
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
2 mai 2011 à 15:35
non un arbre que tu developpe, tu cree un class avec des property qui contienne chaque valeur de l'arbre, puis un property qui est un list(of ) de cette class, donc qui peu contenir x sous ensemble.

Ensuite tu doit toujours parser les +,-, .. mais tu sais que ce qui ce trouve en dessou du node ou tu te trouve est un calcul a faire, et le plus petit sous ensemble est juste une valeur, ...

Mais perso si je devais faire sa j'utilisera la compilation dynamique, c'est tres simple
voici un exemple d'une class developper pour le probleme que tu remonte
http://www.developpez.net/forums/d474629/dotnet/general-dotnet/contribuez/source-calcul-formule-compilation-dynamique/

a++
seb
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
2 mai 2011 à 15:25
Salut

le code est peut etre horrible et difficilement maintenable
au moins il calcule juste jusqu'à présent

de tous les codes que j'ai téléchargé pas un ne sait calculer
8^(1/3) ou -8^(1/3) meme le script control donne une
réponse fausse

je n'ai pas trop compris ton idée
ensuite tu te retrouve avec un arbre? comment ça ? arbre binaire ?
et comment vas tu calculer l'expression d'un sous ensemble ?
Bonne prog
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
2 mai 2011 à 14:52
Pour revenir sur la source.
je la trouve effectivement difficilement maintenable.
personnelement j'aurai developper un parseur recursif. Tu boucle sur tout les caractere chaque fois que tu trouve une "(" tu rentre dans un sous ensemble et chaque fois que tu rtouve un ")" tu sort du sous ensemble.
ensuite tu te retrouve avec un arbre pour les parenthese et tu commence par evaluer les object les plus eloigner dans cette arbre.

Chaque fois que tu trouve une chaine string qui n'est pas numeric tu remonte soit un evenement ou un delegate.
l'aventage c'est que si une personne veux ce faire ces propres fonction il peut a tous moment juste modifier dans l'evenement la valeur a retourner et la methode de calcul (et il n'est pas obliger de ce taper tout le code a modifier ou chercher l'endroit exact ou le modifier).
(cette evenement prendrai le nom de la fonction et la valeur deja calculer)

a++
Sébastien
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
2 mai 2011 à 14:33
Non rien du tous, (et apparement les MVP microsoft non plus, vue que c'est l'un d'eu qui m'avais donnée la solution et ce sont quand meme des references ... enfin pour moi ...)

Le Compute d'une datatable fait quoi a ton avis ?
tu as juste a lire la descrition que Visual Studio te propose, "Expression a evalué".
Effectivement cela ce base sur un moteur Sql, c'est pourquoi tu peu utiliser la compilation dynamique si tu souhaite pousser plus loin.

Maintenant j'ai mille fois plus confiance en une equipe de developpement qui a créé cette fonction, qu'en un algo que tu trouve sur le net.
Cela ne veux pas dir que l'on ne doit prendre que des fonction du frameworks pour developper, mais si il n'y a aucune valeur ajouter je prefere rester dans du classique.

Ensuite si c'est pour la "performance artistique" ou pour "l'apprentissage" aucun probleme chacun fait ce qu'il veux.
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
2 mai 2011 à 14:25
j'en reviens a la nature du problème hein plutot que des client et ERP :
Evaluer une expression mathématique

en reponse tu propose un Compute d'une ...DataTable

Y a rien qui te choc ?
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
2 mai 2011 à 14:04
Alors il faudrait que tu m'explique dans quelle context tu as utiliser la compilation dynamique et tu as eu des problemes de memoire ou de performance ...

Perso je l'ai utiliser dans un ERP que je developpe pour un client, il ce retrouve avec des devis qui on une 10 ene de "Systeme", et on doit les raprocher avec des 10 ene "Nomenclature" qui on chaqune des "LigneNomenclature" (environ un 50ene par Nomenclature) qui comporte chacun un algo. Donc pour Chaque system on ce retrouve a faire les calcul sur un bon milier d'algo a compiler dynamiquement.

Cela ce fait tres rapidement (et les algo sont autrement plus complexe qu'un expression) le tout ce fait en qq seconde ...

De plus la compilation dynamique a ete faite pour justement resoudre ce type de problematique (proposer des algos dans le logiciel que tu developpe) ou pour resoudre des probleme de performance (créé l'algo par code pour le compiler au plus juste de la demande et le rendre plus performant ...)

Effectivement je ne suis pas de ceux qui reinvente tout ... surtout si c'est deja fait et bien fait ...
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
2 mai 2011 à 00:49
...
no comment la

Je pense qu'effectivement y a bien une 10aine de moyen comme aserf le montre de faire du code rapidement mais de manière pour le moins HORRIBLE, tant le code n'as pas été designer pour cela, ou bien ne serais ce qu'en terme de perf ou mémoire ...
A force de pas vouloir faire d'effort ou de gagner du temps ...
Enfin bon il parait que je râle trop mais la on atteint des sommets
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
1 mai 2011 à 17:29
Effectivement cela reprend les fonction sql , si tu veux toute les fonction du frameworks, utilise la compilation dynamique, de plus tu poura crée tes propre fonction .
A+
SEB
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
1 mai 2011 à 17:03
Salut
j'ai testé ton code mais les fonctions sin cos etc ^ pour les puissances ne sont pas reconnues
aserf Messages postés 114 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 1 juillet 2011
1 mai 2011 à 15:33
BOnjour,

Beaucoup plus simple et 100% garentie fonctionnel, on ce sers du framework.

''' <summary>
''' Evalue une chaine de caractere "expression mathematique" et retourne sont resultat
''' </summary>
'''

''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Evaluate(ByVal pValue As String) As Object

Dim lRetour As Object

Dim l As New DataTable

lRetour = l.Compute(pValue, "")

l.Dispose()
l = Nothing

Return lRetour

End Function
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
15 avril 2011 à 21:41
Bonjour

Comme le dit ShayW :
"comme j'ai voulu écrire moi meme si on essaye pas on avance pas "

C'est tout à son honneur que d'essayer.
JJDAI
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
15 avril 2011 à 10:14
Mais en CSharp il doit y en avoir des dizaines, il suffit juste de référencer la dll pour l'utiliser en VB .Net. Avec le code source en VB, yen a peut être moins, c'est sûr, mais tout dépend de l'utilisation : si tu as de gros besoins, c'est idiot de redévelopper en VB une grosse librairie, autant reprendre le code en CSharp.
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 avril 2011 à 09:35
en c++ mais pas en vb.net
seulement une en vb.net
http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx
comme j'ai voulu écrire moi meme si on essaye pas on avance
pas
et puis mon application execute bien ce qu'elle est censée de
faire bien que notée 3/10
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
15 avril 2011 à 08:27
Tu n'as rien trouvé en VB .Net ? Il existe pourtant des tas de sources, en tout cas sur d'autres sites :
http://www.codeproject.com/search.aspx?doctypeid=1&q=math+parser
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 avril 2011 à 23:06
Salut JJDAI
Comme j'ai vu qu'il n y avait rien en net le tout en vb6

pour ça j'ai écrit cette application elle n'est pas complete
comme la tienne pas bon tout le monde est parfait

reécris ton projet en dot net pourquoi pas
Bonne prog
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
14 avril 2011 à 19:06
Bonjour
Certes, fait en VB6 mais je pense assez facilement adaptable en dot net:
http://www.vbfrance.com/codes/EVALUATEUR-FORMULES_27437.aspx

Et je pense très complet
JJDAI
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
14 avril 2011 à 15:10
y a pas de built-in existant, il faut que tu l’écrive a la main, ça correspondrait a un fichier de settings qui permettrai d'enrichir les donnée parsé / parsable autant a la reconnaissance qu'a l’exécution.
en définissant un bon schéma xslt, ca te permettrai de gerer une liste des opérateur reconnu, le nombre d’opérande, leur type, leur taille, leur syntaxe, etc ...
Tu peux même gérer ça via MEF (Managed Extensibility Framework, .net 4.0 (ou 3.5 si tu recup via codeplex)), cela permettrai d'importer des assembly avec les codes des parser / executeur à chaud de manière a permettre a un utilisateur lambda de rajouter sa propre bibliothèque de fonction
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 avril 2011 à 14:45
Salut
le fichier help.text c'est bizarre quand je télécharge le zip
et ouvre le fichier il y a bien un text et pas de ??????

ok je vais diviser en module et pas tout en un bloc

Un enorme switch case avec les caractère codé en dur
bah je ne connais pas autrement et pourquoi ce n'est pas efficace les fonctions opérateur etc ne change pas ?

je ne connais pas le mapping via un fichier XML si tu connais
un lien qui explique
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
14 avril 2011 à 11:43
Le fichier "Help.txt" n'est d'aucune aide ....
a part des "?????????????????????????" dedans y a rien (du moins via la visionneuse du site
Merci de le mettre a jour pour toute personne intéressée

Quant au code ...
Mono Bloc
Tout dans un fichier
tout dans une classe
tout dans le code UI, dans le form en plus
Un enorme switch case avec les caractère codé en dur plutot qu'un mapping via un fichier XML char <=> func + param & operand

Private Sub mathexpressiontext_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles mathexpressiontext.KeyUp
If TypeOf (sender) Is TextBox Then
If DirectCast(sender, TextBox).Text <> String.Empty Then
evaluer.Enabled = True
Else
evaluer.Enabled = False
End If
End If
End Sub

....

fonction private => appeler que par ton form donc t'as la maitrise de l'appelant qui en explorant ton code est forcement une textbox, pourquoi faire un "if (type is ...)" ????
ta fonction aurait un scope public ou alors tu code modulaire ... pourquoi pas mais la ... non
Sinon en une ligne ...
evaluer.Enabled = String.IsNullOrEmpty(TaTextBox.Text)

J'ai arrêter la lecture rapidement / pas testé
Code non modulaire ni réutilisable à première vue