Notation polonaise infixée suffixée en c

Description

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

Codes Sources

A voir également

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.