例如:我写入 1+2*3/4+(9-1)
然后计算出结果,如何实现呢?
请前辈给个思路,引导一下....记得在脚本里有eval这样的函数...但是不知道他是如何实现的...........求方法

解决方案 »

  1.   

    sSQL = "select 1+2*3/4+(9-1)"利用数据库SQL
      

  2.   

    楼上朋友说的不错,但是要考虑用什么数据库,因为为了这个功能安装某个数据库就不合算了,所以我建议楼主用ODBC驱动来完成,无须任何数据库,Windows自带ODBC。
    代码如下:        Dim Cn As New Odbc.OdbcConnection
            Cn.ConnectionString = "Dsn=dBASE Files"
            Cn.Open()
            Dim s = "1+2*3/4+(9-1)" '这里写表达式。
            Dim cmd = New Odbc.OdbcCommand("select " & s, Cn)
            Dim R As Odbc.OdbcDataReader
            R = cmd.ExecuteReader
            R.Read()
            Dim D As Double = R(0)
            MsgBox(D) '这里的D就是结果。
            R.Close()
            cmd.Dispose()
            Cn.Close()
            Cn.Dispose()
      

  3.   

    http://www.chenjiliang.com/Article/View.aspx?ArticleID=2767&TypeID=84
      

  4.   

    http://www.chenjiliang.com/Article/View.aspx?ArticleID=2768&TypeID=84
      

  5.   

    实现的原理是分解表达式的元素,然后组成一个二叉树,比如  :1+2*(3-4) -1
     / \
    1  -2
       / \
      2   -1
         /  \
        3    4这样用来实现计算顺序,而操作类型(加减等)则以树节点的权的方式附加上去(CSDN这个文本框不好画图所以上面那个图没有。。)
    最后遍历树 以运算得到结果
      

  6.   

    Console.WriteLine(new DataTable().Compute("1+2*3/4+(9-1)", null));
      

  7.   

    ^o^ 记得 using System.Data;
      

  8.   

    以前学数据结构是C++写的,看看吧void result(char* r)
    {
    double getnum(int&); 
    double a[200]={0.};
    double b[200]={-70.};
    int top=1, p=0;
    double c; //转后缀式
    for (int i=1;;)
    {
    if ( (c=getnum(p)) >= 0. )
    a[i++]=c;
    else
    {
    while( (int)c%10 >= (int)b[top-1]%10 && top>0 && c!=-51. )
    a[i++]=b[--top];
    b[top]=c;
    top++;
    }
    if ( b[0] != -70. ) break;
    } //求解
    top=1;
    b[0]=-70.;
    for (i=1;;i++)
    {
    if ( a[i] < 0 )
    {
    switch((int)a[i]/10)
    {
    case -1:
    b[top-2] = b[top-2]+b[top-1];
    top--;
    break;
    case -2:
    b[top-2] = b[top-2]-b[top-1];
    top--;
    break;
    case -3:
    b[top-2] = b[top-2]*b[top-1];
    top--;
    break;
    case -4:
    b[top-2] = b[top-2]/b[top-1];
    top--;
    break;
    }
    if (a[i] == -70.)
    break;
    }
    else
    b[top++]=a[i];
    }
    void dou2str(double,char*);
    dou2str(b[1],r);
    }double getnum(int& p)
    {
    double c;
    if ( s[p]=='.' || ( s[p]>='0'&&s[p]<='9' ) )
    {
    double str2dou(int& p);
    c=str2dou(p);
    }
    else
    {
    switch (s[p])
    {
    case '+':
    c=-12.;
    break;
    case '-':
    c=-22.;
    break;
    case '*':
    c=-33.;
    break;
    case '/':
    c=-43.;
    break;
    case '(':
    c=-51;
    break;
    case ')':
    c=-64;
    break;
    }
    p++;
    }
    return c;
    }double str2dou(int& p)
    {
    double c=0.;
    if ( s[p]!='.' )
    {
    while ( s[p]!='.' && s[p]>='0' && s[p]<='9' )
    {
    c*=10;
    c+=(s[p]-48);
    p++;
    }
    }
    if ( s[p]=='.' )
    {
    p++;
    for (int i=1;s[p]>='0' && s[p]<='9';)
    {
    i*=10;
    c+=((double)(s[p]-48)/(double)i);
    p++;
    }
    }
    return c;
    }void dou2str(double a, char* b)
    {
    int n,p=0,t=1;
    if (a<0.)
    {
    b[0]='-';
    a=-a;
    p++;
    }
    for (n=(int)a;n>=t;n=(int)a)
    {
    t*=10;
    while (n>=t)
    n=n/10;
    b[p]=n%10+48;
    p++;
    }
    b[p]='.';
    p++;
    t=1;
    for (;;)
    {
    if ((double)(a*t-(int)(a*t)) == 0.)
    break;
    t*=10;
    b[p]=(int)(a*t)%10+48;
    if(b[p]<'0' || b[p]>'9') //精度限制
    break;
    p++;
    }
    b[p]=0;
    }
      

  9.   

    http://www.cnblogs.com/skyiv/archive/2007/08/21/Calc.html