Calculatrice rpn en langage c

khaled -  
 techno -
Bonjour,
Debutant en programmation je doit pogrammer une calculatrice rpn et je ne sait comment m'y prendre.
de ce fait j'espere que uelu'un poura me venir en aide en me donnant un petit code source où je pourai m'inspirer
Coordialement
Configuration: Linux
Firefox 3.0.6

1 réponse

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Voici un algo
    DEBUT
    
    TANT QUE il y a un opérande ou un opérateur 
      SI nombre ALORS
         empiler 
      SINON SI opérateur ALORS
        dépiler opérande
        effectuer l'opération
        empiler le résultat
      SINON SI caractère fin ligne ALORS
        dépiler la valeur du sommet et afficher
      SINON
        erreur
      FIN SI
    FIN TANT QUE
    
    FIN
    Exemple

    Si j'écris au clavier
    3 4 + 5 3 - * pour (3+4)*(5-3)

    Suivant l'algo
    3 - empiler
    4 - empiler
    + - je depile 4, je depile 3 et je fais l'opération 3+4 =7 (ou 4+3 commutativité) j'empile le résultat
    5 - empiler
    3 - empiler
    - - je depile 3 dans une variable temp , je depile 5 et je fais l'opération 5 - 3 (temp - à cause de non commutativité) et j'empile le résultat 2
    * - je depile 2, je depile 7 et je fait le calcul 2*7 et j'empile
    accéder au sommet et affiché le résultat = 14
    2
    1. khaled
       
      Re bonjour,
      en fait j'avais compris le fait ue je devait utiliser une pile et je l'ai fait mais g des erreurs de segmentations et je n'arrive pas à les enlever, meme avec la commande valgrind j'arrive pas à bien comprendre.
      Voilà le code de mon programme en esperant que vous pouriez me venir en aide.



      #include <stdio.h>
      #include<stdlib.h>
      #include<string.h>
      #define TAILLE_PILE 100
      typedef int data;
      typedef struct{

      data tab[TAILLE_PILE];
      int sommet;/*sommet de la pile*/
      }Pile;


      void InitialiserPile(Pile* P)
      {int i;
      P=(Pile*)malloc(sizeof(Pile));
      if(P!=NULL)
      {
      P->sommet=0;
      for(i=0;i<TAILLE_PILE;i++)
      P->tab[i]=0;
      }
      }

      int Empiler(Pile *P,data d)
      {
      if(P->sommet==TAILLE_PILE)
      return 0;
      else
      {
      P->tab[P->sommet]=d;
      (P->sommet)++;
      return 1;
      }

      }

      int Depiler(Pile *P, data *d)
      {data rec;

      if(P->sommet==0)
      return 0;
      else
      {
      (P->sommet)--;
      rec=P->tab[P->sommet];
      P->tab[P->sommet]=0;
      return rec;
      }
      }


      int EstVidePile(Pile *P)
      {
      if(P->sommet==0)
      return 1;
      else
      return 0;

      }


      int EstOperateur(char* ch)
      {int i;
      if(sscanf(ch,"%d",&i)==1)
      /*if('0'<=ch[0] && ch[0]<='9')*/
      return 1;

      /*if(ch[0]=='*' ||ch[0]=='-'||ch[0]=='/' ||ch[0]=='+')
      return 2;*/
      else return 0;

      }
      void Operation(data x,data y, char c, data *resultat)
      {

      if(c=='+')
      *resultat=(x+y);
      if(c=='*')
      *resultat=(x*y);
      if(c=='-')
      *resultat=(x-y);

      if(c=='/')
      {
      if(y!=0)
      *resultat=(x/y);
      else
      printf("division par zero impossible: erreur ");
      }

      }

      data Evaluation(char* ch,Pile* P)
      {int i=0;

      data temp,temp1;
      data resultat='\0';

      if(EstOperateur(ch)==1)
      {
      if(Empiler(P,ch[0])==0)
      printf("Erreur, la pile est pleine");
      else
      while(ch[i]!='\0')
      ch[i]=ch[i+1];
      }
      i=0;
      if(EstOperateur(ch)==0)
      {
      if((temp=Depiler(P,&(P->tab[P->sommet-1])))==0)
      printf("Erreur, la pile est vide");

      else
      { if((temp1=Depiler(P,&(P->tab[P->sommet-1])))==0)
      printf("Erreur, la pile est vide");
      else
      {
      Operation(temp1,temp,ch[0],&resultat);
      Empiler(P,resultat);
      }
      }

      while(ch[i]!='\0')
      ch[i]=ch[i+1];
      }
      i=0;

      free(ch);
      printf("le resultat est : %d ",resultat);return resultat;
      }


      int main(void)
      {
      Pile P;
      char* chaine;
      chaine=(char*)malloc(sizeof(char)*TAILLE_PILE);
      if(chaine!=NULL)
      {
      scanf("%s",chaine);
      InitialiserPile(&P);
      Evaluation(chaine,&P);

      free(chaine);
      free(&P);
      }
      return 0;
      }
      0
    2. techno
       
      pour un pgm plus facile utiliser 'swith'
      dans laguage pascal c'est case ******of
      +
      -
      *
      /
      % (modulo)
      0