Notation polonaise infixée suffixée en c

Soyez le premier à donner votre avis sur cette source.

Vue 12 194 fois - Téléchargée 438 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();
cs_miss fafa
Messages postés
46
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
25 février 2009

21 avril 2007 à 16:39
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 ????????????
cs_miss fafa
Messages postés
46
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
25 février 2009

21 avril 2007 à 16:36
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
sharkyl
Messages postés
1
Date d'inscription
jeudi 21 octobre 2004
Statut
Membre
Dernière intervention
11 décembre 2004

11 déc. 2004 à 15:42
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!!!
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

11 déc. 2004 à 13:08
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.