begin process at 2008 07 20 04:43:26
1 213 129 membres
50 nouveaux aujourd'hui
14 166 membres club

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é: 3 986 / 257

Note :
Aucune note

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

Description

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

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

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS