Выражения состоят из double-констант, операторов +-*/ и скобок.
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english
#include <stdio.h> #include <stdlib.h> double eval(char*&p); bool is(char*&p, char c) { return *p == c ? p++, true : false; } double un(char*&p) { if (is(p, '(')) { double r = eval(p); if (!is(p, ')')) printf("expected ')'"); return r; } else return strtod(p, &p); } double muls(char*&p) { double r = un(p); for (;;) { if (is(p, '*')) r *= un(p); else if (is(p, '/')) r /= un(p); else return r; } } double eval(char*&p) { double r = muls(p); for (;;) { if (is(p, '+')) r += muls(p); else if (is(p, '-')) r -= muls(p); else return r; } } int main(int argc, char** argv) { double r = eval(argv[1]); if (*argv[1] == 0) printf("%lf", r); else printf("error at %s", argv[1]); return 0; }
для поддержки функций достаточно добавить еще три строки в double un(char*&p):
ReplyDeletedouble un(char*&p) {
if (is(p, '(')) {
double r = eval(p);
if (!is(p, ')')) printf("expected ')'");
return r;
} else if (strncmp(p, "sin", 3) { // 1
p+=3; //2
return sin(un(p)); //3
} else return strtod(p, &p);
}