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)