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 :

algorithme de la notation polonaise inverse


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Par défaut algorithme de la notation polonaise inverse
    Bonjour,

    une petite explication de l'algo avant tout avec l'exemple suivant :

    Le calcul ((1 + 2) × 4) + 3 peut se lire intuitivement :
    je mets 1, (1)
    j'ajoute 2, ( 2 + )
    je multiplie par 4, (4 ×)
    j'ajoute 3. (3 +)
    ce qui donne simplement l’opération développée suivante 1 2 + 4 × 3 +


    Bon, j'ai trouvé un code (si dessous) qui fait le calcul mais il ne permet pas d'afficher l’opération développée avant de faire le calcul et je veux savoir s'il ya une possibilité de faire sans passer par les piles

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    /* evaluation d'une formule arithmetique (+, -, * et entiers) et sans vraies parentheses */
     
    #include <stdio.h>
     
    /* à cause de strtol() */
    #include <stdlib.h>
     
    #define Base 10
     
    /* a est la chaine à évaluer, les nombres sont écrits en base 10 */
    int calcul (char *a)
    {
      char *p = a;
      char *r = a;
      char **q = &r;
    /*
    La chaine est vue comme une grande somme/différence de termes qui sont des produits.
    Chaque produit est placé dans P et une fois complètement calculé, il est ajouté à S.
    La chaine  est supposée bien construite ie elle représente une formule mathématique valide.
    */
      int P = 1, S = 0;
      char signe = '+';
     /* tant qu'on a pas examiné toute la chaine */
      while (**q != '\0')
        {
          do /* Evaluation du produit courant */
            {
              if (*p == '(')
                {
                  p++;
                  P *= strtol (p, q, Base);
                  *q = *q + 1;
                  p = *q + 1;
                }
              else
                P *= strtol (p, q, Base);
              p = *q + 1;
            }
          while (**q == '*');
    /* On ajoute ou on retranche le produit au S courant */
          if (signe == '+')
            S += P;
          else
            S -= P;
    /* on réinitialise */
          signe = **q;
          P = 1;
        }
      return S;
    }
     
    int main (void)
    {/* Exemple illustratif */
      char *a =
        "2*3+8*2*4-8*4*2+8*(-9)*(-7)-8*(-10)*5-9*(-7)*(-9)*11+(-2)*3+5555";
     
      printf ("%s =\n%d\n", a, calcul (a));
      return 0;
    }

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    je ne comprends pas vraiment ta question. Que veux-tu faire ? Passer d'une expression infixe comme "-1+2*(3+4)" à son expression suffixe (rpn) "-1 2 3 4 + * +" puis donner le résultat de l'opération ?

  3. #3
    Membre éclairé
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Bonjour,

    je ne comprends pas vraiment ta question. Que veux-tu faire ? Passer d'une expression infixe comme "-1+2*(3+4)" à son expression suffixe (rpn) "-1 2 3 4 + * +" puis donner le résultat de l'opération ?
    en effect je veux passer d'une opération arithmétique simple du genre
    ((1 + 2) × 4) + 3
    à la notation polonaise inverse expliquée comme suit
    je mets 1, (1)
    j'ajoute 2, ( 2 + )
    je multiplie par 4, (4 ×)
    j'ajoute 3. (3 +)

    ce qui donne simplement 1 2 + 4 × 3 +

    et à la fin après affichage de la NPI faire le calcule
    merci

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Pour transformer une expression infixe en npi simplement alors tu peux utiliser un algorithme à base de deux piles (il est classique et tu trouveras de nombreuses références grâce à google). Ton code est issu d'un tel algorithme mais calcule le résultat en place. Si tu veux afficher et manipuler l'expression en npi alors il te faudra garder la pile finale qui va contenir l'expression.
    Une autre approche serait d'utiliser des arbres binaires pour représenter l'expression. Un parcours infixe te donne l'expression classique, un parcours suffixe te donne la npi.

    Je suppose qu'il s'agit d'un exercice qui te demande d'utiliser des piles ?

    Edit: ok ... tu ne veux pas utiliser les piles
    Pourtant l'algorithme utilisant les piles est le plus simple, celui avec les arbres est un peu plus complexe ...

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Sans pile explicite, tu auras une fonction récursive, dont la pile d'appel sera la pile implicite.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Edit: ok ... tu ne veux pas utiliser les piles
    Pourtant l'algorithme utilisant les piles est le plus simple, celui avec les arbres est un peu plus complexe ...
    Et parcourir un arbre sans pile est encore plus complexe! (et n'est possible que si l'arbre est doublement chaîné).
    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.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai du mal avec cette notation.... Je lis qu'elle est utile car elle supprime le besoin de parenthèses. Or, sur l'exemple donné, il suffit de ne pas tenir compte de la priorité des opérateurs et d'effectuer les calculs de gauche à droite pour avoir le résultat :
    ((1 + 2) × 4) + 3 --> 1 + 2 × 4 + 3 --> 3 x 4 + 3 --> 12 + 3 --> 15
    Si quelqu'un a un exemple plus parlant je suis preneur...

  8. #8
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Et parcourir un arbre sans pile est encore plus complexe! (et n'est possible que si l'arbre est doublement chaîné).
    Bah avec une structure récursive on a intérêt à utiliser des algorithmes récursifs qui sont souvent plus simples à exprimer et [troll]bien plus élégants [/troll]. Évidemment on utilise implicitement le stack comme pile ...
    Le gros avantage de la représentation par arbre est d'obtenir aisément les 3 notations avec un simple parcours.

    Citation Envoyé par Bktero Voir le message
    J'ai du mal avec cette notation.... Je lis qu'elle est utile car elle supprime le besoin de parenthèses. Or, sur l'exemple donné, il suffit de ne pas tenir compte de la priorité des opérateurs et d'effectuer les calculs de gauche à droite pour avoir le résultat :
    ((1 + 2) × 4) + 3 --> 1 + 2 × 4 + 3 --> 3 x 4 + 3 --> 12 + 3 --> 15
    Si quelqu'un a un exemple plus parlant je suis preneur...
    La notation infixe nécessite un parenthésage pour passer outre les priorités des opérateurs.
    Sans priorités et sans parenthèse il y a ambigüité sur 1+2*3 qui peut donner (1+2)*3 ou 1+(2*3).
    La notation postfixe en revanche n'en a pas besoin, 1 2 + 3 * n'a qu'une interprétation possible (1+2)*3, tout comme 1 2 3 * + -> 1+(2*3) mais elle n'est pas unique -> 2 3 * 1 +

Discussions similaires

  1. Conversion en notation polonaise inversée ou postfixée
    Par pcmessi dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/02/2011, 15h23
  2. Interpréteur Notation Polonaise Inverse
    Par arkhamon dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/02/2010, 14h59
  3. Réponses: 6
    Dernier message: 02/11/2008, 11h57
  4. explications sur notation polonaise, postfixe
    Par Inh[Star]Noz dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 01/11/2008, 13h25

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