ÉVALUATION EXPRESSIONS MATHÉMATIQUES

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 25 févr. 2008 à 18:32
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 10 déc. 2010 à 17:16
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/45846-evaluation-expressions-mathematiques

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
10 déc. 2010 à 17:16
Salut Barbichette,

après voir corrigé mon propre parser il y a peu à cause d' un petit bug, j' ai cherché à voir ce que les autres faisaient dans ce domaine et je dois dire que ton code est bien meilleur que le miens!
Il permet entre autres l' utilisation de variables et permet aussi, d' après ce que j' ai lu sur Wikipedia, de ne pas tout recalculer lorsque l' on change la valeur des variables: impressionant!
Après plusieurs tests, ton source ne m' a donné aucune erreur.

Malheureusement, j' ai encore du mal à comprendre ton source, ou plutôt la logique de la "notation polonaise".

J' aimerai implémenter cette méthode dans une nouvelle et unique unité de mon pack de compos (cindy components) afin d' en créer une class puis un compo avec une propriété TCollection pour gérer les variables. Cette unité sera aussi utilisable par mes compos, l' idée étant de l' implémenter dans l' immédiat dans mes DBGrids pour y faire des calculs directement dans la DBGrid.

J' aimerai donc savoir si ce source est la dernière version que tu as et si je peux l' utiliser (en la modifiant selon mes besoins) dans mon pack de compos.
Tu peux me contacter par message privé, je te donnerai mon mail.

A+
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
9 sept. 2008 à 09:21
juste un petit message en passant.
Je ne me souvenais pas trop de mes cours de fac, et surtout de la terminologie.
Maintenant que ça me reviens :

Procedure StrToPile(expr:string);
correspond à l'analyse lexicale

Function VerifPile:Boolean;
correspond à l'analyse grammaticale

Function InfixToPreFix(infix:tpile):tpile;
correspond à la compilation, ou plutôt une pseudo compilation

Procedure Eval_exp;
correspond à l'interprétation du pseudo programme précédent.

Voilà, ça change pas le code source, mais ça donne des précision pour mieux comprendre le principe de compilation d'un langage. Puisque les expressions mathématiques sont considéré comme un langage.
delphifrxeslam6x Messages postés 1 Date d'inscription vendredi 8 février 2008 Statut Membre Dernière intervention 9 mai 2008
9 mai 2008 à 16:41
Idée très intéressante. Pour l' instant je n' ai pas rencontré de problèmes. Etant donné l' interet que je porte à vos unités, je pense à continuer à la développer et à l' adapter à ma sauce. Quelqu' un a-t-il dejà fait un travail dans ce genre. J' y participerais volontiers. Mais je ne me sens pas le courage de l' initier.
En tout cas bravo barbichette.

Ps.
Votre site personnel n' est plus à jour.
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
23 avril 2008 à 13:31
Yvessimon :
Exact, il y a une division par zéro quand x=0
Correction à faire dans Eval_exp pour le cas OpExposant

OpExposant :
if (frac(value[0])<>0) and (value[1]<0) then LastExprError:=101
else
if (value[0]<0) and (value[1]=0) then LastExprError:=100
else
if (value[0]=0) then Fresultat.Add(niveau(1,TypeValue))
else Fresultat.Add(niveau(power(Value[1],value[0]),TypeValue));

Comme ça il y a un test de division par zéro.

Dans tous les cas, il est préférable d'utiliser l'évaluation dans un Try...Except...End.
comme ça, on récupère toutes les exceptions de calculs en virgules flottantes.
yvessimon Messages postés 637 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 9 janvier 2017
23 avril 2008 à 10:18
Bonjour,

La fonction x^(-2) donne une erreur.
avec un exposant négatif (2 ou 3 ...)
ou un exposant décimal
cs_raffour Messages postés 7 Date d'inscription dimanche 30 décembre 2007 Statut Membre Dernière intervention 22 avril 2008
19 avril 2008 à 21:01
Quand on est très fort, on est pompé
j'ai fait une transcription en action script (flash) d'une partie de ton code
Etant un delphi-user confirmé et un action-scripteur néophyte, ça m' a servi de base d'apprentissage d'action-script
je l'ai déposé dans la rubrique Flash de ce site (calculatrice expression mathématique
Désolé d'en avoir enlevé des bouts qui ne me servaient à rien (constantes, E, ..)
Merci pour ce source
je vais d'ailleurs voir les corrections que tu as apportés (en action script, il y a un garbage collector, donc je ne me suis pas trop soucié de libérer les objets)
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
12 mars 2008 à 20:21
Suite à de nombreuses remarque de Mahara34 en perso, j'ai mis a jour une partie du code.
Ça ne touche pas à l'algorithme mais il y avait des pertes de mémoire dues à un tic récurant chez moi de ne pas libéré les objets avec .free après leur utilisations...
La plupart des fonctions qui renvoyaient des TPile n'en sont plus. Ce sont de simple procédure puisqu'il n'y avait aucun intérêt à faire une fonction.
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
10 mars 2008 à 14:30
suite à une demande en perso, je place ici une mise à jour qui intègre les fonctions avec un nombre variable d'opérande.

Comme exemple, j'ai crée la fonction "somme" qui calcul la somme des opérandes.
somme(a;b;c)=a+b+c
somme(1;2;3;4;5;6)=1+2+3+4+5+6
somme(x)=x

Par ailleurs, j'ai placé un try...except pour l'erreur du x^x. Ceci n'était pas un bug de mon code mais un simple problème de calcul en virgule flottante sur des valeurs trop grandes...

Enfin, juste une petite précision.
en perso, on m'a donné un petit bug.
"e=10" donne une erreur du au fait que la lettre E correspond à la notation scientifique d'un réel.
E est remplacé par *10^. donc dans e=10, il y a une confusion entre une variable et un opérateur.

Barbichette
yvessimon Messages postés 637 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 9 janvier 2017
26 févr. 2008 à 15:40
La fonction x^x donne une erreur

Bon travail


Salutations
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
25 févr. 2008 à 21:19
Sinon, je vais donner quelques explications quand même.

1 - Oui, il n'y a pas de zoom, ni rien d'autre d'ailleurs car c'était juste pour donner une petite façon d'utiliser les classes.

2 - En fait, on donne une expression à la classe TExpression, qui ce charge de la convertir en notation polonaise inverse une seule fois.
Ensuite, on peut demander d'évaluer l'expression plusieurs fois avec des constantes différentes sans que la classe refasse toute la préparation de la pile d'évaluation.

3 - j'ai un peu merdé sur les noms. En effet, les "constantes" sont surtout des "variables"... Mais j'avait la flemme de tout reprendre les noms...

4 - On peut créer des fonctions avec plusieurs arguments. Comme dans cette exemple, il y a la fonction LOGN qui calcule le logarithme en base N. Il prend donc la base et le nombre. Les arguments sont séparés par un point-virgule.
donc logn(5;5^3)=3

Voilà pour un petit tour d'horizon...
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
25 févr. 2008 à 21:10
Merci Mauricio,

Je viens de voir un bug. Lorsque les multiplications sont implicites (exemple 2a^2 au lieu de 2*a^2), il y a un gros plantage avec la chaine contenant la constante et perdue...
Je cherche une solution.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
25 févr. 2008 à 18:32
Salut Barbichette,

je n' ai pas jeté un oeil approfondi sur les code mais ça samblait très bien organisé comme à ton habitude.

J' ai testé la fonction graphique et malheureusement il n' y a pas d' option Zoom ...

Bravo en tout cas pour cette source interessante!
A+
Rejoignez-nous