Calculatrice rpn en langage c

Fermé
khaled - 24 févr. 2009 à 18:15
 techno - 20 mai 2014 à 01:29
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

1 réponse

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 févr. 2009 à 19:05
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
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
pour un pgm plus facile utiliser 'swith'
dans laguage pascal c'est case ******of
+
-
*
/
% (modulo)
0