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#

  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.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Par défaut plop
    salut,
    Si tu opte pour l'analyseur synthaxique/lexical et que l'anglais ne te rebute pas, va voir ici : http://www.codeproject.com/csharp/so..._evaluator.asp

    On y revoit un peu ce qu'est un analyseur lexical/synthaxique et comment utiliser le résultat. Généralement, dans ce genre de programme on ne code pas sois même les analyseurs, mais on va plutot utiliser un outil qui va nous donner le code tout fait pour notre grammaire. Ainsi en c/c++ il y a lex et yacch (ou bison et flex) , similairement en c# il y a ANTLR (c'est celui qui est utilisé dans le lien). Il suffit de donner la grammaire, et les mots a reconnaitre a ce genre de prog et cela génére du code c/c++/c#/... code qui sert a créer l'arbre semantique. Après c'est à nous d'utiliser cet arbre et de le décorer avec du code.

  9. #9
    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
    en fait le générateur d'analyseur syntaxique va renvoier un programme qui va générer ton arbre SYNTAXIQUE... c'est toujours à toi qu'incombe la charge de créer l'arbre sémantique... ce qui semble assez logique...

    Dans tous les cas il te faudra écrire ta grammaire... et pour une grammaire aussi simple, utiliser des générateurs est souvent plus fastidieux que de le faire soit meme...
    Maintenant si ta grammaire s'éttoffe et se compliquee fortement, utiliser ces généteurs sera mieux, sauf qu'il te faudra t'assurer que ta grammaire sera de type LALR(1) qui est le type le plus usité pour les générateurs syntaxiques.

  10. #10
    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 infiniment pour votre aide !! Je vais voir tout çà ^^

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par cinemania Voir le message
    Compiler des objets ne règle pas le probleme...
    tu dis ca parce que tu ne vois pas ce que c'est
    une analyse syntaxique prends des heures à coder, peut avoir des failles (oublis) et prends beaucoup de ligne

    j'ai deja fait un truc dans le genre pour des formules définies pendant l'execution
    et en gros il suffit de faire une sub sous forme de chaine de caractère, qui contient la chaine de caractère de la formule, de la compiler et de l'appeler
    elle se débrouille donc avec les valeurs au moment de l'appel, vu que c'est des variables.
    20 lignes de codes et toutes les fonctions mathématiques sont gérées ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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