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 / Exemple :
#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))
{
// 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;
}
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.