楼上朋友说的不错,但是要考虑用什么数据库,因为为了这个功能安装某个数据库就不合算了,所以我建议楼主用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()
代码如下: 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()
/ \
1 -2
/ \
2 -1
/ \
3 4这样用来实现计算顺序,而操作类型(加减等)则以树节点的权的方式附加上去(CSDN这个文本框不好画图所以上面那个图没有。。)
最后遍历树 以运算得到结果
{
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;
}