1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| /* evaluation d'une formule arithmetique (+, -, * et entiers) et sans vraies parentheses */
#include <stdio.h>
/* à cause de strtol() */
#include <stdlib.h>
#define Base 10
/* a est la chaine à évaluer, les nombres sont écrits en base 10 */
int calcul (char *a)
{
char *p = a;
char *r = a;
char **q = &r;
/*
La chaine est vue comme une grande somme/différence de termes qui sont des produits.
Chaque produit est placé dans P et une fois complètement calculé, il est ajouté à S.
La chaine est supposée bien construite ie elle représente une formule mathématique valide.
*/
int P = 1, S = 0;
char signe = '+';
/* tant qu'on a pas examiné toute la chaine */
while (**q != '\0')
{
do /* Evaluation du produit courant */
{
if (*p == '(')
{
p++;
P *= strtol (p, q, Base);
*q = *q + 1;
p = *q + 1;
}
else
P *= strtol (p, q, Base);
p = *q + 1;
}
while (**q == '*');
/* On ajoute ou on retranche le produit au S courant */
if (signe == '+')
S += P;
else
S -= P;
/* on réinitialise */
signe = **q;
P = 1;
}
return S;
}
int main (void)
{/* Exemple illustratif */
char *a =
"2*3+8*2*4-8*4*2+8*(-9)*(-7)-8*(-10)*5-9*(-7)*(-9)*11+(-2)*3+5555";
printf ("%s =\n%d\n", a, calcul (a));
return 0;
} |
Partager