⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.cs

📁 我也不清楚,好象打不开的说.就想下点东西,行行好吧
💻 CS
📖 第 1 页 / 共 2 页
字号:
          {
            m_bError = true;
            m_sErrorDescription = tpResult.m_name;
            return;
          }
          tpStack.Push(tpResult);
        }
        else if(sym.m_type == Type.Comma)
        {
          tpStack.Push(sym);
        }
        else if(sym.m_type == Type.Function)
        {
          fnParam.Clear();
          tpSym1 = (Symbol)tpStack.Pop();
          if((tpSym1.m_type == Type.Value) || (tpSym1.m_type == Type.Variable) || (tpSym1.m_type == Type.Result))
          {
            tpResult = EvaluateFunction(sym.m_name,tpSym1);
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
          else if(tpSym1.m_type == Type.Comma)
          {
            while(tpSym1.m_type == Type.Comma)
            {
              tpSym1 = (Symbol)tpStack.Pop();
              fnParam.Add(tpSym1);
              tpSym1 = (Symbol)tpStack.Pop();
            }
            fnParam.Add(tpSym1);
            tpResult = EvaluateFunction(sym.m_name,fnParam.ToArray());
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
          else
          {
            tpStack.Push(tpSym1);
            tpResult = EvaluateFunction(sym.m_name);
            if(tpResult.m_type == Type.Error)
            {
              m_bError = true;
              m_sErrorDescription = tpResult.m_name;
              return;
            }
            tpStack.Push(tpResult);
          }
        }       
      }
      if(tpStack.Count == 1)
      {
        tpResult = (Symbol)tpStack.Pop();
        m_result = tpResult.m_value;
      }
    }

    protected int Precedence(Symbol sym)
    {
      switch(sym.m_type)
      {
        case Type.Bracket:
          return 7;
        case Type.Function:
          return 5;
        case Type.UnaryOperator:
          return 4;
        case Type.Comma:
          return 0;
      }
      switch(sym.m_name)
      {
        case "^":
          return 3;
        case "/":
        case "*":
        case "%":
          return 2;
        case "+":
        case "-":
          return 1;
      }
      return -1;
    }

    protected Symbol Evaluate(Symbol opr, Symbol sym1)
    {
      Symbol result;
      result.m_name = opr.m_name + sym1.m_name;
      result.m_type = Type.Result;
      result.m_value = 0;
      switch(opr.m_name)
      {
        case "+":
          result.m_value = sym1.m_value;;
          break;
        case "-":
          result.m_value = -1 * sym1.m_value;
          break;
        default:
          result.m_type = Type.Error;
          result.m_name = "Undefine unary operator: " + opr.m_name + ".";
          break;
      }
      return result;
    }

    protected Symbol Evaluate(Symbol sym1, Symbol opr, Symbol sym2)
    {
      Symbol result;
      result.m_name = sym1.m_name + opr.m_name + sym2.m_name;
      result.m_type = Type.Result;
      result.m_value = 0;
      switch(opr.m_name)
      {
        case "^":
          result.m_value = System.Math.Pow(sym1.m_value,sym2.m_value);
          break;
        case "/":
        {
          if(sym2.m_value != 0)
            result.m_value = sym1.m_value / sym2.m_value;
          else
          {
            result.m_name = "Divide by Zero.";
            result.m_type = Type.Error;
          }
          break;
        }
        case "*":
          result.m_value = sym1.m_value * sym2.m_value;
          break;
        case "%":
          result.m_value = sym1.m_value % sym2.m_value;
          break;
        case "+":
          result.m_value = sym1.m_value + sym2.m_value;
          break;
        case "-":
          result.m_value = sym1.m_value - sym2.m_value;
          break;
        default:
          result.m_type = Type.Error;
          result.m_name = "Undefine operator: " + opr.m_name + ".";
          break;
      }
      return result;
    }

    protected Symbol EvaluateFunction(string name, params Object[] args)
    {
      Symbol result;
      result.m_name = "";
      result.m_type = Type.Result;
      result.m_value = 0;
      switch(name)
      {
        case "cos":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Cos(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "sin":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Sin(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "tan":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Tan(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "cosh":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Cosh(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "sinh":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Sinh(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "tanh":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Tanh(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "log":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Log10(((Symbol)args[0]).m_value);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "ln":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Log(((Symbol)args[0]).m_value,2);
          }
          else
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "logn":
          if(args.Length == 2)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + "'" + ((Symbol)args[1]).m_value.ToString() + ")";
            result.m_value = System.Math.Log(((Symbol)args[0]).m_value,((Symbol)args[1]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "sqrt":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Sqrt(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "abs":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Abs(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "acos":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Acos(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "asin":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Asin(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "atan":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Atan(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        case "exp":
          if(args.Length == 1)
          {
            result.m_name = name + "(" + ((Symbol)args[0]).m_value.ToString() + ")";
            result.m_value = System.Math.Exp(((Symbol)args[0]).m_value);
          }
          else 
          {
            result.m_name = "Invalid number of parameters in: "+ name +".";
            result.m_type = Type.Error;
          }
          break;
        default:
          if(m_defaultFunctionEvaluation != null)
            result = m_defaultFunctionEvaluation(name,args);
          else
          {
            result.m_name = "Function: "+ name +", not found.";
            result.m_type = Type.Error;
          }
          break;
      }
      return result;
    }
 
    protected bool m_bError = false;
    protected string m_sErrorDescription = "None";
    protected double m_result = 0;
    protected ArrayList m_equation = new ArrayList();
    protected ArrayList m_postfix = new ArrayList();
    protected EvaluateFunctionDelegate m_defaultFunctionEvaluation;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -