double A = 1;
            double B = 2;
            string c = "A+B";
            C=  (对c进行处理)
那么怎么让C等于3

解决方案 »

  1.   

    double A = 1;
                double B = 2;
                string c = "A+B";
    c = c.Replace("A",A.Tostring()).Replace("B",B.Tostring());
    //c="1+2";
    string[] temp = c.split['+'];
    int s =0;
    for(int i=0;i<temp.length;i++){
      s+= Convert.ToInt32(temp[i]);
    }
    c = s.Tostring();
      

  2.   

    A * B*(1 + (C+ D) / E) - F如果象上面这样的一个运算式应该怎么做?
      

  3.   

    C#四种Eval测试结果:不要用CodeDom做大批量的表达式四则运算作者:yaosansi 日期:2006-01-17
    字体大小: 小 中 大 
    有时候需要表达式运算,如
    String strExpression="-12 * ( - 2.2 + 7.7 ) - 44 * 2";网上找的,一般是利用CodeDom,见
    http://www.codeproject.com/csharp/runtime_eval.asp简化为:
    System.CodeDom.Compiler.ICodeCompiler comp = (new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler());
    System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();object qswhEval2(string Expression){
    StringBuilder code = new StringBuilder();
    code.Append("using System; \n");
    code.Append("namespace ADOGuy { \n");
    code.Append("  public class _Evaluator { \n");
    code.Append("    public object __foo() ");
    code.Append("{ ");
    code.AppendFormat("      return ({0}); ", Expression);
    code.Append("}\n");
    code.Append("} }");
    System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
    System.Reflection.Assembly a = cr.CompiledAssembly;
    object _Compiled = a.CreateInstance("ADOGuy._Evaluator");
    System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("__foo");
    return mi.Invoke(_Compiled, null);
    }
      

  4.   

    A * B*(1 + (C+ D) / E) - F如果象上面这样的一个运算式应该怎么做?
    ======================>
    这是一个数据结构的问题,进栈出栈
      

  5.   

    CalUtility.csusing System;
    namespace Calculate
    {
     /// <summary>
     /// CalUtility 的摘要说明。
     /// 读算式辅助工具
     /// </summary> public class CalUtility
     {
      System.Text.StringBuilder StrB;
      private int iCurr=0;
      private int iCount=0;  /// <summary>
      /// 构造方法
      /// </summary>  public CalUtility(string calStr)
      {
       StrB = new System.Text.StringBuilder(calStr.Trim());
       iCount = System.Text.Encoding.Default.GetByteCount(calStr.Trim());
      }  /// <summary>
      /// 取段,自动分析数值或计算符
      /// </summary>
      /// <returns></returns>  public string getItem()
      {
       //结束了
       if(iCurr==iCount)
        return "";
       char ChTmp = StrB[iCurr];
       bool b=IsNum(ChTmp);
       if(!b)
       {
        iCurr++;
        return ChTmp.ToString();
       }
       string strTmp="";
       while(IsNum(ChTmp)==b && iCurr<iCount)
       {
        ChTmp = StrB[iCurr];
        if(IsNum(ChTmp)==b)
         strTmp +=ChTmp;
        else
         break;
        iCurr++;
       }
       return strTmp;
      }  /// <summary>
      /// 是否是数字
      /// </summary>
      /// <param name="c">内容</param>
      /// <returns></returns>  public bool IsNum(char c)
      {
       if((c>=’0’ && c<=’9’)|| c==’.’)
       {
        return true;
       }
       else
       {
        return false;
       }
      }  /// <summary>
      /// 是否是数字
      /// </summary>
      /// <param name="c">内容</param>
      /// <returns></returns>  public bool IsNum(string c)
      {
       if(c.Equals(""))
        return false;
       if((c[0]>=’0’ && c[0]<=’9’)|| c[0]==’.’)
       {
        return true;
       }
       else
       {
        return false;
       }
      }  /// <summary>
      /// 比较str1和str2两个运算符的优先级,ture表示str1高于str2,false表示str1低于str2
      /// </summary>
      /// <param name="str1">计算符1</param>
      /// <param name="str2">计算符2</param>
      /// <returns></returns>  public bool Compare(string str1,string str2)
      { 
       return getPriority(str1)>=getPriority(str2);
      }  /// <summary>
      /// 取得计算符号的优先级
      /// </summary>
      /// <param name="str">计算符</param>
      /// <returns></returns>  public int getPriority(string str)
      {
       if(str.Equals(""))
       {
        return -1;
       }
       if(str.Equals("("))
       {
        return 0;
       }
       if(str.Equals("+")||str.Equals("-"))
       {
        return 1;
       }
       if(str.Equals("*")||str.Equals("/"))
       {
        return 2;
       }
       if(str.Equals(")"))
       {
        return 0;
       }
       return 0;
      }
     }
    }IOper.cs
    using System;namespace Calculate
    {
     /// <summary>
     /// IOper 的摘要说明。
     /// 计算符接口
     /// </summary> public interface IOper
     {
      /// <summary>
      /// 计算符计算接口计算方法
      /// </summary>
      /// <param name="o1">参数1</param>
      /// <param name="o2">参数2</param>
      /// <returns></returns>
      object Oper(object o1,object o2);
     }
    }Opers.cs
    using System;namespace Calculate
    {
     /// <summary>
     /// Opers 的摘要说明。
     /// 各类计算符的接口实现,加减乘除
     /// </summary> public class OperAdd:IOper
     {
      public OperAdd()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
      }
      #region IOper 成员 public object Oper(object o1, object o2)
     {
      Decimal d1 = Decimal.Parse(o1.ToString());
      Decimal d2 = Decimal.Parse(o2.ToString());
      return d1+d2;
     } #endregion
    }public class OperDec:IOper
    {
     public OperDec()
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }
     #region IOper 成员 public object Oper(object o1, object o2)
     {
      Decimal d1 = Decimal.Parse(o1.ToString());
      Decimal d2 = Decimal.Parse(o2.ToString());
      return d1-d2;
     }
     #endregion
    }public class OperRide:IOper
    {
     public OperRide()
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }
     #region IOper 成员 public object Oper(object o1, object o2)
     {
      Decimal d1 = Decimal.Parse(o1.ToString());
      Decimal d2 = Decimal.Parse(o2.ToString());
      return d1*d2;
     }
     #endregion
    }public class OperDiv:IOper
    {
     public OperDiv()
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }
     #region IOper 成员 public object Oper(object o1, object o2)
     {
      Decimal d1 = Decimal.Parse(o1.ToString());
      Decimal d2 = Decimal.Parse(o2.ToString());
      return d1/d2;
     } #endregion
    }}OperFactory.cs
    using System;namespace Calculate
    {
     /// <summary>
     /// OperFactory 的摘要说明。
     /// 计算符接口工厂
     /// </summary>
     public class OperFactory
     {
      public OperFactory()
      {
      }
      public IOper CreateOper(string Oper)
      {
       if(Oper.Equals("+"))
       {
        IOper p = new OperAdd();
        return p;
       }
       if(Oper.Equals("-"))
       {
        IOper p = new OperDec();
        return p;
       }
       if(Oper.Equals("*"))
       {
        IOper p = new OperRide();
        return p;
       }
       if(Oper.Equals("/"))
       {
        IOper p = new OperDiv();
        return p;
       }
       return null;
      }
     }
    }
      

  6.   


    Calculate.cs
    using System;
    using System.Collections;namespace Calculate
    {
     /// <summary>
     /// Calculate 的摘要说明。
     /// 计算实现主类
     /// </summary>
     public class Calculate
     {
      /// <summary>
      /// 算术符栈
      /// </summary>
      private ArrayList HList;
      /// <summary>
      /// 数值栈
      /// </summary>
      public ArrayList Vlist;
      /// <summary>
      /// 读算试工具
      /// </summary>
      private CalUtility cu;
      /// <summary>
      /// 运算操作器工厂
      /// </summary>
      private OperFactory of;
      /// <summary>
      /// 构造方法
      /// </summary>
      /// <param name="str">算式</param>
      public Calculate(string str)
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
       HList = new ArrayList();
       Vlist = new ArrayList();
       of = new OperFactory();
       cu = new CalUtility(str);
      }  /// <summary>
      /// 开始计算
      /// </summary>  public object DoCal()
      { 
       string strTmp=cu.getItem();
       while(true)
       {
        if(cu.IsNum(strTmp))
        {
         //如果是数值,则写入数据栈
         Vlist.Add(strTmp);
        }
        else
        {
         //数值
         Cal(strTmp);
        }
        if(strTmp.Equals(""))
         break;
        strTmp=cu.getItem();
       }
       return Vlist[0];
      }  /// <summary>
      /// 计算
      /// </summary>
      /// <param name="str">计算符</param>  private void Cal(string str)
      {
       //符号表为空,而且当前符号为"",则认为已经计算完毕
       if(str.Equals("")&&HList.Count==0)
        return;
       if(HList.Count>0)
       {
        //符号是否可以对消?
        if(HList[HList.Count-1].ToString().Equals("(") && str.Equals(")"))
        {
         HList.RemoveAt(HList.Count-1);
         if(HList.Count>0)
         {
          str=HList[HList.Count-1].ToString();
          HList.RemoveAt(HList.Count-1);
          Cal(str);
         }
         return;
        }
        //比较优先级
        if(cu.Compare(HList[HList.Count-1].ToString(),str))
        {
         //如果优先,则计算
         IOper p = of.CreateOper(HList[HList.Count -1].ToString());
         if(p!=null)
         {
          Vlist[Vlist.Count -2] = p.Oper(Vlist[Vlist.Count-2],Vlist[Vlist.Count-1]);
          HList.RemoveAt(HList.Count -1);
          Vlist.RemoveAt(Vlist.Count -1);
          Cal(str);
         }
         return;
        }
        if(!str.Equals(""))
         HList.Add(str);
       }
       else
       {
        if(!str.Equals(""))
         HList.Add(str);
       }
      }
     }
    } http://www.tongyi.net/article/20051103/200511034565.shtml
      

  7.   

    数据结构堆栈可以解决这个问题。当然曾经用Pascal做过这东西,不过只是整数的那种。
      

  8.   

    wuyazhe(牛肉面) ,CodeDom这个不行么?
      

  9.   

    wuyazhe(牛肉面) ,我用咯后面你提供的那个方法,但是我不知道怎么调用?
      

  10.   

    我用咯后面的那个方法,提示出错:确保此方法的参数具有有效值
                String strExpression = "12 * (2 + 7 ) - 44 * 2";
                Calculate tt = new Calculate(strExpression);
                tt.DoCal();
      

  11.   

    To ls all:
    帖的网上的,没有试过。理论上应该可以。
      

  12.   

    楼主啊。我试了以下。怎么不能用呢?
    System.CodeDom.Compiler.ICodeCompiler comp = (new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler());
            System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();        object qswhEval2(string Expression)
            {
                StringBuilder code = new StringBuilder();
                code.Append("using System; \n");
                code.Append("namespace ADOGuy { \n");
                code.Append("  public class _Evaluator { \n");
                code.Append("    public object __foo() ");
                code.Append("{ ");
                code.AppendFormat("      return ({0}); ", Expression);
                code.Append("}\n");
                code.Append("} }");
                System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
                System.Reflection.Assembly a = cr.CompiledAssembly;
                object _Compiled = a.CreateInstance("ADOGuy._Evaluator");
                System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("__foo");
                return mi.Invoke(_Compiled, null);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                object a = qswhEval2("2*(1+5)");
                MessageBox.Show(a.ToString());
            }
      

  13.   

    你不要只看自己提出的题目。看你的需求。
    double A = 1;
    double B = 2;
    string c = "A+B";
    计算c,如果这样。你直接c = (a+b).ToString();
    这样就可以了如果是用户输入的。你就尝试的拼接一个算数表达式不就可以了?转以下脑子吧。
    拼接字串,然后用别人写的这些方法去执行。没问题的。只是速度不快,因为要编译一次。
    还有,给你的回复。你要自己多试试。不要草率的说不行。为什么我试就可以呢?其实csdn是作什么的?csdn不是给你解答问题的地方,csdn是给你提供的学习的地方。学习方法,不要只学习别人给你写个代码运行出来就可以。要明白为什么。知道了方向。不一定需要别人写代码。如果有最好。不能执行可以自己调,调到能执行为止。这个你肯定是看了以下,看不明白就放下了。
    第一个方法我是从别人的blog抄的,看上去没什么问题。就帖来了。
    第二个方法是担心第一个方法效率上太慢,所以就帖了第二个方法。方法二我没有测试,不过因该是可以的。
    我这里反问你一个问题。这个帖子,你发了以后。你学会了什么?
      

  14.   

    恩,象这样东东我一般直接引用jscript引擎然后eval就得了
     using   Microsoft.JScript;   
      using   Microsoft.JScript.Vsa;   
      using   Microsoft.Vsa;   
      class   MyEval   
      {   
              ///   <summary>   
              ///   四则混合运算   
              ///   </summary>   
              ///   <param   name="s">计算表达式</param>   
              ///   <returns>计算结果</returns>   
              ///   <example>   
              ///   <code>   
              ///   object   x   =   Mathx.Eval("1+2*2-6/2");   
              ///   </code>   
              ///   </example>   
              public   static   object   Eval(string   s)   
              {   
                      VsaEngine   v   =   new   VsaEngine();   
                      v.InitVsaEngine("",   new   BaseVsaSite());   
                      return   Microsoft.JScript.Eval.JScriptEvaluate(s,   v);   
              }   
              static   void   Main()   
              {   
                      System.Console.WriteLine(Eval("65-23"));   
              }   
      }             
      

  15.   

    string c = "A+B";

    double A = 1;
    double B = 2;
    有关系吗?
      

  16.   

    直接点,是vb.net马上就能用方法不太一样
    http://www.codeproject.com/vb/net/expression_evaluator.asp