programme Analyse et évaluation d’expressions arithmétiques en C
Hors ligneBaye7 Le 27/02/2009 à 15:19 Profil de Baye7 Configuration de Baye7

Bonjour,
je suis etudiant en formation informatique et j'ai un projet de classe a rendre. si quelqu'un peux m'aider a resoudre mon probleme. Le proje est comme ceci:
L’objet de ce problème est l’écriture d’un programme qui lit une expression arithmétique, vérifie sa syntaxe et, si la syntaxe est
correcte, donne la valeur de l’expression. Exemple (les interventions de l’utilisateur sont soulignées) :
A toi : 2 * 2 =
la syntaxe de l’expression est correcte
sa valeur est 4
A toi : (2 + 3) * (10 - 2) - 12 * (1000 + 15) =
la syntaxe de l’expression est correcte
sa valeur est -12140
A toi : 2 ++ 3 =
la syntaxe de l’expression est erronée

Mon code ci dessous marche avec les calculs sans parenthese  et  il me rende a inclure les parentheses comme l'exemple 2 ci-dessus  





# include<stdio.h>
# include<conio.h>
# include<malloc.h>
#include<math.h>
# include<string.h>
int ver_nbr(char x)
{
switch (x)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':return( 1);
default:return (0);
}
}
int ver_oper(char x)
{
switch (x)
{
case '+' :
case '-' :
case '*' :
case '/' :
case '^' :return( 1);
default :return (0);
}
}
int con_nbr(char x)
{
switch (x)
{
case '0':return( 0);
case '1':return( 1);
case '2':return( 2);
case '3':return( 3);
case '4':return( 4);
case '5':return( 5);
case '6':return( 6);
case '7':return( 7);
case '8':return( 8);
case '9':return( 9);
case '(':return( '(');
case ')':return( ')');
default:return (0);
}
}
float con_oper(char x)
{
switch (x)
{
case '+' :return( -1);
case '-' :return( -2);
case '*' :return( -10);
case '/' :return( -20);
case '^' :return( -100);
default :return (0);
}
}
int verif(char t[],int n)
{
  int ver_nbr(char x);
  int ver_oper(char x);
  int succe=1,i;
if(ver_oper(t[0])==1)
{succe=0;
}
if(ver_oper(t[n-1])==1)
{succe=0;
  }
  for(i=0;i<=n-2;i++)
{
if((ver_oper(t[i])==1)&& (ver_oper(t[i+1])==1))
{succe=0;
}
if((ver_nbr(t[i])==0)&& (ver_oper(t[i])==0))
{succe=0;
  }
}
return(succe);
}
void compact(int *i,int *nbrcase,float e[])
{ int k;
while(*i<=*nbrcase-1)
{
  e[*i]=e[*i+2];
  e[*i+1]=e[*i+3];
  *i=*i+2 ;
}
k=*i-1;
//farfree(e+k);
*nbrcase=*nbrcase-2;
}
  double expo (double a, unsigned int b)
{
  if (b == 0)
     {
       if (a == 0.0)
          {
            return 0.0;
          }
       return 1.0;
     }
  return a * expo(a, b-1);
}
int main(void)
{
char t[100];float *e,oper,min;
int l,result,i,nbr,r,f,nbrcase,k,entre,ent,s=0;
//clrscr();
//textcolor(4);
printf("BIENVENUE DANS LE PROGRAMME : Bamba_Badara_Mballo'S CALCULATOR\r\n");
printf("donner moi l'expression a calculer\n");
scanf("%s",&t);
l=strlen(t);
result=verif(t,l);
while(result==0)
{printf("vous avez mal introduit votre expression reessayez\n");
printf("donner moi l'expression a calculer\n");
scanf("%s",&t);
l=strlen(t);
result=verif(t,l);}
if(result==1)
{
for(i=0;i<=l-1;i++)
{
if(ver_oper(t[i])==1)
s=s+1;
}
nbrcase=2*s+1;
e=(float *)malloc(nbrcase*sizeof(float));
nbr=0;k=0;entre=1;f=0;
while(k<=l-1)
{
if(ver_oper(t[k])==0)
  {
     r=con_nbr(t[k]);
     nbr=nbr*10+r;
  }
if((ver_oper(t[k])==1)||(k==l-1))
  { entre=0;
      oper=con_oper(t[k]);
  }
  if(entre==0)
  {e[f]=nbr;
     if(f<=nbrcase-1)
     e[f+1]=oper;
     nbr=0;
     f=f+2;
     entre=1;
  }
  k++;
}
while(nbrcase>1)
{ min=e[1];ent=0;
for(i=1;i<=nbrcase-1;i=i+2)
  {
      if(e[i]<=min)
      {
          min=e[i];
          s=i;
      }
  }
if(min==-100)
{
  if(expo (e[s+1],e[s-1])!=0.0)
  e[s-1]=expo (e[s-1],e[s+1]);
  else
{ent=1;
nbrcase=0;}
  }
if(min==-20)
{
  if(e[s+1]!=0)
e[s-1]=e[s-1]/e[s+1];
  if(e[s+1]==0)
  {ent=1;
  nbrcase=0;}
  }
if(min==-10)
e[s-1]=(e[s+1]*e[s-1]);
if(min==-2)
e[s-1]=(e[s-1]- e[s+1]);
if(min==-1)
e[s-1]=(e[s+1]+ e[s-1]);
i=s;
if (nbrcase!=0)
{
compact(&i,&nbrcase,e);
}
  }
}
if(ent==1)
{printf("le calcule de cette expression est impossible vous avez fait une erreur dans la saisi\n");
printf("JE VOUS REMERCIE D'AVOIR UTILISER MON PROGRAMME A TRES BIENTOT ;c)\n");
getch();
}
else
{printf("le resultat du calucul de votre expression est %f \n",e[0]);
printf("JE VOUS REMERCIE D'AVOIR UTILISER MON PROGRAMME A TRES BIENTOT ;c)\n");
getch();
}
}
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels