begin process at 2012 05 27 16:07:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > EVALUATION D'UNE EXPRESSION PARENTHÉSÉE

EVALUATION D'UNE EXPRESSION PARENTHÉSÉE




 Description

Cliquez pour voir la capture en taille normale
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

  • #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;
  • }
#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..


 Sources du même auteur

Source avec Zip Source avec une capture CLASS MATRICE C++
MEILLEURE MÉTHODE POUR CALCULER UN PUISSANCE
Source avec Zip Source avec une capture OBTENIR TOUTES LES NOMBRES PREMIERS DANS UNE GRANDE RANGÉE A...
Source avec une capture CALCUL DU FACTORIEL DES GRANDS NOMBRES EN TOUTE RAPIDITÉ
JOUR A PARTIR D'UNE DATE MM/JJ/YYYY

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj
Source avec Zip Source avec une capture ALGORITHME POUR ÉVALUER LES EXPRESSIONS ARITHMETIQUES par shnaykhs
Source avec Zip EVALUATION D'UNE EXPRESSION MATHÉMATIQUE COMPLEXE par Niels Abel
Source avec Zip Source avec une capture OTHELLO EN MODE GRAPHIQUE (CMUGRAPHICS)+IA (3 NIVEAUX) par Pistol_Pete

Commentaires et avis

Commentaire de Cyberboy2054 le 18/04/2007 19:45:20

Le code est court, bien écrit et montre ce qui est annoncé.
Bien joué et comme ta précédente source, je suis vraiment impressionné par la manière dont du arrive à réaliser des sources aussi claires tout en etant aussi concises

Commentaire de SAKingdom le 18/04/2007 20:45:49

Pourquoi je vois de strlen partout même dans les conditions des boucles ?
Extrêmement mauvais pour les performances tout ça (surtout dans les boucles), car on parcoure sans cesse la chaine inutilement.
Stock la taille de la chaine en début de fonction dans une variable et utilise cette même variable partout ou c'est nécessaire.

En passent, ton tostring est inutile. Il existe déjà une fonction pour convertir un int vers un char*: itoa

Commentaire de elkasimi2007 le 18/04/2007 23:31:52

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!

Commentaire de Joky le 19/04/2007 00:02:05

Pourquoi ça ne choque que moi que 21 - 5/2 = 19 ?

Commentaire de elkasimi2007 le 19/04/2007 00:54:45

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.

Commentaire de fatimakhaoula le 09/04/2011 11:41:57

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

Commentaire de elkasimi2007 le 24/05/2011 18:55:40

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Evaluation d'expression booléennes saisies sous forme de cheînes de caractères [ par dahlsimus ] Bonjour,j'ai besoin d'aide pour réaliser un programme en C qui évalue des expressions booléennes saisies sous forme de înes de caractères (ex: ((a.b)+ fonctions mathematique [ par fox66 ] bonjour,je suis debutant en C je dois ecrire un prog "verif" qui verifie les etapes suivantes:par exemple on a S = (ac) + (bc) + (a(a'+cd))1-le nbr de evaluation des performance [ par da45 ] Savez vous &nbsp;un api &nbsp;ou une biblioth&#232;que qui permet l&#8217;&#233;valuation des performance&nbsp;d&#8217;un d'un Evaluation d'une expression arithmetique en assembleur [ par BOX11 ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB Evaluation d'un vecteur de dimension n [ par pausecpp ] Bonjour,je veux faire un petit ( ou grand j'en ai aucune idée) programme qui demande à l'utilisateur d'entrer une fonction et un vecteur et de lui imp Evaluation d'une expression char* ou string [ par tsonamir ] Je suis appelé à faire un tableur dont chaque cellule contient une formule de type string ou char*,où les seuls opérateurs trouvés sont + - * / ( ) [


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales