本人用c#写了二个类,实现了混合运算,能够对计算公式的合法性进行判断,支持+-*/()运算,其变量本人用的是中文,有兴趣的朋友可以将其改为英文,代码如下:
private void Button3_Click(object sender, System.EventArgs e)
{
string text=this.TextBox5.Text.Trim ();
bool flag;
flag=语法检测(text);
if (flag==true)
{
string a=运算(text);
this.TextBox6.Text =a;
}
else
{
data1.Alert ("数据非法!",Page);
}
}
#region 语法检查
public static bool 语法检测(string 公式)
{
data data1=new data ();
公式=公式.TrimStart(' ');
int 正括号=0;
int 反括号=0;
int 正括号位置=0;
for(int i=0;i<公式.Length;i++)
{
string ab=公式[i].ToString ();
//清楚空格
switch(公式[i])
{
case '(':
{
正括号++;
正括号位置=i;
break;
}
case ')':
{
反括号++;
if((i-1)==正括号位置)
{
return false;
}
break;
}
case '+':case '-':case '*': case '/':
{
if(公式[i-1]=='(' || 公式[i-1]=='+' || 公式[i-1]=='-' || 公式[i-1]=='*' || 公式[i-1]=='/')
{
return false;
}
if (i+1>=公式.Length)
{
return false;
}
if( 公式[i+1]==')' || 公式[i+1]=='+' || 公式[i+1]=='-' || 公式[i+1]=='*' || 公式[i+1]=='/')
{
return false;
}
break;
}
}
}
return 正括号==反括号?true:false;
}
#endregion
#region 进行计算
public static string 运算(string 公式)
{
公式.TrimStart(' ');
int 正括号=0;
int 反括号=0;
while(公式.IndexOf('(')>-1)
{
for(int i=0;i<公式.Length;i++)
{
if(公式[i]=='(')
{
正括号=i;
}
if(公式[i]==')')
{
反括号=i;
string 直接公式=公式.Substring(正括号,反括号-正括号+1);
string 返回值=优先级运算(直接公式.Substring(1,直接公式.Length-2));
公式=公式.Replace(直接公式,返回值);
}
}
}
return 优先级运算(公式).ToString();
}
private static string 优先级运算(string 公式)
{
int 开始=0;
int 结束=0;
//处理乘除运算
for(int i=0;i<公式.Length;i++)
{
switch(公式[i])
{
case '+':case'-':
开始=i+1;
break;
case '*': case'/':
string 公式段=公式.Remove(开始,i+1);
int d;
for(d=0;d<公式段.Length;d++)
{
if(公式段[d]=='*' || 公式段[d]=='/' || 公式段[d]=='+' || 公式段[d]=='-')
{
结束=d;
break;
}
}
公式段=公式.Substring(开始,i-开始+d+1);
公式=公式.Replace(公式.Substring(开始,公式段.Length),直接运算(公式段).ToString());
break;
}
}
开始=0;
结束=0;
//处理乘除运算
for(int i=0;i<公式.Length;i++)
{
switch(公式[i])
{
case '+': case'-':
string 公式段=公式.Remove(开始,i+1);
int d;
for(d=0;d<公式段.Length;d++)
{
if(公式段[d]=='+' || 公式段[d]=='-')
{
结束=d;
break;
}
}
公式段=公式.Substring(开始,i+d+1);
公式=公式.Replace(公式.Substring(开始,公式段.Length),直接运算(公式段).ToString());
break;
}
}
return 公式;
}
private static Double 直接运算(string 公式)
{
Double a;
Double b;
int 长度=1;
for(int i=0;i<公式.Length;i++)
{
switch(公式[i])
{
case '*':
a=System.Convert.ToDouble(公式.Substring(0,i));
b=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
return a*b;
case '/':
a=System.Convert.ToDouble(公式.Substring(0,i));
b=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
return a/b;
case '+':
a=System.Convert.ToDouble(公式.Substring(0,i));
b=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
return a+b;
case '-':
a=System.Convert.ToDouble(公式.Substring(0,i));
b=System.Convert.ToDouble(公式.Substring(i+1,公式.Length-长度));
return a-b;
}
长度++;
}
return 0;
}
#endregion
浙公网安备 33010602011771号