Beispiel #1
0
 //多项式的综合运算
 public bool Multinomial_Compute(out MultinomialC out1)
 {
     out1 = null;
     if (Fm.Length == 0)
     {
         Error = "括号中无内容";
         return false;
     }
     if (Fm[0] == '-')
     {
         try
         {
             S_Number.PushStack(new MultinomialC());
         }
         catch (Exception)
         {
             Error = "内存空间不足";
             return false;
         }
     }
     while (Seek < Fm.Length)
     {
         if (IsOperator(Fm[Seek]))
         {
             if (!Operator_Compute(Fm[Seek++]))
                 return false;
         }
         else if (IsNumber(Fm[Seek]) || IsLetter(Fm[Seek]))
         {
             if (Seek > 0 && Fm[Seek - 1] == ')')
                 if (!Operator_Compute('*'))
                     return false;
             Double d = 1;
             if (IsNumber(Fm[Seek]))
             {
                 String s;
                 if (!Cut_Double2(out s))
                     return false;
                 d = Double.Parse(s);
             }
             if (Seek < Fm.Length && IsLetter(Fm[Seek]))
             {
                 MultinomialB b;
                 if (!ConstructMultinomialB(out b))
                     return false;
                 b.coefficient = d;
                 try
                 {
                     S_Number.PushStack(new MultinomialC(b));
                 }
                 catch (Exception)
                 {
                     Error = "内存空间不足";
                     return false;
                 }
             }
             else
             {
                 try
                 {
                     S_Number.PushStack(new MultinomialC(new MultinomialB(d)));
                 }
                 catch (Exception)
                 {
                     Error = "内存空间不足";
                     return false;
                 }
             }
         }
         else if (Fm[Seek] == '(')
         {
             if (Seek > 0)
             {
                 if (IsNumber(Fm[Seek - 1]) || IsLetter(Fm[Seek - 1]) || Fm[Seek - 1] == ')')
                 {
                     if (!Operator_Compute('*'))
                         return false;
                 }
             }
             String s = Cut_Bracket();
             Formula f;
             Double d;
             try
             {
                 f = new Formula(s, 0);
                 if (f.Number_Compute(out d))
                     S_Number.PushStack(new MultinomialC(new MultinomialB(d)));
                 else
                 {
                     MultinomialC c = new MultinomialC(s);
                     if (!c.Multinomial_Compute(out c))
                         return false;
                     S_Number.PushStack(c);
                 }
             }
             catch (Exception)
             {
                 Error = "内存空间不足";
                 return false;
             }
         }
         else if (IsESC(Fm[Seek]))
             Seek++;
         else
         {
             Error = "存在非法字符:\"" + Fm[Seek] + "\"";
             return false;
         }
     }
     Object data;
     if (!S_Number.PopStack(out data))
     {
         Error = "存在多余的运算符";
         return false;
     }
     out1 = (MultinomialC)data;
     Object O;
     while (S_Operator.PopStack(out O))
     {
         if (!S_Number.PopStack(out data))
         {
             Error = "存在多余的运算符";
             return false;
         }
         if (!Cell_Compute((Char)O, (MultinomialC)data, out1, out out1))
             return false;
     }
     if (!S_Number.IsEmpty())
     {
         Error = "缺少运算符";
         return false;
     }
     for (int i = 0; i < out1.count; i++)
         if (Double.IsInfinity(out1.Buf[i].coefficient))
         {
             Error = "数值太大,已溢出";
             return false;
         }
     return true;
 }
Beispiel #2
0
 //带括号检查、括号替换和出错信息输出功能的多项式综合运算
 public static bool Multinomial_Compute(String si, out String out1)
 {
     out1 = "";
     if (si.Length == 0)
     {
         MessageBox.Show("请输入一个算式", "无法计算", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
         return false;
     }
     Formula f;
     try
     {
         f = new Formula(si, 0);
     }
     catch (Exception)
     {
         Error = "内存空间不足";
         return false;
     }
     if (!f.Check_Bracket())
     {
         MessageBox.Show("多项式非法:\n\n" + Error, "无法计算", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
         return false;
     }
     f.Formula_Adjust();
     Double d;
     if (f.Number_Compute(out d))
     {
         out1 = Formula.Number_Adjust(d);
         return true;
     }
     MultinomialC c;
     try
     {
         c = new MultinomialC(f.formula);
     }
     catch (Exception)
     {
         Error = "内存空间不足";
         return false;
     }
     Error = null;
     if (!c.Multinomial_Compute(out c))
     {
         if (Error == null)
             MessageBox.Show("多项式非法", "无法计算", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
         else
             MessageBox.Show("多项式非法:\n\n" + Error, "无法计算", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
         return false;
     }
     out1 = c.ToString();
     return true;
 }