1 réponse
Salut,
Voici un algo
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
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
FINExemple
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
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;
}
dans laguage pascal c'est case ******of
+
-
*
/
% (modulo)