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 :

Entrer une fonction mathématique au clavier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut Entrer une fonction mathématique au clavier
    Voila, depuis peu j'ai a faire un programme qui va me servir à traiter des équations.

    Pour ce faire j'ai donc besoin d'un programme me permettant de saisir une équation au clavier, et qui serait capable d'insérer cette équation dans plusieurs endroits de mon programme. Après quelques minutes de recherche sur Google, j'ai trouvé mon bonheur, les interpréteurs.

    Mais quand j'ai ouvert le fichier, zip, j'ai eu mal au crane^^. Pour moi qui débute dans le C, ce code m'a tout de suite incité a prendre une surdose de paracétamol^^.

    Ma question est donc assez simple, est ce que quelqu'un connait un interpréteur facile à utiliser, ou sinon quelqu'un pourrait il m'expliquer le fonctionnement d'un en particulier (pas forcement dans les détails, mais suffisamment pour pouvoir le faire fonctionner). Je sais on va me dire, tu t'embette pour rien^^.

    Le probleme c'est que j'utilise souvent une equation que je fixe au debut et qui changera a chaque fois qu'on fera tourner le programme, il serait donc plus utile de la rentrer au clavier que de la changer à chaque fois dans tout le code^^.

    Si je demande ça comme ça c'est bien entendu parce que le sujet principal de mon travail est un programme qui résout des équations et non pas un programme qui permet de saisir des équations^^ (mais si quelqu'un sait faire des TF directe, inverse, ainsi que les runge kutta d'ordre 4, il peut lever la main lol ^^).

    Donc voila, merci de votre attention et à bientôt j'espère^^.

    PS: je suis déjà passé sur le post:
    http://www.developpez.net/forums/d45...-mathematique/
    mais je n'arrive aps a me servir (et surtout a comprendre le fonctionnement) de cet interpreteur, donc si quelqu'un savait comment faire, pourrait il me laisser un petit post avec quelques pistes, parce que la je pédale dans la choucroutte^^.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    S'il est juste question d'interpréter des fonctions mathématiques sans faire de "calcul formel", les interpréteurs les plus simples sont ceux des exercices des manuels de C++ (je me souviens qu'il y en avait un dans le Deitel & Deitel).

    Ces interpréteurs font deux choses: Tokénisation+conversion en RPN, puis évaluation du calcul RPN avec une pile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    PS: je suis déjà passé sur le post:
    http://www.developpez.net/forums/d45...-mathematique/
    mais je n'arrive aps a me servir (et surtout a comprendre le fonctionnement) de cet interpreteur
    Qu'est-ce que tu n'as pas compris ? Pense à l'utilisation d'abord, avant de penser au fonctionnement (sauf si t'as envie de faire ton propre interpréteur).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut
    non, non, je te rassure, je pense à l'utilisation ^^(parce que le fonctionnement, la je dit chapeau, mais pas de mon niveau^^), le probleme c'est que je veux l'utiliser pour entrer une fonction mathématique quelconque au clavier (du genre x*(1-x)), et ensuite inclure cette expression dans divers endroits de mon code.

    Tout ça c'est pour éviter d'avoir a bidouiller le code à chaque fois qu'on voudras utiliser une autre fonction initiale.

    J'essais donc de le faire avec ton programme, ça marche tres bien si je lui met 2-3*8 par exemple, mais si je rentre x*(1-x) par exemple, la il me dit :

    empilerparam x = parametre indefini !
    erreur : err008

    et la je ne sais pas quoi faire lol^^. As tu déja eu ce genre de probleme ?

  5. #5
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Août 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2008
    Messages : 38
    Par défaut
    Melem:
    J'adore ton travail, je vais l'analyser pour comprendre les principes de parsing etc.
    • Je pense que tu devrais mettre les fonctions mathématiques dans des fichiers séparés.


    fan_de_stargate:
    Ca ne fonctionne qu'avec des valeurs numériques j'ai l'impression...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut
    Bon ben va flloir trouver une autre solution, j'ai vu sur d'autre forum que pour limiter la casse je peu utiliser un

    #define Fx x*(x-1)

    je suis obligé de retoucher mon code, mais au moins je ne le retouche qu'au debut^^.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 516
    Par défaut
    Citation Envoyé par fan_de_stargate Voir le message
    #define Fx x*(x-1)
    C'est même à ça que servent les macros. Tu peux même choisir de les passer à ton programme au moment de la compilation si tu ne veux pas retoucher le source. Toutefois, il s'agit d'une fonction mathématique. Il serait encore plus judicieux d'écrire une vraie fonction C pour cela et d'en modifier le contenu.

    Si, toutefois, tu cherches à modifier le comportement de cette fonction pendant que ton programme tourne, et que le nouveau comportement n'est pas connu à l'avance, alors il faudra se pencher un peu sur le parsing. Ce n'est pas forcément très difficile.

    Regarde du côté de Lex&Yacc. Le « hello world » de ces outils est justement la calculatrice quatre opérations ...

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par fan_de_stargate
    J'essaie donc de le faire avec ton programme, ça marche très bien si je lui met 2-3*8 par exemple mais si je rentre x*(1-x) par exemple, là il me dit :

    empilerparam x = parametre indefini !
    Evidemment, parce que x n'a pas été défini ! Que vaut x ? Je te rappelle que la fonction Calculer s'utilise ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double result;
    int retval;
     
    retval = Calculer("1 + 1", NULL, 0, &result);
     
    if (retval == EVALUER_SUCCESS)
        -- Succes (result = 2) --
    else
        -- Echec. Cause de l'erreur expliquee par retval. --
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    double result;
    PARAM params[1]; /* Nous aurons un (1) parametre : x */
    int retval;
     
    params[0].lpszName = "x"; /* Nom du parametre : x */
    params[0].Value = 0.5; /* x = 0.5 */
     
    retval = Calculer("x + 1", params, 1, &result);
     
    if (retval == EVALUER_SUCCESS)
        -- Succes (result = 1.5) --
    else
        -- Echec. Cause de l'erreur expliquee par retval. --
    N'oublie pas que :

    - InterpreteurInit doit être appelée une et une seule fois seulement dans le programme, avant toute autre utilisation de l'interpréteur. Elle initialise les variables globales. Elle garantit donc la souplesse de la bibliothèque ...

    - InterpreteurReset doit être appelée avant chaque calcul. Je pensais que cela contribuerait aussi à la souplesse de la bibliothèque mais je me suis après rendu compte qu'elle rend tout simplement plus difficile son utilisation ^^. Je vais la supprimer dans la prochaine mise à jour (demain ).

    - Calculer évalue une expression, paramétrée ou non.

    Comme vous êtes plus d'un ici à vous intéresser à la bibliothèque, et à avoir le même problème , je vais ajouter un mécanisme qui permet de gérer facilement les "paramètres indéfinis" mais aussi et surtout, plus d'exemples d'utilisation (et quand je dis plus ... ).

    Citation Envoyé par raphamil
    [...] c'est quoi les trucs comme ça là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		int i = 0, j = 0;
    		char c;
     
    		for(i = 0; (c = lpszString[i]) != '\0'; i++)
    Intérêt d'initialiser i 2 fois ?
    Aucune. Je vais enlever les initialisations.

    Citation Envoyé par raphamil
    Pourquoi est-ce que tu sépares les phases de déclaration/affectation des tes variables ?
    Question de lisibilité/maintenabilité du code (mais c'est assez subjectif ...). J'aime toujours voir "l'initialisation" d'une variable à la ligne où elle va pour la première fois être utilisée. Je n'applique pas cette méthode pour les fonctions de 2-3 lignes ...

    A+.

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Mise à jour effectuée . On a maintenant un interpréteur plus simple (je ne parle pas des sources ) mais qui sait faire plus de choses .

Discussions similaires

  1. Transcrire une fonction mathématique en code Matlab
    Par casper84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/03/2007, 18h04
  2. Tracer ellipse à partir d'une fonction mathématique
    Par juli1_h dans le forum Mathématiques
    Réponses: 2
    Dernier message: 13/03/2007, 10h43
  3. entrer une fonction en argument d'une autre fonction
    Par arno78 dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/09/2006, 15h29
  4. codage du calcul de dérivée d'une fonction mathématique
    Par pispa2005 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 08/01/2005, 21h54
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 12h36

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