Notation polonaise infixée suffixée en c

Soyez le premier à donner votre avis sur cette source.

Vue 11 947 fois - Téléchargée 417 fois

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

Ajouter un commentaire Commentaires
le code fonctionnement correctement j'ai tout simplement simplié en eliminant la bibliothèque conio.h , cprintf en print, aussi textcolort et clrscr();
Messages postés
46
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
25 février 2009

bien tu peut m'aider moi j'ai un mini projet dont une de ces etapes c ce programme est ce que tu peut m'aider pour realiser mon projet
merci ds tt les j'attend la reponse ????????????
Messages postés
46
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
25 février 2009

ce programme pas mal moi aussi je partage l'avie de kirua de rajoute ^ et % c tres important et ajoute une autre etapes pour les fonctions mathematiques ..............ds tt les je te remercie pour ce programme
Messages postés
1
Date d'inscription
jeudi 21 octobre 2004
Statut
Membre
Dernière intervention
11 décembre 2004

T'aurais du utiliser une structure de pile avec un pointeur o lieu dé tableaux(débil) et inclure lé nb négatifs pr ksa soi un travail complè!
mé jte félicite kom mem, c pa mal!!!
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

rajoute ^ et % (puissance et modulo), ça coûte rien puisque ce sont des opérateurs qui fonctionnent comme + - * et /.
Afficher les 8 commentaires

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.