Evaluation d'une expression parenthésée

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 171 fois - Téléchargée 21 fois

Contenu du snippet

mon code sert pour calculer directement des formules parenthesees qui comportent les operations +,-,/,*,% a condition
de mettre les operations dans des parentheses ex: 1+(5*6) a la place de 1+5*6.
il donne aussi les étapes intermédiaires pour la résolution de l'expression..

Source / Exemple :


#include<stdio.h>
#include<string.h>
           
   void tostring(int n,char* s){
           
      char r[12];
      sprintf(r,"%d",n);
      strcpy(s,r);
   }
           
   int operation(char* s){
           
      int a,b,i,j;
      char s1[11],s2[11];
      s1[0]=s[0];
   
   
      for(i=1;i<(int)strlen(s)&&s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/'&&s[i]!='%';i++)
         s1[i]=s[i];
      s1[i]='\0';
   
      sscanf(s,"%d",&a);
   
      if(i==(int)strlen(s))
         return a;
   
   
   
      for(j=i+1;j<(int)strlen(s);j++)
         s2[j-i-1]=s[j];
   
      s2[strlen(s)-i-1]='\0';
      sscanf(s2,"%d",&b);
   
   
      switch(s[i]){
         case '+':
            return a+b;
         case '-':
            return a-b;
         
         case '*':
            return a*b;
         
         case '/':
            return a/b;
         
         case '%':
            return a%b;
         default:
            return 0;
      }
   }
           
   int calculer(char *s){
           
      int i=-1,j=0,k;
      char r[2000],tampon[2000];
      while(s[j]!=')'&&j<(int)strlen(s))
      {   
         if(s[j]=='(')
            i=j;
         j++;
      }
      if(i==-1)
         return operation(s);
      for(k=0;k<i;k++)
         r[k]=s[k];
      r[k]='\0';
   
      for(k=i+1;k<j;k++)
         tampon[k-i-1]=s[k];
      tampon[k]='\0';
   
      tostring(calculer(tampon),tampon);
      strcat(r,tampon);
   
   
      for(k=j+1;k<(int)strlen(s);k++)
         tampon[k-j-1]=s[k];
      tampon[strlen(s)-j-1]='\0';
   
      strcat(r,tampon);
      printf("= %s\n",r);
      return calculer(r); 
   }

           
   int main(){
           
      char s[2000];
   while(1){
      scanf("%s",s);
      printf("votre expression = %d\n",calculer(s));
      }

      return 0;
   }

Conclusion :


j'espere que mon code traitera automatiquement les priorités entre les opérations mathématiques pour tous les types de données..

A voir également

Ajouter un commentaire Commentaires
Messages postés
20
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
26 mai 2011

d'accord l'explication est facile :

je suppose que l'expression est sous la forme d1opd2
d1 => un nombre
op => c'est l'opération à éffectuer
d2 => un autre nombre

je sais que c'est pas très clair vu du code C mais voila comment va les choses:
- je lis l'entier d1
- je lis l'opération à effectuer
- je lis l'entier d2

et suivant l'opération à éffectuer: je vais calculer le retour de la fonction soit a (+ ou * ou / ) b

j'éspère que j'était clair
Messages postés
1
Date d'inscription
samedi 9 avril 2011
Statut
Membre
Dernière intervention
9 avril 2011

saluut!!
merci pour le programme,je suis très besoin de ce programme mais malheureusement je n'arrive a le bien comprendre et surtout la fonction opération,et si je veux ajouter des fonction de le bibliothèque maths comme sin et cos et tan, dans la même expression mathématique.
merci d'avance
Messages postés
20
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
26 mai 2011

salut a tous
pour la remarque de Joky il suffit de modifier que la fonction calculer(s) en fonction retournant double est admettant comme paramétre des doubles
Merci pour votre remarque pertinente.
c'est justement l'un des perspectives de ma source.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Pourquoi ça ne choque que moi que 21 - 5/2 = 19 ?
Messages postés
20
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
26 mai 2011

salut a tous
merci pour vos remarques pertinentes
merci pour les compliments de Cyberboy2054 ...
je suis tout a fait d'accord avec SAKingdom il fallait mettre strlen(s) dans une variable L et travailler avec,pour la fonction itoa qui existe dans stdlib j'ai pas volu l'utilisé car j'ai su qu'il n'est pas une fonction standard ANSI.
encore une fois merci!
Afficher les 7 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.