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
24 févr. 2009 à 19:05
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
24 févr. 2009 à 19:46
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;
}
20 mai 2014 à 01:29
dans laguage pascal c'est case ******of
+
-
*
/
% (modulo)