代码
private void button2_Click(object sender, EventArgs e)
{
string expression = CleanString(tbInput.Text);//MessageBox.Show(expression);
if(expression .IndexOf ('(')>=0)//找到括号
{
int i = expression .IndexOf ('(');
int j = expression.IndexOf(')');
string strsub = expression.Substring(i, j - i-1);//取出括号中的内容
double m = CalculateSimple(strsub);//计算括号的内容
expression = expression.Substring(0, i) + m.ToString() + expression.Substring(j + 1);//把计算结果加入剩余解析式字符串
}
double re = CalculateSimple(expression);//对表达式重新计算
tbOutcome.Text = re.ToString();
} public double CalculateSimple(string ex) //取出括号内容进行计算,包含运算符和数值
{
double end;
string a="",b="",t="";
char[] chEx = ex.ToCharArray();//把字符串转化为字符数组
char f, s='0';
int n = 0;//计数
int w =0;//记录位置
for (int i = 0; i < chEx.GetLength(0); i++)//循环取出字符,判断是否为运算符
{
char c = chEx[i];
if (c == '.' || (c >= 0 && c <= 9)) continue;//如果是数值就重新查找
f = c;//找到一个运算符
n++;
if (n < 2)//如果运算符数少于2,再查找
{
w = i;
s = c;//把字符给第二个操作符
continue;
}
if ((ComparePriority(f.ToString(), s.ToString()) == 1))//第一个运算符大于第二个运算符
{
w = i;//记录位置
s = f;
}
}
if (w > 0)
{
for (int j = w - 1; chEx[j] >= 0 && chEx[j] <= 9; j--)
{
a = chEx[j].ToString (); a = a + t; t = a;
}
for (int j = w + 1; chEx[j] >= 0 && chEx[j] <= 9; j++)
{
b = chEx[j].ToString (); b = t + b; t = b;
}
switch (s)
{
case '+':
end = Convert .ToDouble(a) + Convert .ToDouble(b);
break;
case '-':
end = Convert .ToDouble(a) - Convert .ToDouble(b);
break;
case '*':
end = Convert .ToDouble(a) * Convert .ToDouble(b);
break ;
case '/':
end = Convert .ToDouble(a) / Convert .ToDouble(b);
break ;
case '%':
end = Convert .ToDouble(a) % Convert .ToDouble(b);
break;
default :
break ; }
//取出w前后的数值进行计算,再进行下一次迭代
}
return end;
}
public int ComparePriority(string firstOp, string secondOp)
{
string arithm1 = "*/%";
string arithm2 = "+-";
if (arithm1.Contains(firstOp))//第一个操作符属于* / %
{
if (arithm2.Contains(secondOp))//第二个操作符属于+ -
return 1;
}
else if (arithm2.Contains(firstOp))
{
if (arithm1.Contains(secondOp))
return -1;
}
return end;
}
按照这样运行,结果是错误的,但是不知道哪里出错了,求指点
private void button2_Click(object sender, EventArgs e)
{
string expression = CleanString(tbInput.Text);//MessageBox.Show(expression);
if(expression .IndexOf ('(')>=0)//找到括号
{
int i = expression .IndexOf ('(');
int j = expression.IndexOf(')');
string strsub = expression.Substring(i, j - i-1);//取出括号中的内容
double m = CalculateSimple(strsub);//计算括号的内容
expression = expression.Substring(0, i) + m.ToString() + expression.Substring(j + 1);//把计算结果加入剩余解析式字符串
}
double re = CalculateSimple(expression);//对表达式重新计算
tbOutcome.Text = re.ToString();
} public double CalculateSimple(string ex) //取出括号内容进行计算,包含运算符和数值
{
double end;
string a="",b="",t="";
char[] chEx = ex.ToCharArray();//把字符串转化为字符数组
char f, s='0';
int n = 0;//计数
int w =0;//记录位置
for (int i = 0; i < chEx.GetLength(0); i++)//循环取出字符,判断是否为运算符
{
char c = chEx[i];
if (c == '.' || (c >= 0 && c <= 9)) continue;//如果是数值就重新查找
f = c;//找到一个运算符
n++;
if (n < 2)//如果运算符数少于2,再查找
{
w = i;
s = c;//把字符给第二个操作符
continue;
}
if ((ComparePriority(f.ToString(), s.ToString()) == 1))//第一个运算符大于第二个运算符
{
w = i;//记录位置
s = f;
}
}
if (w > 0)
{
for (int j = w - 1; chEx[j] >= 0 && chEx[j] <= 9; j--)
{
a = chEx[j].ToString (); a = a + t; t = a;
}
for (int j = w + 1; chEx[j] >= 0 && chEx[j] <= 9; j++)
{
b = chEx[j].ToString (); b = t + b; t = b;
}
switch (s)
{
case '+':
end = Convert .ToDouble(a) + Convert .ToDouble(b);
break;
case '-':
end = Convert .ToDouble(a) - Convert .ToDouble(b);
break;
case '*':
end = Convert .ToDouble(a) * Convert .ToDouble(b);
break ;
case '/':
end = Convert .ToDouble(a) / Convert .ToDouble(b);
break ;
case '%':
end = Convert .ToDouble(a) % Convert .ToDouble(b);
break;
default :
break ; }
//取出w前后的数值进行计算,再进行下一次迭代
}
return end;
}
public int ComparePriority(string firstOp, string secondOp)
{
string arithm1 = "*/%";
string arithm2 = "+-";
if (arithm1.Contains(firstOp))//第一个操作符属于* / %
{
if (arithm2.Contains(secondOp))//第二个操作符属于+ -
return 1;
}
else if (arithm2.Contains(firstOp))
{
if (arithm1.Contains(secondOp))
return -1;
}
return end;
}
按照这样运行,结果是错误的,但是不知道哪里出错了,求指点
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货