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 :

Aide à la réalisation d'une calculatrice en C


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Aide à la réalisation d'une calculatrice en C
    Dans le cadre de mes études ,je dois réaliser une calculatrice en langage C.

    Je vous expose le sujet :
    la calculatrice que je dois créer,doit pouvoir evaluer des expressions,declarer des fonctions ,affecter une valeur à un symbole
    exemple de calcul:
    eval + 1 2
    doit renvoyer 1+2 -> 3

    set x = 100
    doit donner x = 100

    set f(x) = - * 3 x y
    doit donner f(x) = 3*x-y

    eval f@1 + 1 x
    doit donner f(x+1) = 293
    @... désigne le nombre de parametres de la fonction

    Les opérateurs sont:
    +,-,/,*,~(moins unaire),@(plus unaire)

    IL faut également pouvoir définir une fonction qui a des valeurs suivant un intervalle(cf le lien)

    Je mets également le ligne sur des explications que le prof nous a donné :
    http://www-igm.univ-mlv.fr/~bedon/Enseignement/superCalculette/img0.htm

    Si quelqu'un pouvait m'aider,ce serait sympa.
    Merci d'avance


    Voici les structures que j'ai fait:
    typedef double feuille;

    typedef struct noeud2/*Pour les operateurs binaires*/
    {
    char operateur;
    struct noeud2*fg;
    struct noeud2*fd;
    }Noeud2;

    typedef struct noeud1/*Pour les operateurs unaires*/
    {
    char operateur;
    struct noeud1*fils;
    }Noeud1;

    typedef struct noeud
    {
    int arite;
    union{
    Noeud2 n2;
    Noeud1 n1;
    feuille f;
    }Type_noeud
    }Noeud;

    typedef Noeud*Arbre;

    typedef struct
    {
    int type;/*0:variable,1:fonction*/
    char*nom;
    char*parametres[];/*dans le cas d'un symbole representant une fonction*/
    int nb_parametres;
    Arbre a;/*valeur du symbole*/
    }SymbInfo;

    typedef struct
    {
    int taille;/*nombres d'element constituant la table*/
    SymbInfo tab[];
    }TableSymboles;

    Si quelqu'un a des ajouts ou des modifs à faire et peut m'aider à démarrer,ce serait sympa car j'ai du mal

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Eh bien, généralement, le calcul en notation préfixe (ou bcp plus souvent, en notation postfixe "Notation inverse polonaise") permet de calculer plus facilement pour une machine. L'intéret est qu'elle permet de reconstruire l'arbre de calcul sans difficulté.

    Par contre, je ne comprends pas pouquoi tu parles de parenthèses: Les notations préfixes/postfixes ont justement l'intéret de ne jamais en nécessiter...

    Ce qui est inhabituel, c'est que:
    1) on utilise du préfixe au lieu de postfixe,
    2) on te demande de faire la conversion de préfixe vers infixe (généralement, les exercices consistent à faire l'inverse)

    Enfin, pour convertir en infixe, le mieux selon moi est de reconstruire l'arbre (structures chaînées etc.), on peut ensuite l'afficher sous la forme que l'on veut (un parcours infixe de l'arbre affichera la notation en infixe, tout simplement. Ensuite, il s'agit juste de rajouter des parenthèses au bon endroit pendant le parcours)

    PS: Tu es sûr qu'on peut définir une fonction selon x+1 ? généralement, on ne fait pas ça même sur le papier...

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Eh bien, généralement, le calcul en notation préfixe (ou bcp plus souvent, en notation postfixe "Notation inverse polonaise") permet de calculer plus facilement pour une machine. L'intéret est qu'elle permet de reconstruire l'arbre de calcul sans difficulté.

    Par contre, je ne comprends pas pouquoi tu parles de parenthèses: Les notations préfixes/postfixes ont justement l'intéret de ne jamais en nécessiter...
    Les parenthèses sont nécessaires lorsqu'il faudra effectuer un calcul de ce type:
    1+2*3 car si l'on souhaite en réalité avoir ce calcul : (1+2)*3 il faut mettre des parenthèses car sinon il y aura un conflit.


    Ce qui est inhabituel, c'est que:
    1) on utilise du préfixe au lieu de postfixe,
    2) on te demande de faire la conversion de préfixe vers infixe (généralement, les exercices consistent à faire l'inverse)
    D'après le prof cette technique est plus simple car on a l'opérateur avant d'avoir les opérandes et la reconstruction de l'arbre est plus simple.


    Enfin, pour convertir en infixe, le mieux selon moi est de reconstruire l'arbre (structures chaînées etc.), on peut ensuite l'afficher sous la forme que l'on veut (un parcours infixe de l'arbre affichera la notation en infixe, tout simplement. Ensuite, il s'agit juste de rajouter des parenthèses au bon endroit pendant le parcours)

    PS: Tu es sûr qu'on peut définir une fonction selon x+1 ? généralement, on ne fait pas ça même sur le papier...
    Cette manière de faire nous a est imposé par le prof

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Non, pas besoin de parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Prefixe: + 1 * 2 3
    Infixe: 1+2*3
    Postfixe: 1 2 3 * +
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Prefixe: * + 1 2 3
    Infixe: (1+2)*3
    Postfixe: 1 2 + 3 *
    S'écrivent différemment en notations infixe et postfixe, qui sont faites pour reproduire fidèlement l'arbre de calcul.
    Cela évite toute nécessité de parenthèses.

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Re: Réalisation d'une calculatrice
    Citation Envoyé par Emmanuel Delahaye
    Quelle est la question sur le langage C ?
    Je voudrais savoir comment faire pour reconstituer l'arbre d'analyse car je ne sais pas comment faire pour récupérer les éléments.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut Re: Réalisation d'une calculatrice
    Citation Envoyé par Man_Utd
    Je voudrais savoir comment faire pour reconstituer l'arbre d'analyse car je ne sais pas comment faire pour récupérer les éléments.
    C'est relativement simple (peut-être pas vraiment facile, mais simple oui ) :
    1. Analyse lexicale de ton expression peut être écrit à la main en 1/2 heure
    2. Analyse syntaxique : voici un exemple écrit en 5 minutes (le temps d'écrire quoi ) :
      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
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      type structure TNoeud :
        Kind : Char; // '1' pour un nombre et le caract correspondant pour une opération
        Value : Float; // pour Kind = '1'
        Left : Pointeur vers TNoeud; // pour Kind <> '1'
        Right : Pointeur vers TNoeud; // pour Kind <> '1'
      fin type structure
       
      procedure RemplirNoeud(Noeud : Pointeur vers TNoeud);
        if PlusDeLexeme() then
          Erreur('Il manque des lexèmes');
        fin if
        if Lexeme.Classe = Nombre then
          Noeud->Kind <- '1';
          Noeud->Value <- Lexeme.Value;
          Noeud->Left <- NULL;
          Noeud->Right <- NULL;
          LexemeSuivant();
        else
          Noeud->Kind <- Lexeme.Operator;
          Noeud->Value <- Undefined;
          LexemeSuivant();
          Noeud->Left <- new TNoeud;
          RemplirNoeud(Noeud->Left);
          Noeud->Right <- new TNoeud;
          RemplirNoeud(Noeud->Right);
        fin if
      fin procedure
       
      procedure ConstruitArbreSyntaxique(Arbre : Pointeur vers TNoeud);
        PremierLexeme();
        RemplirNoeud(Arbre);
        if not PlusDeLexeme() then
          Erreur('Il y a trop de lexèmes');
        fin if
      fin procedure

  7. #7
    Invité
    Invité(e)
    Par défaut
    Comme tu veux coder en C, je te conseille de t'orienter vers bison/flex... qui font ca tres bien

  8. #8
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Je ne pense pas que le but de l'exercice soit d'utiliser flex et bison. Sinon le prof aurait demandé de parser une notation infixe.
    Les notations préfixes et suffixes sont vraiment simples à évaluer.

    Il suffit de construire l'arbre correspondant à l'expression. Pour afficher en infixe, un simple parcours suffit.
    Pour évaluer, tu fais aussi un parcours, en simplifiant les noeuds où les valeurs sont connues : si les 2 fils d'un opérateur ont une valeur connue, tu évalues.

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    J'ai édité mon post initial et rajouter des structures et un lien sur des explications données par mon prof mais je n'arrive toujours pas à démarrer mon projet.
    C'est surement du au fait que c'est la première fois alors si quelqu'un peut m'aider ce serait sympa car je galère

Discussions similaires

  1. Demande d'aide pour réalisation d'une requête SQL
    Par etiennegaloup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2013, 09h54
  2. Réalisation d'une calculatrice graphique en assembleur IA32
    Par yagami-psychiatre dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2013, 03h04
  3. [Dev-Pascal] [Débutant] Réalisation d'une calculatrice
    Par bababam dans le forum Autres IDE
    Réponses: 14
    Dernier message: 06/01/2010, 14h43
  4. [SWING][Débutant] aide à la réalisation d'une page
    Par zolotaya dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/07/2007, 11h10
  5. Réalisation d'une calculatrice scientifique
    Par diden138 dans le forum Pascal
    Réponses: 7
    Dernier message: 22/05/2006, 12h45

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