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 éclairé

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 : 401
    Points : 793
    Points
    793
    Billets dans le blog
    5

    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 habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    68
    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 : 68
    Points : 189
    Points
    189
    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 habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    68
    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 : 68
    Points : 189
    Points
    189
    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


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

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

    Informations forums :
    Inscription : août 2008
    Messages : 22 319
    Points : 121 654
    Points
    121 654

    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 ou PyQt (tutoriels, FAQ, traductions) ? Contactez-moi par MP.

    Nouveau ! 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 Général Algorithmique
    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