L'idée est de transformer les expressions infixée en expression suffixée puis
de les evaluer.
Source / Exemple :
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//------------------------------------------------------------------------
typedef struct
{float tab [99]; //structure Pile
int taille ;
}pile;
char equation[99]; //tableau Saisie
int Q[99]; //tableau Intermediare
int tailleq;
int P[99]; //tableau Final
int taillep;
float valeur; //Resultat Final
//-------------------------------------------------------------------
void push(pile*p,float x)
{if (p->taille <100 )
{
p->tab [ p->taille]=x;
p->taille ++;
}
else
printf("pile pleine");
}
float pop (pile*p)
{
p->taille --;
return ( p->tab[p->taille]);
}
void init (pile*p)
{
p->taille=0;
}
int pile_pleine (pile*p)
{
if (p->taille==100)
return 1;
else
return 0;
}
int pile_vide (pile*p)
{ if (p->taille == 0)
return 1;
else
return 0;
}
float top (pile*p)
{
return p->tab[p->taille-1];
}
//-------------------------------------------------------------------
int prio(int x)
{
if ((x=='*')||(x=='/'))
return 2;
else
return 1;
}
//--------------------------------------------------------------------
void saisi0()
{
int i;
clrscr();
textcolor(4);
cprintf (" copyright 2004-2005 .sfar..MAMINO.corp.\n");
cprintf ("********************************************************************************\n");
("********************************************************************************\n");
}
//-----------------------------------------------------------------------
void saisie()
{char *e[1];
int k=0;
int i=0;
int A,B;
printf("entrer votre equation :\n");
scanf("%s",equation);
while (i<strlen(equation))
{
if ((equation[i]!='+' )&& (equation[i]!='-' ) && (equation[i]!='*') && (equation[i]!='/' ) && (equation[i]!='(' )&& (equation[i]!=')' ) )
{e[0]= equation[i] ;
A=atoi(e);
i++;
while ((equation[i]!='+' )&& (equation[i]!='-' ) && (equation[i]!='*') && (equation[i]!='/' ) && (equation[i]!='(' ) && (equation[i]!=')' )&& (i<strlen(equation)) )
{ e[0]= equation[i] ;
B=atoi(e) ;
A=((A*10)+B);
i++;
}Q[k]=(A);k++;
}
else
{ switch(equation[i])
{
case 43 :Q[k]='+' ;
break;
case 45 :Q[k]='-' ;
break;
case 42 :Q[k]='*' ;
break;
case 47 :Q[k]='/' ;
break;
case 40 :Q[k]='(' ;
break;
case 41 :Q[k]=')' ;
break;
} i++;k++;
}
}tailleq=k;
}
//--------------------------------------------------------------------
void infixe_suffixe()
{
pile stack;
int x;
int i=0;
init(&stack);
taillep=-1;
push(&stack,'(');
Q[tailleq]=')';
while ((pile_vide(&stack))==0)
{
if ((Q[i]!='+' )&& (Q[i]!='-' ) && (Q[i]!='*') && (Q[i]!='/' ) && (Q[i]!='(' ) && (Q[i]!=')'))
{taillep++;
P[taillep]=Q[i]; }
else
if((Q[i]=='(')) push (&stack,Q[i]);
else
{
if(Q[i]==')')
{while (top(&stack)!='(')
{x=pop(&stack);
taillep++;
P[taillep]=x;
}
pop(&stack);
}
else
{if ((top(&stack)!='(')&&(top(&stack)!=')') )
while (prio(top(&stack)) > prio(Q[i]) )
{ x=pop(&stack);
taillep++;
P[taillep]=x;
}push (&stack,Q[i]);
}
}i++;
}
}
//------------------------------------------------------------------
void suffixe_evaluation ()
{
pile stack;
int i;
float A,B,C;
//
init(&stack);
for (i=0;i<=taillep;i++)
{
if ((P[i]!='+') && (P[i]!='-')&&(P[i]!='*')&&(P[i]!='/'))
{push(&stack,P[i]); }
else
{A=pop(&stack);
B=pop(&stack);
switch(P[i])
{
case '+' :C=B+A ;
break;
case '-' :C=B-A ;
break;
case '*' :C=B*A ;
break;
case '/' :C=B/A ;
break;
}
push(&stack,C); }
valeur=top(&stack);
}
}
//--------------------------------------------------------------
void affiche_infixe()
{
char e[10];
char infixe[99];
int i,k=0,j;
for (i=0;i<=taillep;i++)
{ infixe[k]=' ';k++;
if ((P[i]!='+') && (P[i]!='-')&&(P[i]!='*')&&(P[i]!='/'))
{
itoa(P[i],e, 10);
for (j=0;j<strlen(e);j++)
{
infixe[k]=e[j];
k++;
}
}
else if
((P[i]=='+') || (P[i]=='-') || (P[i]=='*') || (P[i]=='/'))
switch(P[i])
{
case '+' :infixe[k]='+'; k++;
break;
case '-' :infixe[k]='-'; k++;
break;
case '*' :infixe[k]='*'; k++;
break;
case '/' :infixe[k]='/'; k++;
break;
}
}infixe[k]='\0';
textcolor(5);
cprintf("\n Equation infixe = %s",infixe );
}
//--------------------------------------------------------------
void affiche()
{
clrscr();
textcolor(4);
printf ("UTC Email :maminomamino@hotmail.com");
printf (" copyright 2004-2005 .sfar..MAMINO.corp.");
printf ("********************************************************************************\n");
cprintf("\n###########################################################");
printf("\n");
cprintf ("\n*********");
textcolor(6);
cprintf("Projet en C |Infixe-->Suffixe-->Resultat");
textcolor(4);
cprintf ("*********:");
printf("\n");
cprintf("\n###########################################################");
printf("\n");
printf("\n");
textcolor(6);
printf("\n");
cprintf("\n EQUATION :%s ",equation);
printf("\n");
affiche_infixe() ;
printf("\n");
textcolor(6);
cprintf("\n LE RESULTAT apres traitement :%f ",valeur);
}
//---------------------------------------------------------------
void main()
{
saisi0();
saisie();
infixe_suffixe();
suffixe_evaluation ();
affiche();
getch();
}
Conclusion :
pour me contacter : maminomamino@hotmail.com
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.