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

C# Discussion :

Calculatrice un peu spécial


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 84
    Par défaut Calculatrice un peu spécial
    Bon voilà je dois créer une sorte de calculatrice. Je dis une sorte car en fait je dois trouver un moyen de traiter une formule du type
    x+y+(a+b)*5 qui est une chaine de caractères. Sachant que x peut être une données récupérer dans un fichier.
    je ne sais pas si je me suis bien exprimer mais en gros à partir d'une chaine de caractère du type a+b*(x-y) je dois obtenir le résultat de ce calcul
    Merci d'avance pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Par défaut
    a, b , x et y sont de quels types?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Citation Envoyé par DreammyKetty Voir le message
    Bon voilà je dois créer une sorte de calculatrice. Je dis une sorte car en fait je dois trouver un moyen de traiter une formule du type
    x+y+(a+b)*5 qui est une chaine de caractères. Sachant que x peut être une données récupérer dans un fichier.
    je ne sais pas si je me suis bien exprimer mais en gros à partir d'une chaine de caractère du type a+b*(x-y) je dois obtenir le résultat de ce calcul
    Merci d'avance pour votre aide

    C'est quoi le problème? Parce que moi je ne vois pas de questions^^
    (ni bonjours d'ailleurs... Pourtant j'ai vérifié, c'est pas le forum "emploi", ni "commande de projet" ici^^)

    Sinon, la formule sera TOUJOURS celle-ci, ou avec des variances?

    Parce qu'a vu de nez, ca sent l'analyse lexical : bon courage...

  4. #4
    Membre éprouvé Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Compiler des objets à la volée peut être une solution.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    La solution de onlava est surement la plus simple à réaliser...

    L'idée :

    Créer une assembly avec la classe CSharpCodeProvider, et ensuite appelé
    la fonction generée..

    En gros, l'idée est que tu écrives dans une chaine de caractère la formule à évaluer dans une fonction TEL QUE TU LE FERAIS si tu CODAIS cette fonction...
    (faut ajouter les using qui vont bien, etc...) compiler le bout de code que tu auras generer avec les options generation en mémoire, et puis voila...

    Cherche sur le net ou ici...

    CodeDom, CSharpCodeProvider

    J'crois meme qu'on peut esperer avoir un exemple dans le msdn

    The Monz, Toulouse

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 84
    Par défaut
    Merci pour votre aide !
    Je crois que pour le peu de temps que j'ai je vais tenter d'opter pour une solution plus simple (>_<")

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Compiler des objets ne règle pas le probleme...

    Ce qu'il te faut c'est une analyse syntaxique pour déterminer l'arbre syntaxique, une analyse sémantique pour déterminer l'arbre sémantique, puis interpréter cet arbre (la dernière phase est celle qui varie de la compilation, on interprète directement au lieu de compiler)
    Ce que tu peux faire oui c'est te comporter comme la CLR, et dans le cas d'une formule donnée pour tout un lot de données, tu peux a ce moment là compiler un code équivalent avec CodeDom et appeler directement l'assembly pour faire cette exécution ainsi plus rapide qu'une interprétation... mais je doute que pour un truc aussi simple, une telle débauche de moyens soit réellement NECESSAIRE.

    A savoir qu'il est très facile de réaliser un analyseur syntaxique sur le langage mathématique que tu décrit.... La nature même de la définition mathématique c'est qu'elle est RECURSIVE, tu as donc une idée de la tete de ton algo de resolution.

    tu prend une classe qui lit la formule, caractère par caractère.

    elle appel la fonction chargée de gérer ce qu'elle rencontre de façon récursive. Donc cette classe doit être appelable par une des autres fonctions.

    après tout ce que tu vois là c'est une grammaire ressemblant à cela :

    exp ::= bloc | opb | ident | const
    bloc ::= '(' exp ')'
    opb ::= exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp
    ident ::= lettre ident_t
    ident_t ::= alpha | alpha ident_t
    alpha ::= lettre | chiffre | _

    Cette grammaire est volontairement simpliste mais c'est le principe.
    Tu fonctionne sur le principe de l'essaie erreur.

    Quand tu lit un caractère, tu le retourne mais ne passe au suivant que s'il est réellement consommé par la méthode, tu peux donc laisser le choix à la méthode d'obliger à lire le suivant de par elle meme par une autre méthode genre
    Lexi.Next() pour passer au suivant et Lexi.Current() pour obtenir le caractère courant.
    Lexi est ta classe Lexicale qui retourne les unités lexicales. Dans ton cas, soit ton unité lexicale se charge de décoder elle meme les Ident soit elle laisse la grammaire le faire, dans le cas où elle le fait elle retourne non pas un caractère, mais une unité lexicale, plus facile à traiter pour l'analyseur de grammaire.

Discussions similaires

  1. Requête SELECT un peu spéciale
    Par Kokito dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 11h42
  2. envois de var $_GET un peu spécial
    Par frechy dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/11/2004, 11h00
  3. contrainte d'unicité un peu spéciale....
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/11/2004, 17h54
  4. Réponses: 4
    Dernier message: 05/07/2004, 13h17
  5. ORDER BY un peu spécial
    Par gromez dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 29/04/2004, 11h17

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