EVALUATEUR D'EXPRESSION MATHÉMATIQUE (PARENTHESE, PUISSANCE, MODULO, +-*/)

pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005 - 17 juil. 2004 à 00:57
flav720 Messages postés 1 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 4 septembre 2006 - 4 sept. 2006 à 00:20
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/24627-evaluateur-d-expression-mathematique-parenthese-puissance-modulo

flav720 Messages postés 1 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 4 septembre 2006
4 sept. 2006 à 00:20
Bravo FFERT,
Et merci de penser à ceux qui programment en autoditacte et dont ce n'est pas le métier, perso pour mon projet j'ai gagné un temps considérable car ta source correspond exactement à mes besoins... Note pour ma part : 15/20. A+
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
27 nov. 2004 à 12:53
Il faudrait vraiment être fou pour affirmer que cette MAJ fonctionne. Je vois mal où est la pleine fonctionnalité que présupposent les descriptions.

1) Dans le cas où il y a des contraintes de syntaxe, il faut implémenter un correcteur de syntaxe. C'est d'ailleurs ce que je ferai sur mon ID=20662.
2) ln{2}=ln2 Woaa!!
3) Que disais-je à propos du var ?
4) Pourquoi un TObject survient-il ? Je mets un NIL en paramètre pour ignorer.
5) Incohérence dans l'explication finale: parenthèses, vraiment ??
6) Il faudrait implémenter un ZIP. Ca évitera de perdre du temps déjà si précieux, ou de se tromper dans les commentaires parce que le source a été manipulé comme il ne faudrait pas.

Sinon, quand c'est voté, c'est voté. Il faudra compter sur les nouveaux visiteurs. C'est bête ça d'ailleurs de ne pas pouvoir corriger un vote. Faudra avertir Nix !! S'il nous regarde...

Donc, voilà. Sans vouloir être méchant, c'est vraiment toujours très étrange. Cependant, il est vrai qu'il y a eu de bonnes modifications. J'accorde donc virtuellement un bonus. :)
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
26 nov. 2004 à 17:44
CA Y EST, voilà la dernière version qui fonctionne !!!

(avant que vous ne trouviez d'autres Bugs !! :)) )

Comme elle fait parti d'un grand projet : pensez à utiliser les {} au lieu des () dans vos expressions à évaluer. ou bien remplacer dans ma source les {} par des ()... au choix.

J'ai volontairement désactiver 2 zones : gestion des variables et exécution de fonctions spéciales, car la source aurait été trop volumineuse....
Mais vous retrouverez tous ceci lors de la publication du projet complet...

Merci à bientôt... si vous avez des commentaires n'hésitez pas....

Au fait xoleras, je connais pas Free Pascal, mais je n'ai rien utilisé de spécial dans cette source...

Bon utilisation de ce code !!! (PS : si cette nouvelle mouture vous convient mieux : faite remonter la note ça marque mal !!!) :)))))))))))

bye
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
26 nov. 2004 à 08:42
Ok Merci à tous pour ces commentaires...

Je vais essayer d'en tenir compte et d'y remédier...

En fait depuis que je l'ai posté, j'ai été obligé de modifier ce code... Mais je ne l'ai pas remis à jour ici !!! désolé...

Car cela fait parti d'un projet de plus grande envergure !!!! Un générateur d'application base de données !!! (avec le quel on peut faire n'importe quel type d'application sans recompiler une seule ligne !!!)... Donc désolé par manque de temps j'ai pas fait de mise à jour... J'essayerai de l'exécuter rapidement... Mais de toute façon je vais probablement publier mon projet ici... Donc...

Merci encore, à bientôt..
xoleras Messages postés 2 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 21 novembre 2004
21 nov. 2004 à 07:35
Votre évaluateur ne fonctionne pas sous Free Pascal (100% compatible Delphi)

Expressions unaires (du type '-25', '666'): OK

Autres expressions: plantage avec un message d'erreur vide.
xoleras Messages postés 2 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 21 novembre 2004
21 nov. 2004 à 05:40
- Ne fonctionne pas sous Free Pascal
- Plante à l'évaluation de 1+125+(25-36)

Conclusion: à revoir.
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
24 juil. 2004 à 22:33
J'ai quelques remarques, ainsi que quelques pistes de réflexion.

1) Je supprimerai le VAR de <EvalExpression>. C'est inutile et cela empêche d'avoir des syntaxes du type <EvalExpression('2+3')>

2) Dans ce genre de codes source, les signes "-" sont extrêmement perturbateurs, car ils désignent soit un signe, soit un opérateur. De ce fait, il se produit des erreurs et on se demande parfois même s'il y a eu calcul. Voici des exemples d'erreurs, parmi d'autres:
"-(-0,1-2)" donne "--0,1-2"
"-2+1" donne "-3"
"ln(2)" donne "ln0"
"3-(4-3*4)" donne "PLANTAGE"
"5+(-2)" donne "PLANTAGE"

Par ailleurs, d'autres codes de ce type ont déjà été postés (par ordre ID):
ID=2171: performant, très rapide, deboguage, fragile face aux erreurs et exceptions
ID=20662: le mien, contraignant, fonctionnel mais obsolète pour mes besoins, fragile face aux erreurs et exceptions

Mon 20662 marche tellement bizarrement que j'ai refait un analyseur absolument génial. Mais il faut faire une remarque importante: ZED, FFERT et mon ancien code source manipulent des String, ce qui est à mon goût une très bonne idée, mais qui reste très difficile à gérer et à mettre en oeuvre, car le signe "-" peut se combiner avec d'autres signes qui l'entourent. C'est pourtant la méthode la plus rapide pour l'exécution. Lors du développement, un signe + ou - mal placé fiche tout en l'air.

Pour éviter ces ennuis, mon nouvel analyseur dresse des listes en mémoire, ce qui est très facile à gérer. Cela permet de dissocier les valeurs des signes, et de permettre de gérer des constantes. Cependant, l'exécution est plus lente, surtout pour un tracé de courbe ou ça devient assez visible. J'ai alors voulu faire une classe qui simule une liste dans un simple String. Hélas pour moi, cette option s'est révélée encore plus lente (et c'était pas prévu). Donc, gardez TStringList pour faire des listes.

Voilà donc tout plein d'idées. Chacun sera libre de choisir sa stratégie, pour ce passionnant exercice pour lequel il n'y a pas de ruses...
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
19 juil. 2004 à 02:11
OK... je n'avais pas compris ton commentaire Japee.... au départ..

car dans ma fonction : GetValExpr(...)
il y a un trim qui élimine les espaces avant et aprés la valeur avant de la retournée..

D'autant que j'avais essayé de mettre des espaces dans l'expression et que cela fonctionnait trés bien.... même placée à la fin...

Négligeance de ma part (Mea Culpa), Je n'avais apparement pas tester en mettant des espaces en début de chaine...

pour y remédier, il suffit d'écrire :
Value := Trim(Value);

en tout début de la fonction : Function EvalExpression(var Value : string) : string;

Apparement tout fonctionne correctement maintenant...

Encore Merci.. bye..
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 juil. 2004 à 11:17
Et j'oubliais, le code est clairement commenté, c'est rare, hélas :(
On a déjà du mal à relire ses propres codes quelques mois après, alors ceux des autres...
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 juil. 2004 à 11:06
Intéressant, à tester à fond...
Ta fonction néglige les espaces avant et au milieu des calculs, qu'ils soient inexistants ou doublés voire plus, ce qui est excellent car on n'est pas à l'abri d'une erreur de saisie etc...
Oui mais voilà, il suffit justement qu'un espace soit saisi à la fin pour avoir un débordement de pile.
Un exemple de correctif rapide :
TrimRight(Value);
à placer en début de la fonction.
Travail impressionnant, je vais investir dans un écran "vertical" (si je trouve...) pour étudier ça de près ;)
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
17 juil. 2004 à 00:57
Très beau travail ! Joli !
Rejoignez-nous