level 13
dwing
楼主
因为有时候要用,所以写了一个,本以为会比较复杂,从编译原理的思想入手,但转个方向感觉算法其实是可以很简单的,于是随手写了一个.
支持范围:简单浮点数的+-*/运算和多层括号的支持,如果数值前要加+-号,必须用()括起来,如(-3).
表达式例子: 25/((2
+3
)*5)+(4-(1+2))
double CalcNative(const char*& p, int dep = 0)
{
for(double a = 0.f;;)
switch(*p)
{
case '+': if(dep) return a; a += CalcNative(++p, 1); break;
case '-': if(dep) return a; a -= CalcNative(++p, 1); break;
case '*': if(dep > 1) return a; a *= CalcNative(++p, 2); break;
case '/': if(dep > 1) return a; a /= CalcNative(++p, 2); break;
case '(': a = CalcNative(++p); break;
case ')': if(dep) return a; ++p;
case 0: return a;
default:
if(*p >= '0' && *p <= '9')
for(a = atof(p++); *p >= '0' && *p <= '9' || *p == '.'; ++p);
else ++p;
}
}
double Calc(const char* p)
{
return CalcNative(p);
}
PS: 这个程序只为代码量优化,不考虑速度
2009年12月01日 15点12分
1
支持范围:简单浮点数的+-*/运算和多层括号的支持,如果数值前要加+-号,必须用()括起来,如(-3).
表达式例子: 25/((2
+3
)*5)+(4-(1+2))
double CalcNative(const char*& p, int dep = 0)
{
for(double a = 0.f;;)
switch(*p)
{
case '+': if(dep) return a; a += CalcNative(++p, 1); break;
case '-': if(dep) return a; a -= CalcNative(++p, 1); break;
case '*': if(dep > 1) return a; a *= CalcNative(++p, 2); break;
case '/': if(dep > 1) return a; a /= CalcNative(++p, 2); break;
case '(': a = CalcNative(++p); break;
case ')': if(dep) return a; ++p;
case 0: return a;
default:
if(*p >= '0' && *p <= '9')
for(a = atof(p++); *p >= '0' && *p <= '9' || *p == '.'; ++p);
else ++p;
}
}
double Calc(const char* p)
{
return CalcNative(p);
}
PS: 这个程序只为代码量优化,不考虑速度