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

Algorithmes et structures de données Discussion :

Validation d'une formule mathématique


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Points : 98
    Points
    98
    Par défaut Validation d'une formule mathématique
    Bonjour,

    je cherche une solution pour valider le format d'une formule de calcul mathématique, par exemple:
    2*(1+3/4) est valide
    2*1++5 n'est pas valide
    2*(4+5 n'est pas valide

    La validation doit s'effectuer avec des opérateurs basiques uniquement (+ - / *)

    Existe-t-il des solutions pour vérifier cela?
    Une expression régulière? un algorithme?
    Autrement : une librairie java ou javascript

    Je ne trouve aucune solution existante sur ce sujet, et il a l'air complexe de mettre en place une telle vérification

    Auriez vous une piste?

    merci

  2. #2
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Validation d'une formule mathématique
    Bonjour,

    ... Auriez vous une piste? ...
    # Mettre la formule sous forme de chaîne de caractères, après élimination des éventuels espaces (' '):

    # Repérer tous les doublets interdits de caractères consécutifs ('+*', '+/', '*/', ...etc);

    # Compter algébriquement les parenthèses en parcourant la formule, et en codant
    Np:= Np + 1 pour toute parenthèse ouvrante '(',
    Np:= Np - 1 pour toute parenthèse fermante ')';
    le bilan doit être nul: Npfinal = Npinitial = 0 .

    Cela ne doit pas poser de difficulté dans le cas d'une formule numérique; dans le cas d'une formule algébrique, il faut voir quels sont les symboles autorisés.
    Le signe "moins" peut aussi poser problème, dans la mesure où il peut intervenir en tant qu'opérateur unaire de changement de signe; la paire '+-' sera acceptable ou non, suivant les règles de syntaxe du logiciel traitant la formule.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 135
    Points : 283
    Points
    283
    Billets dans le blog
    1
    Par défaut
    Un automate fini te fait ça. En gros lexer parser. Lex/yacc, ou antlr4 par exemple.
    Antlr4 fonctionne très bien avec java. Il te parse tout ça, et te retourne un arbre du parsing effectué, ou une erreur.

    Par exemple avec antlr4, un fichier comme ça fait l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    grammar Arit;
     
    parse: e EOF ;
     
    e returns [int er]: 
          '-' e 
        | '(' e ')' 
        | e '/' e 
        | e '*' e 
        | e '-' e 
        | e '+' e 
        | INT
    ;
     
     
    WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
    INT: '0'..'9'+;
    NEWLINE: [\n]+;
    Tu peux compiler ça avec un truc du style java -jar antlr4.jar fichier.g4 après avoir télécharger antlr4 et tout ça. Ca te créer un code java qui parse tout ça. Tu peux tester en lançant le parser sur une entrée s'il y a une erreur au cours du parsage par exemple

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Points : 98
    Points
    98
    Par défaut
    Ok, merci pour ces réponses.

    Je vais m’intéresser à ce fameux antlr4.

    Développer un algo maison de validation me semble complexe, car sur cette idée, il faut penser à répertorier tous les cas "mauvais", ce qui ne semble pas être un mince affaire.
    Il me semble également peu efficace de coder quelque chose de complexe (enfin, de mon point de vue) si il existe déjà des solutions fiables.

    Merci

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 135
    Points : 283
    Points
    283
    Billets dans le blog
    1
    Par défaut
    Après apprendre antlr c'est pas trivial non plus !
    Mais c'est utile pour faire ça

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 617
    Points : 188 587
    Points
    188 587
    Par défaut


    Un peu en vrac…
    D'un point de vue théorique, impossible de résoudre ce problème avec une machine d'état finie : il faut compter les parenthèses, ce qui est impossible (même chose pour des expressions régulières). Il faut absolument généraliser https://fr.wikipedia.org/wiki/Automate_%C3%A0_pile (ANTLR étant un bazooka pour tuer une mouche, ici ).
    Pour un algo maison, ce n'est a priori pas trop compliqué, ça se résume à une pile (https://en.wikipedia.org/wiki/Shunting-yard_algorithm). Dès que l'expression à analyser n'a plus de sens, alors il y a un problème.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une image d'une formule mathématique
    Par circe dans le forum Mathématiques - Sciences
    Réponses: 5
    Dernier message: 03/03/2008, 10h09
  2. Réponses: 2
    Dernier message: 14/12/2007, 01h11
  3. Evaluer une formule mathématique
    Par spidercool dans le forum C#
    Réponses: 2
    Dernier message: 07/05/2007, 22h27
  4. Réponses: 2
    Dernier message: 13/04/2007, 02h22
  5. Déterminer Algo pour une formule mathématique
    Par jekyll_omiwane dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/01/2005, 18h28

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