就是数学中的四则运算
如:1+2*(3+4*5)/6-7=?也就是运算表达式没有固定的格式
我要写一个类去处理它们 ,然后直接输出结果
有没有有效的方法》?

解决方案 »

  1.   

    老兄 你的意思是不是跟这个有点像?
    http://bloodwolf-china.javaeye.com/blog/472070
      

  2.   

    DataTable.Compute("1+2*(3+4*5)/6-7")javascript:var v=eval("1+2*(3+4*5)/6-7");
      

  3.   

    //教你一个最简单的方法,用动态类实现,
    //并且效率非常好,代码如下:using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;
    using System.Reflection;
    namespace CalStringValue
    {
        class Program
        {
            public static double Function(string str)
            {
                double result;
                
                StringBuilder classBody = new StringBuilder(400);
                classBody.AppendLine("using System;");
                classBody.AppendLine("public class TempClass");
                classBody.AppendLine("{");
                classBody.AppendLine("public double Fun()");
                classBody.AppendLine("{");
                classBody.AppendLine(string.Format(" return {0};",str));
                classBody.AppendLine("}");
                classBody.AppendLine("}");            CSharpCodeProvider provider = new CSharpCodeProvider();
                CompilerParameters cp = new CompilerParameters();
                cp.GenerateExecutable = false;
                cp.GenerateInMemory = true;
                CompilerResults compResult = provider.CompileAssemblyFromSource(cp, classBody.ToString());
                object   obj = compResult.CompiledAssembly.CreateInstance("TempClass");
                Type objType=obj.GetType();          
                    MethodInfo method = objType.GetMethod("Fun");
                   result=Convert.ToDouble(method.Invoke(obj, null));
                   return result;        }
            static void Main(string[] args)
            {
                string str = "";
                do
                {
                    Console.WriteLine("Input expression:(-1 to Exit)");
                    str = Console.ReadLine();                try
                    {
                        Console.WriteLine("the result is:{0}", Function(str));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                } while (str != "-1");
            }
        }
    }
      

  4.   

    object obj=new DataTable().Compute("1+3*4/4",null")
      

  5.   

    敲错了,是
    object obj=new DataTable().Compute("1+3*4/4",null);
      

  6.   

    DataTable.Compute 表达式内似乎用不了 中括号
      

  7.   


    DataTable().Compute() 似乎用不了中括号 
      

  8.   


    DataTable().Compute() 似乎用不了中括号 
      

  9.   

    //先项目右键中添加Microsoft.JScript引用
                Microsoft.JScript.GlobalObject.eval("1+2");
      

  10.   

    Math.Round(3.44, 1) = 3.4
      

  11.   

    我上几周才实现了一个,用的是表达式树的思路,当然教科书上也应有类似的思路,我觉得肯定早就有人想过我的这种思路了,有知道的大侠请指出来(好像就是逆波兰计算公式?):1.在四则运算中,一个表达式分为 操作结果Result、操作符Opt、操作数Opd三部分
    2.一个操作符Opt带两个操作数Opd 
    3.一个表达式可以表示为 Result = Opd1 Opt Opd2
    4.操作结果Result也可以作为另一个表达式的操作数
    5.于是一个四则运算的表达式就可以用表达式树(计算时使用递归,看起来更像是堆栈)的形式来表示1+2*(3+4*5)/6-7=?
    4*5
       +3
         *2
           /6
             +1
               -7<Result>R
    <Opt symbol="-">
    <Opt symbol="+">
    <Opt symbol="/">
    <Opt symbol="*">
    <Opd>2</Opd>
    <Opt symbol="+">
    <Opt symbol="*">
    <Opd>5</Opd>
    <Opd>4</Opd>
    </Opt>
    <Opd>3</Opd>
    </Opt>
    </Opt>
    <Opd>6</Opd>
    </Opt>
    <Opd>1</Opd>
    </Opt>
    <Opd>7</Opd>
    </Opt>
    </Result>
    能把表达式分析为上面的形式,就不难用递归去计算结果了。