begin process at 2010 02 10 12:38:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > ANALYSEUR D'EXPRESSION

ANALYSEUR D'EXPRESSION


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :16/07/2003 Date de mise à jour :31/07/2003 17:04:34 Vu / téléchargé :1 796 / 197

Auteur : JCDjcd

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


 Description

Voici toutes les operations:
l'addition <a> avec <b>                      : a+b
la soustraction <a> auquel on hote <b>       : a-b
le moins unaire, l'oppose de <a>             : -a
la mulplication de <a> avec <b>              : a*b
la division de <a> par <b>                   : a/b

De plus il y a la possibilite de mettre des parentheses !
Les blancs ne sont pas admis, mais ceci est facilement resolvable ...

Pour quitter rentrer comme formule "quit", en miuscule.

Voici quelques exemples :
1+2+3+4+5+6+7+8+9
12/3/2
3.1415926535/2
(1+8)*-( -4-5)
((1+2)-5)/4
quit

Source

  • #ifndef _EXPR_H_
  • #include "expr.h"
  • #endif // _EXPR_H_
  • //========================================================
  • static jmp_buf jumpError;
  • static char bufError[256];
  • //========================================================
  • static double Expr0(char **pText);
  • static double Expr1(char **pText);
  • static double Expr2(char **pText);
  • //========================================================
  • double StringToDouble(char **pText)
  • {
  • double a;
  • a = 0.0;
  • do
  • {
  • char c;
  • c = **pText;
  • if(c < '0' || c > '9')
  • {
  • break;
  • }
  • a *= 10.0;
  • a += c - '0';
  • (*pText) ++;
  • }while(TRUE);
  • if(**pText == '.')
  • {
  • double f;
  • (*pText) ++;
  • f = 1;
  • do
  • {
  • char c;
  • c = **pText;
  • if(c < '0' || c > '9')
  • {
  • break;
  • }
  • f /= 10.0;
  • a += f * (c - '0');
  • (*pText) ++;
  • }while(TRUE);
  • }
  • return a;
  • }
  • //========================================================
  • // gere les constantes
  • static double Expr2(char **pText)
  • {
  • // le moins unaire
  • if(**pText == '-')
  • {
  • (*pText) ++;
  • return - Expr2(pText);
  • }
  • else
  • {
  • switch(**pText)
  • {
  • case '(':
  • {
  • double a;
  • (*pText) ++;
  • a = Expr0(pText);
  • if(**pText != ')')
  • {
  • sprintf(bufError,"Fin de parenthese attendue");
  • longjmp(jumpError,1);
  • }
  • (*pText) ++;
  • return a;
  • }
  • default:
  • {
  • char c;
  • c = **pText;
  • if(c < '0' || c > '9')
  • {
  • sprintf(bufError,"Nombre attendu : \"%s\"",*pText);
  • longjmp(jumpError,1);
  • }
  • return StringToDouble(pText);
  • }
  • }
  • }
  • }
  • //========================================================
  • // gere les operateurs :
  • // multiplication (*)
  • // division (/)
  • static double Expr1(char **pText)
  • {
  • // <a> pour le nombres de gauche
  • double a;
  • a = Expr2(pText);
  • do
  • {
  • switch(**pText)
  • {
  • case '*':
  • {
  • (*pText) ++;
  • a *= Expr2(pText);
  • break;
  • }
  • case '/':
  • {
  • double b;
  • (*pText) ++;
  • b = Expr2(pText);
  • // si b appartient [-e ; +e]
  • if(b >= -EPSILON && b <= EPSILON)
  • {
  • sprintf(bufError,"Division par 0 !");
  • longjmp(jumpError,1);
  • }
  • a /= b;
  • break;
  • }
  • default:
  • {
  • return a;
  • }
  • }
  • }while(TRUE);
  • }
  • //========================================================
  • // gere les operateurs :
  • // addition (+)
  • // soustraction (-)
  • static double Expr0(char **pText)
  • {
  • // <a> pour le nombres de gauche
  • double a;
  • a = Expr1(pText);
  • do
  • {
  • switch(**pText)
  • {
  • case '+':
  • {
  • (*pText) ++;
  • a += Expr1(pText);
  • break;
  • }
  • case '-':
  • {
  • (*pText) ++;
  • a -= Expr1(pText);
  • break;
  • }
  • default:
  • {
  • return a;
  • }
  • }
  • }while(TRUE);
  • }
  • //========================================================
  • BOOL EvaluateExpr(
  • char *text,
  • double *pRes,
  • char *buf
  • )
  • {
  • sprintf(bufError,"");
  • if(!setjmp(jumpError))
  • {
  • *pRes = Expr0(&text);
  • // si l'on a eu tous les caracteres
  • if(*text == '\0')
  • {
  • return TRUE;
  • }
  • else
  • {
  • sprintf(bufError,"Chaine non-finie : \"%s\"",text);
  • }
  • }
  • // sinon toutes ces conditions, erreur ;
  • if(*bufError == '\0')
  • {
  • sprintf(buf,"Erreur non-traitee !");
  • }
  • else
  • {
  • strcpy(buf,bufError);
  • }
  • return FALSE;
  • }
#ifndef _EXPR_H_
  #include "expr.h"
#endif // _EXPR_H_
//========================================================
static jmp_buf  jumpError;
static char     bufError[256];

//========================================================
static double Expr0(char **pText);
static double Expr1(char **pText);
static double Expr2(char **pText);

//========================================================
double StringToDouble(char **pText)
{
double a;

a = 0.0;

do
  {
  char c;
  c = **pText;
  if(c < '0' || c > '9')
    {
    break;
    }
  a *= 10.0;
  a += c - '0';
  (*pText) ++;
  }while(TRUE);

if(**pText == '.')
  {
  double f;
  (*pText) ++;

  f = 1;
  do
    {
    char c;
    c = **pText;
    if(c < '0' || c > '9')
      {
      break;
      }
    f /= 10.0;
    a += f * (c - '0');
    (*pText) ++;
    }while(TRUE);
  }

return a;
}
//========================================================
// gere les constantes
static double Expr2(char **pText)
{
// le moins unaire
if(**pText == '-')
  {
  (*pText) ++;
  return - Expr2(pText);
  }
else
  {
  switch(**pText)
    {
    case '(':
      {
      double a;
      (*pText) ++;
      a = Expr0(pText);
      if(**pText != ')')
        {
        sprintf(bufError,"Fin de parenthese attendue");
        longjmp(jumpError,1);
        }
      (*pText) ++;
      return a;
      }
    default:
      {
      char c;
      c = **pText;
      if(c < '0' || c > '9')
        {
        sprintf(bufError,"Nombre attendu : \"%s\"",*pText);
        longjmp(jumpError,1);
        }
      return StringToDouble(pText);
      }
    }
  }
}
//========================================================
// gere les operateurs :
// multiplication (*)
// division (/)
static double Expr1(char **pText)
{
// <a> pour le nombres de gauche
double a;
a = Expr2(pText);
do
  {
  switch(**pText)
    {
    case '*':
      {
      (*pText) ++;
      a *= Expr2(pText);
      break;
      }
    case '/':
      {
      double b;
      (*pText) ++;
      b = Expr2(pText);
      // si b appartient [-e ; +e]
      if(b >= -EPSILON && b <= EPSILON)
        {
        sprintf(bufError,"Division par 0 !");
        longjmp(jumpError,1);
        }
      a /= b;
      break;
      }
    default:
      {
      return a;
      }
    }
  }while(TRUE);
}
//========================================================
// gere les operateurs :
// addition (+)
// soustraction (-)
static double Expr0(char **pText)
{
// <a> pour le nombres de gauche
double a;
a = Expr1(pText);
do
  {
  switch(**pText)
    {
    case '+':
      {
      (*pText) ++;
       a += Expr1(pText);
      break;
      }
    case '-':
      {
      (*pText) ++;
       a -= Expr1(pText);
      break;
      }
    default:
      {
      return a;
      }
    }
  }while(TRUE);
}
//========================================================
BOOL EvaluateExpr(
                 char   *text,
                 double *pRes,
                 char   *buf
                 )
{
sprintf(bufError,"");
if(!setjmp(jumpError))
  {
  *pRes = Expr0(&text);
  // si l'on a eu tous les caracteres
  if(*text == '\0')
    {
    return TRUE;
    }
  else
    {
    sprintf(bufError,"Chaine non-finie : \"%s\"",text);
    }
  }
// sinon toutes ces conditions, erreur ;
if(*bufError == '\0')
  {
  sprintf(buf,"Erreur non-traitee !");
  }
else
  {
  strcpy(buf,bufError);
  }
return FALSE;
} 


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 Sources de la même categorie

Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

Commentaires et avis

Commentaire de NiFF le 18/07/2003 02:17:35

Très bon boulot, surtout pour les niveaux de parenthèses.
Suggestions: des commentaires et ça serait parfait.
Des fonctions, genre sinus, cosinus, exp, ln, log, tout ça est défini dans math.h, mais pas super facile à implémenter.

Bravo encore, je m'attendais à entrez a, entrez b, entrez + - / * , résultat=...

9/10

Commentaire de NiFF le 18/07/2003 02:18:19

J'oubliais, attention à la catégorie, tu postes toujours en .Net

Commentaire de JCDjcd le 18/07/2003 10:53:00

La fleme ...

Commentaire de rromain93 le 29/11/2004 21:19:09

il é possible de traiter le meme exercices mais avec des piles?

Commentaire de JCDjcd le 04/12/2004 19:47:42

Tu peux etre plus precis ? je ne comprend pas tres bien

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,608 sec (3)

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