cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és1Date d'inscriptionvendredi 8 février 2008StatutMembreDerniè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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és637Date d'inscriptionmardi 22 avril 2003StatutMembreDerniè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és7Date d'inscriptiondimanche 30 décembre 2007StatutMembreDernière intervention22 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és637Date d'inscriptionmardi 22 avril 2003StatutMembreDerniè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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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+
10 déc. 2010 à 17:16
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+
9 sept. 2008 à 09:21
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.
9 mai 2008 à 16:41
En tout cas bravo barbichette.
Ps.
Votre site personnel n' est plus à jour.
23 avril 2008 à 13:31
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.
23 avril 2008 à 10:18
La fonction x^(-2) donne une erreur.
avec un exposant négatif (2 ou 3 ...)
ou un exposant décimal
19 avril 2008 à 21:01
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)
12 mars 2008 à 20:21
Ç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.
10 mars 2008 à 14:30
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
26 févr. 2008 à 15:40
Bon travail
Salutations
25 févr. 2008 à 21:19
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...
25 févr. 2008 à 21:10
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.
25 févr. 2008 à 18:32
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+