begin process at 2008 08 28 17:14:01
1 233 230 membres
329 nouveaux aujourd'hui
14 291 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 !

CALCULATRICE D'EXPRESSION MATHÉMATIQUE


Information sur la source

Description

Les deux fichiers .as contiennent les objets permettant le passage d'une expression mathématique classique (infixée) par ex 3*(4+5) en notation polonaise inversée 3 4 5 + * plus facile à évaluer en programmation et qui n'est pas ambigue  (contrairement aux apparences) car par ex, l'addition a 2 opérandes qui sont donc forcément 4 et 5
Après ce passage en polonaise inversée, l'expression est calculée dans ce source
Le fichier fla est une interface sommaire permettant de tester les calculs
Le tout est compatible en as2, mais ne devrait pas être trop difficile à faire évoluer en as3
Les objets comprennent un certain nombre de fonctions et des expressions comme :
5 + (3 * 4^5) ou 5 - 2* exp(-3) ou asin(0.5)(en radians) sont reconnues et calculées

Source

  • Il s'agit d'une transcription partielle d'un source en Delphi pris sur http://www.delphifr.com//code.aspx?ID=45846
  • Ce source semble d'ailleurs une adaptation réussie d'un source de la défunte revue Pascalissime
  • J'ai pas mal d'expérience en delphi et pascal mais je suis un néophyte en actionscript
  • C'est donc pour progresser en actionscript que j'ai fait cette transcription
  • Le source des objets est assez long (+ de 500 lignes) et technique mais j'ai essayé de le commenter correctement
  • Enfin je n'ai pas eu le temps et le besoin d'implémenter la partie "constante" qui permet de calculer des f(x) par ex, mais il reste des traces dans le source
Il s'agit d'une transcription partielle d'un source en Delphi pris sur http://www.delphifr.com//code.aspx?ID=45846
Ce source semble d'ailleurs une adaptation réussie d'un source de la défunte revue Pascalissime
J'ai pas mal d'expérience en delphi et pascal mais je suis un néophyte en actionscript
C'est donc pour progresser en actionscript que j'ai fait cette transcription
Le source des objets est assez long (+ de 500 lignes) et technique mais j'ai essayé de le commenter correctement
Enfin je n'ai pas eu le temps et le besoin d'implémenter la partie "constante" qui permet de calculer des f(x) par ex, mais il reste des traces dans le source

Conclusion

Pour les experts en as, désolé pour les maladresses (par ex, de nombreux return sont inutiles) mais je compte sur vos conseils pour progresser
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

  • signaler à un administrateur
    Commentaire de raffour le 19/04/2008 19:31:12

    Pour ceux qui ne disposent pas de flash cs3 et ne peuvent donc pas ouvrir le fichier fla
    voici son source (btOK est un composant bouton,tsaisie et treponse sont deux zones de texte)
    import TNiveau;
    import TCalcul ;


    btOK.onPress = function(){
    var expression = new TCalcul();
        var expr : String = tsaisie.text;
    try { expression.DefineExpression(expr);
          // on évalue l'expression
           expression.Evalue();
           //  on affiche juste le résultat
            treponse.text = expression.GetResultat();
      
    } // si il y a une erreur, on l'affiche
    catch(e:Error) {treponse.text =expression.GetExprErrorString(expression.LastExprError);
                     expression = Null;
    }
    }

  • signaler à un administrateur
    Commentaire de BananaTree le 21/04/2008 11:02:44

    helo,
    si ça ne te dérange pas, je vais le passer en as3 et en anglais, et on va mettre ton nom en nom d'auteur, avec une jolie licence open source.
    pascal

  • signaler à un administrateur
    Commentaire de raffour le 21/04/2008 16:50:25

    BananaTree
    ça ne m'embête pas que tu le passes en as3 et en anglais et je voudrais bien voir ça
    mais je ne suis qu'un transcripteur et non l'auteur : il faudrait sans doute citer Barbichette qui l'a écrit en Delphi
    De plus, il faudrait le fignoler :
    éliminer les scories inutiles
    ajouter le traitement des variables
    améliorer la gestion des erreurs
    vérifier la libération mémoire
    je vais essayer de le faire mais si qqun a envie de m'aider ...

  • signaler à un administrateur
    Commentaire de top30 le 22/04/2008 10:56:24

    Enfin un projet intéressant.
    D'après ce que j'ai lu faudrais peut-être commencer par définir un "package Calcul:

    package Calcul
    {
       classe Calcul
       // la classe actuelle "TCalcul"

       classe CalculOperators
       // Liste de constantes de "CalculOperator"

       classe CalculOperator
       // Objet regroupant priorité, nom, operateur et type

       classe CalculError
       // Gestion des erreus

       classe CalculItemsType
       // Liste de constante des types d´élément de CalculStack

       classe CalculItems
       // Array des éléments de l'actuelle array "TTypePile"
    }

    A débattre...

  • signaler à un administrateur
    Commentaire de raffour le 22/04/2008 12:43:18

    Waoow ! et moi qui commençait à penser que la communauté des action-scripteurs ne kiffait qu'à animer des petits mickeys dans tous les sens ...
    Les suggestions de TOP30 sont alléchantes car bien structurées et découpées mais j'apprécierai un peu plus de précisions
    je précise aussi que le type Constante (mal nommée donc à changer) correspond à la possibilité d'introduire une variable, par ex : x pour calculer différentes valeurs d'une expresion en f(x)
    exemple : f(x) = 3x^2 -x la lettre x doit être reconnue comme une "constante" qu'on peut ensuite remplacer par une valeur numérique

  • signaler à un administrateur
    Commentaire de BananaTree le 22/04/2008 18:30:25

    le package logique est "math"
    le nom logique de la classe devrait être RPN, ou RpnExp, qui me semble pas trop mal au final
    ce qui permettrait de faire des trucs du genre new RpnExp(str), RpnExp.exp(str) et RpnExp.test(str)
    la gestion des erreurs est partie intégrante d'as3 et la classe devrait être RPNException

    concernant la gestion des expressions mathématiques à une ou plusieurs iconnues, je préconise l'utilisation de bibliothèques de fonctions dynamiques.

  • signaler à un administrateur
    Commentaire de top30 le 23/04/2008 12:58:21

    La propo de nom de BananaTree est à mon avis la bonne:
    "RpnExp" suivant la logique et la structure des RegExp.
    Le package serait donc "flash.math.RpnExp" ????
    Pourquoi pas ?

  • signaler à un administrateur
    Commentaire de BananaTree le 23/04/2008 18:25:02

    top30
    tu penses qu'utiliser des RegExp pour alimenter la pile serait judicieux (des projets existent sur ce principe ds d'autres languages)
    ou bien il n'y a pas de gain de performance et une boucle reste le mieux ?

  • signaler à un administrateur
    Commentaire de top30 le 24/04/2008 09:42:02

    Non je ne penses rien moi. Plus depuis longtemps.
    Une question, que veux dire "RPN" ?
    Moi j'au choisi "EqExp" de EquationExpression.

    Mais c'est vrai que les "vérifications" de la chaine pourrait se faire a travers les "RegExp". Il se dit que c'est plus rapide qu'une analyse de String car par char.

    Qund on sera d'accord sur la structure je me proppose de faire le premier obj:
    L'operator.

  • signaler à un administrateur
    Commentaire de BananaTree le 24/04/2008 10:39:01

    http://en.wikipedia.org/wiki/Reverse_Polish_notation
    http://fr.wikipedia.org/wiki/Notation_polonaise_inverse

    >>Il se dit que c'est plus rapide qu'une analyse de String car par char
    il me semble aussi.

    j'ai supprimé les tableaux au profit d'un objet RpnOperator et la classe TNiveau est devenue PostFixItem et est dans le fichier as de la classe RpnExp (car c'est une classe interne, pas besoin d'y donner accès).

    mon but c'est que RpnOperator définnisse lui même sa fonction mathématique,
    de façon à remplacer le switch de eval_exp par un objet Dictionary
    >> et de créer des "collections" externes de fonction (+ simple à gérer)

    public function RpnOperator(name:String, notation:String, priority:int = 0, operandNum:uint = 0) {
    super();
    this.name = name;
    this.notation = notation;
    this.priority = priority;
    this.operandNum = operandNum;
    //this.equation = equation;
    }

  • signaler à un administrateur
    Commentaire de top30 le 24/04/2008 13:10:17

    Effectivement le "RPN" simpose donc.

    D'accord pour l'usage d'un "dictionary" regroupant l'ensemble des "RpnOperator".
    Mais l'usage d'au moins un "switch" est obligatoire. Puisque c'est ce "switch" qui devra retourné à partir d'un "string"(name) l'objet RpnOperator correspondant.

    public function getOperator( $name:string )
    :RnpOperator{
       switch($name)
       {
          case 'somme': return RpnOperator.SOMME ;
         // Constante contenant un "RpnOperator" setter comme il se doit...
          etc...
       }
    }

    non ?

  • signaler à un administrateur
    Commentaire de BananaTree le 24/04/2008 13:59:32

    var my_op:RpnOperator = new RpnOperator("sin", "sin", 0, 1);
    my_dictionary[my_op.name] = my_op;

    donc my_dictionary["sin"] retourne my_op

    après rien n'empèche de faire :

    RpnOperator.equation(... arg):Number {};
    ---

    var sin:Function = function(... arg):Number { return sin(arg[0]); };
    my_op.equation = sin;

  • signaler à un administrateur
    Commentaire de top30 le 24/04/2008 18:25:16

    C'est parti...
    http://www.hopemultimedias.com/flashkod/RPNProjet.zip

    Dans l'attente de l'évolution.

  • signaler à un administrateur
    Commentaire de BananaTree le 26/04/2008 13:19:45

    c'est pas vraiment la bonne structure.
    du coup j'ai codé la totalité (plus simple de le faire que de l'expliquer)
    j'ai juste 1 ou 2 truc à corriger, et je poste le lien.

  • signaler à un administrateur
    Commentaire de top30 le 26/04/2008 21:04:38

    J'ai hate de lire, corriger, apprécier et applaudir !

  • signaler à un administrateur
    Commentaire de BananaTree le 28/04/2008 11:03:16

    preview:
    http://www.flashapi.org/temp/RPN.zip

    je dois finir checkExp, et l'idée d'avoir la boucle pour tokenizer et l'algorythme de la npi séparés ne me convient pas. je pense qu'on doit pouvoir les combiner.
    enfin, la gestoin des erreurs est différente, mais encore dans ma tête ;)

    note: il semble que Stingg.indexof soit 100 fois plus rapide que les regexp. ! ! ? ?

  • signaler à un administrateur
    Commentaire de BananaTree le 30/04/2008 14:30:14

    version beta sur la page :
    http://www.flashapi.org/spas3.html
    (version finale quand j'aurrais le temps)

    >> gestion d'erreurs:
    on peu maintenant changer la langue.
    j'ai pas fini l'implémentation des erreurs, et y'a qq petits trucs à revoir (il me semble que la puissance d'un nombre fractionnaire négatif existe!)

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS