begin process at 2012 02 11 09:12:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > ÉVALUATION EXPRESSIONS MATHÉMATIQUES

ÉVALUATION EXPRESSIONS MATHÉMATIQUES


 Information sur la source

Note :
Aucune note
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é :9 906 / 775

Auteur : barbichette

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
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-CHAIN ES-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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture COMPARATIF ALGO CERCLES
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE BIS
Source avec Zip Source avec une capture INTERPRETEUR DE LANGAGE PERSONNALISABLE
Source avec Zip Source avec une capture RUBIK'S CUBE
Source avec Zip Source avec une capture SPINEDIT EN DÉCIMAL AVEC GESTION DES UNITÉS

 Sources de la même categorie

Source avec Zip Source avec une capture RESOLUTION EQUATIONS DEGRE "N" + CALCULETTE SCIENTIFIQUE par pseudo3
Source avec Zip DEUX BIBLIOTHÈQUES POUR CALCULER AVEC DES ENTIERS TRÈS GRAND... par Rekin85
Source avec Zip Source avec une capture MOTEUR PHYSIQUE 2D CHIPMUNK.. EN DELPHI! par Bacterius
Source avec Zip Source avec une capture TABLEAU DE KARNAUGH par ADMR
Source avec Zip Source avec une capture FILTRAGE NUMÉRIQUE IIR par Pouillerot

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EVALUATION D' EXPRESSIONS MATHÉMATIQUE (MÉTHODE RPN) par MAURICIO
Source avec Zip COMPOSANT THORLOGE par Michel34
Source avec Zip Source avec une capture COMPOSANT TLOG UTILISANT UNE DLL par Bacterius
Source avec Zip Source avec une capture MÉTHODE DE GAUSS ET DE CRAMER : RÉSOLUTION DE 10 ÉQUATIONS À... par bad_dark_spirit
Source avec Zip Source avec une capture MÉTHODE DICHOTOMIQUE : CALCUL DE RACINE CUBIQUE par bad_dark_spirit

Commentaires et avis

Commentaire de MAURICIO le 25/02/2008 18:32:29 administrateur CS

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+

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.

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


Commentaire de yvessimon le 26/02/2008 15:40:41


La fonction x^x donne une erreur

Bon travail


Salutations

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

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.

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)

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

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.


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.

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.

Commentaire de MAURICIO le 10/12/2010 17:16:24 administrateur CS

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+

 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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,980 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales