IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Fonction d'évaluation mathématique


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut Fonction d'évaluation mathématique
    Bonjour,

    je veux faire un petit interpréteur (donc mon propre langage) et je pense que la première étape serait de le rendre capable d'évaluer des expressions mathématiques.

    en tenant compte que les opérateur de mon langage seraient
    • +, -, *, / : ce sont les opérateurs standards
    • ^: puissance (ex. le carré de 3: 3^2)
    • \ : division entière, %: modulo
    • ->: affectation
    • >+, >-, >*, >/ : opérateurs spéciaux (ex. pour A=3 A>+4 A=7, équivaent au +=, -= *= /= du C)


    l'idéal serait de réserver au départ 26 variables de A..Z pour pouvoir les gérer facilement genre
    A->5
    B->A+5*2

    ce que je vous demande c'est la démarche qu'il faut suivre pour pouvoir réaliser une fonction capable d'interpréteur ce genre d'expression, sachant quel doit bien sûr respecter les priorités mathématiques.

    Comment traiter la chaîne de caractères lu par la console. Faut-il utiliser les expressins régulières ou un autre mécanisme spécifique ?

    Je demande au cas où, mais est-ce qu'il y aurait moyen de traduire les instructions en assembleurs puis de les exécuter directement par le processeur?

    Merci pour vos réponses.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Pour info je signale qu'il y a sur ce forum une discussion datée du 03/02/2007 et intitulée Expressions mathématiques & calcul littéral qui apporte des suggestions complémentaires.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    ... puis c'est pas fini une autre discussion datée du 20/02/2006 et intitulée interprétation formule de calcul apporte un éclairage complémentaire.

  4. #4
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    oula je demande rien d'aussi complexe.

    bon pour la procédure je pensait faire une simplication de l'expression par plein de petite opération, par exemple avec celle-ci (travaillons avec des entiers pour le moment):

    4 + 5 * 2 - 7 + 6

    * on prend les opérateurs avec le plus de priorité, ici le produit
    R1=5*2
    * puis quand il nous reste des + et des - ont traitede gauche à droite
    R2=4+R1
    R3=R2-7
    R4=R3+6

    ce qui fait
    5*2 -> 4+10 --> 14-7 -> 7+6 --> 13

    bon après il faut que je rende la fonction capable d'interpréter ces petites opérations

    donc je résume: on transforme
    4 + 5 * 2 - 7 + 6

    en ceci

    R1=5*2; R2=4+R1; R3=R2-7; R4=R3+6

    et faudrait qu'il soit capable de l'interpréter

    je sais trop comment codé ca.

    Des idées

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En fait il est beaucoup plus simple chercher les opérateurs de moindre priorité, paradoxalement. Une fois que l'as trouvé, tu sépares ton calcul en deux parties : à gauche et à droite. Et tu rappelles ta routines récursivement pour la gauche et pour la droite. Et puis avec tu fais le calcul adéquat (correspondant à l'opérateur trouvé) entre les deux retours des récursifs, et tu renvoies le résultat.

    Bien sûr si tu ne trouves pas d'opérateur, tu dois être tombé sur un nombre seul. Auquel cas tu renvoies ce nombre évidemment.

    Et il faut encore veiller à l'effet des parenthèses... Mais bon là je te laisse chercher un peu.

  6. #6
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Merci pour ces réponses,

    j'ai une autre question. Comment je fais pour manipuler les opérateurs et nombres d'une expression.

    Est-ce que je les stockes dans un tableau d'opérateurs et de nombres?

  7. #7
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par sjrd
    En fait il est beaucoup plus simple chercher les opérateurs de moindre priorité, paradoxalement.
    Je comprends pas. Comment on peut faire pour calculer en respectant les priorités si on prend d'abord les opérateurs de priorité inférieurs ?

  8. #8
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Ah ça y est je crois que j'ai saisi, je met les plus faibles opérations (du pt de vue priorité) d'abord et je met les autres ensuite, ce qui ferait

    4 + 5 * 2 - 7 + 6 => 4-7+6+5*2
    et récursivement je traite les opérations :

    TANT QUE nombreOperateur n'est pas nulle ALORS
    On traite la prochaine opération de gauche à droite
    SINON
    On renvoie le dernier résultat trouvé.

    C'est bien ça ?

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Eh bien prenons l'exemple tout bête : Eval('2*3+5*6'), qui devrait donner 36, et non pas 66.

    Tu cherches l'opérateur de moindre priorité, à savoir le +. Tu retiens que c'est un + et tu sépares gauche et droite. Tu as donc :
    Operateur : opPlus (membre d'énumération dans laquelle tu mets tes opérateurs)
    StrGauche : 2*3
    StrDroite : 5*6

    Tu appelles récursivement Eval pour la gauche et la droite, et puis tu case sur le type d'opérateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Gauche := Eval(StrGauche);
    Droite := Eval(StrDroite);
    case Operateur of
      opPlus : Result := Gauche + Droite;
      opFois : Result := Gauche * Droite;
      // etc.
    end;
    L'appel Eval(StrGauche) = Eval('2*3') cherche alors l'opérateur de moindre priorité : maintenant c'est *.
    Operateur : opFois
    StrGauche : 2
    StrDroite : 3
    Encore un appel récursif plus bas : Eval('2') voit qu'il a simplement un nombre -> il le renvoie. Même chose pour Eval('3'). Eval('2*3') reçoit ces deux résultats et les multiplie -> il renvoie 2*3 = 6.

    De l'autre côté, Eval(StrDroite) = Eval('5*6') se déroule de la même façon et renvoie 30.

    Finalement, Eval('2*3+5*6') reçoit 6 et 30, et les additionne avant de renvoyer le résultat -> 36.

    Pigé ?

  10. #10
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Mais si je fais un type enuméré du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TOpType = (OpSomme, OpProduit); // etc ...
    var
      OpType: TOpType;
    je suis quand même obligé de faire un case .. of sur le caractère trouvé et renseigner la variable OpType selon que c'est un '+' ou un '*'.

  11. #11
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    personne n'a d'idées ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Bonsoir

    Si tu veux développer un interpréteur d'un microlangage, saches que RM Di Scala traite du sujet de manière très complète dans son package pédagogique mis à la disposition de tous et téléchargeable ici http://rmdiscala.developpez.com/cours/

  13. #13
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    je ne m'y retrouve pas dans ce que tu m'a donné. De quoi s'agit-il ? Je ne comprends pas.

  14. #14
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Si tu t'en sens l'audace, regarde la fonction Eval de ScMaths.pas. Cette unité fait partie du projet Sepi, qui est sous license GPL.

    Le principe de base se situe sous la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {$REGION 'Fonction Eval et sous-fonctions'}
    C'est plus évolué que ce que tu veux faire : cette fonction travaille sur des polynômes et non sur des scalaires. Mais tu peux t'en inspirer pour le concept, en imaginant les TPolynom comme de simples Extended.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Tu ouvres le chapitre 3.4 projet de réalisation d'un interpréteur de micro-langage.


    @+

    Ps: Cela semble intéressant Sjrd, je vais y jeter un coup d'oeil.

  16. #16
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    @sjrd:

    c'est quoi des polynomes ?
    Si ça peut me permettre de gérer plus facilement les nombres de l'expression, je suis preneur !

    Je vais déjà regarder.

  17. #17
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Ah ok ce sont des sorte de variant en fait.
    Je crois que je vais grandement m'inspiré de ton unité.

    Je vais remplacer certain des opérateurs par ceux que je veux insérer.

    P.S: Y a des petit prob d'encodage au téléchargement de ton unité.

  18. #18
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    waow c'est compliqué quand même, y a des concept de delphi dont je ne soubçonnait même pas l'existence

    par exemple le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        class function Addition      (Val1, Val2 : TPolynom; ReleaseVals : boolean = False) : TPolynom;
    ça veut dire quoi class function, ça a quoi de spécial par rapport à une fonction normal ?

  19. #19
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    c'est une methode de class elle peut etre appelé sans instanciation de l'objet
    c'est l'equivalent des methode static en C++

    en fait dans ton cas tu peut utiliser l'addition sans que tu est instancier l'objet
    @+ Phil

  20. #20
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par anapurna
    salut

    c'est une methode de class elle peut etre appelé sans instanciation de l'objet
    c'est l'equivalent des methode static en C++

    en fait dans ton cas tu peut utiliser l'addition sans que tu est instancier l'objet
    @+ Phil
    en fait j'ai pa à faire MonObjet:=MaClasse.Creer;
    pour utiliser la méthode MaClasse.Additionner;

    je peux donc le faire directement. Ok j'ai compris.

Discussions similaires

  1. Fonction d'évaluation pour algo génétique.
    Par Trap D dans le forum Intelligence artificielle
    Réponses: 16
    Dernier message: 14/04/2008, 10h34
  2. algorithme génétique:fonct°fitness et fonction d'évaluation
    Par rihanna dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 20/01/2008, 21h03
  3. Fonction d'évaluation d'un jeu de dames utilisant l'algorithme du min/max
    Par elron8 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 31/01/2007, 11h04
  4. [Jeu]Fonction d'évaluation
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 11/06/2005, 09h45
  5. [MinMax] Fonction d'évaluation
    Par le Daoud dans le forum Intelligence artificielle
    Réponses: 5
    Dernier message: 09/06/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo