首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

算术表达式解释解决方法

2013-04-22 
算术表达式解释代码private void button2_Click(object sender, EventArgs e){string expression CleanS

算术表达式解释
算术表达式解释解决方法

代码

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;
        }



按照这样运行,结果是错误的,但是不知道哪里出错了,求指点算术表达式解释解决方法
[解决办法]
表达式计算汇总

http://bbs.csdn.net/topics/360188060
------解决方案--------------------


单步调试看看哪里出了错误,这么多代码看不下去啊
嘿嘿嘿~~~~~
[解决办法]
同上,单步调试下,把那些变量的值都列出来,应该就知道了


顺便弱弱的想问下表达式中能支持几对括号。像这样的2*(2+2*(2-3)) 能计算吗?或者2*(3+4)+3*(4+7)?

热点排行