Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ÉVALUATION EXPRESSIONS MATHÉMATIQUES


Information sur la source

Catégorie :Maths Classé sous : expression, mathématique, polonaise, fonction, parentheses Niveau : Initié Date de création : 25/02/2008 Date de mise à jour : 12/03/2008 20:15:53 Vu / téléchargé: 6 203 / 352

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
comme le dit le titre, ça évalue une expression mathématique en basculant l'expression parenthésée en une pile en notation polonaise. Ou plutôt polonaise inverse il me semble.
Je suis parti de la source de Oniria :
http://www.delphifr.com/codes/CALCULATRICE-CHAINES-MATHEMATIQUES_45537.aspx
J'ai tout refait en utilisant cette fois ci un algorithme tiré du site Wikipédia :
http://fr.wikipedia.org/wiki/Notation_polonaise_inverse
Ainsi, c'est le même algo qui inverse les opérateurs dans une expression simple et qui traite les parenthèses et les fonctions, les constantes...

Il y a pas mal de commentaire dans le code.

Il est facile de rajouter des fonctions :
1 - en complétant les deux constantes tableaux "OpInfos" et "OpCodes" dans l'unité "UOperateur.pas"
2 - en ajoutant le calcul à faire dans "Eval_exp" de l'unité "UExpressions.pas"

Pour le reste, le programme d'exemple traite :
- une série de calcul avec une éventuelle affectation à des variables sur la gauche de la fiche
- une série de fonction dépendant de X à droite de la fiche et trace leurs courbes en point par point.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

26 février 2008 14:08:27 :
Correction du bug dans la classe TPile qui provoquait l'erreur donnée en commentaire
10 mars 2008 14:23:27 :
gestion des fonctions avec un nombre variable d'opérandes
12 mars 2008 20:15:53 :
correction des pertes mémoire

Commentaires et avis

signaler à un administrateur
Commentaire de MAURICIO le 25/02/2008 18:32:29

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+

signaler à un administrateur
Commentaire de barbichette le 25/02/2008 21:10:19

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.

signaler à un administrateur
Commentaire de barbichette le 25/02/2008 21:19:33

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...


signaler à un administrateur
Commentaire de yvessimon le 26/02/2008 15:40:41


La fonction x^x donne une erreur

Bon travail


Salutations

signaler à un administrateur
Commentaire de barbichette le 10/03/2008 14:30:06

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

signaler à un administrateur
Commentaire de barbichette le 12/03/2008 20:21:05

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.

signaler à un administrateur
Commentaire de raffour le 19/04/2008 21:01:20

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)

signaler à un administrateur
Commentaire de yvessimon le 23/04/2008 10:18:02

Bonjour,

La fonction x^(-2) donne une erreur.
avec un exposant négatif (2 ou 3 ...)
ou un exposant décimal

signaler à un administrateur
Commentaire de barbichette le 23/04/2008 13:31:40

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.


signaler à un administrateur
Commentaire de delphifrxeslam6x le 09/05/2008 16:41:12

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.

signaler à un administrateur
Commentaire de barbichette le 09/09/2008 09:21:22

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

fonction de "consersion" [ par jakouz ] bonjour je voudrais savoir s'il existe une fonction intégrée delphi qui me donne le chemin absolu de mon répertoire de base http (web) ? Merci d'avanc Appeler un fonction a partir d'une autre unit [ par fabiin ] Salutalors voila,g une fonction ki ce trouve dans une autre unit, mais cette unit n'est pas "lié" a une form, elle est juste comme ca pour mettre des limitation de sendtext ? [ par Xavier ] Bonjour,Comme la fonction sendtext prend en parametre un string et sachant qu'un string peut faire 2 Mo, pensez-vous qu'il est raisonnable d'utiliser prb avec dll et tableau dynamique [ par bd ] actuellement je recois en parametre d'une fonction un tableau de longueur variable. ce tableau est rempli dans la fonction de la dll.au retour dans la Retourner une chaine... [ par ELECTRORESiSTiK ] Salut,J'ai une chaine "1234567890" je cherche une fonction qui me donnerai "0987654321". Comment puis-je faire ça ? Il existe une fonction ?Merci d'av Fonction ??? [ par ELECTRORESiSTiK ] Salut, je cherche une fonction qui me permettrai de mettre un texte en forme sur une largeur de 70 caractère sans couper un mot et mettre des espaces Une fonction existe pour ça ? [ par ELECTRORESiSTiK ] Salut, je cherche une fonction qui me permettrait de mettre un texte en forme sur une largeur de 70 caractères sans couper un mot et mettre des espace déclaration d'une fonction [ par vib ] Je désire déclarer la fonction:function trouver_composant(t:string):Tcompopour quelle soit visible dans les autres unités.Je la déclare donc dans la p Fonction pour séparer des champs dans une chaine [ par belkin ] Bonjour,Existe-t-il une fonction qui permet de séparer des champs dans une chaine ?Exemple : MaVariable := '123_456.dat';Je veux séparer le 123 et 456 mot-clé inherited et les fonction [ par JesseJames ] salut, j'ai un problème qui me torture la vie, help !Ayant 2 classes, A et B, A était la super-classe et B une classe fille.la méthode (fonction) de A


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 10,046 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.