计算字符串表达式的程序
dwing吧
全部回复
仅看楼主
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
level 9
浮点数是可以以.开头的,比如.5
2009年12月02日 02点12分 2
level 13
dwing 楼主
1楼的程序只是刚刚写出来,还有很多改进的地方,稍微加点代码就可以支持正负号不需要加(),变量及一元函数,我已经实现了,代码就不列出来了,因为主要的算法框架并没变.
稍微提示一下dep主要表示优先级,我暂定的是:
1: +-
2: */%
3: +-(一元正负号)
4: 一元函数
2009年12月02日 05点12分 3
level 9
以前我在游戏外挂中就见过类似的东西,用来读取配置文件,还支持|| && ! ? :
2009年12月02日 09点12分 4
1