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

📄 expcalframe.java

📁 数值计算,表达式求值, 如计算3 + 2 * ( 3 + 2) / 5 + 8 + Sin( pi() / 180 * 30 ) + 1 + 2 ^ 10, 可自定义函数, 采用递归算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
          b[n] = b[n + 1];
          b[n + 1] = ' ';
        }
        else {
          bFlag = false;
        }
      }
    }   //while (i < sarr.length)

    while (m > 0) {
      a[m - 1] = CalculateSimple(a[m - 1], a[m], b[n]);
      a[m] = 0;
      b[n] = ' ';
      m = m - 1;
      n = n - 1;
    }

    if (n != -1) {
      JOptionPane.showMessageDialog(this, "表达式有误!" + s);
      System.exit(0);
    }
    else {
      return a[0];
    }
    return 0;
  }

  /**删除表达式中的空格*/
  public String StrDelBlank(String sExp) {
    int i;
    char[] sarr = sExp.toCharArray();
    String strResult;
    StringBuffer sb = new StringBuffer(sarr.length);

    for (i = 0; i < sarr.length; i ++ ) {
      if (sarr[i] != ' ') {
        sb.append(sarr[i]);
      }
    }
    strResult = sb.toString().trim();
    return strResult;
  }

  /**替换表达式中的函数*/
  public String ReplaceFunction(String sExp) {
    int i, iFirst, iLeftBracket, iRightBracket;
    String strResult, strFunction, strSub, s;
    String strFuncFirst = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_";
    String strOpr = "+-*/^";
    boolean bNotEqu;
    double dResult;
    char[] sarr = sExp.toCharArray();

    strResult = "";
    s = sExp;
    i = 0;
    while (i < sarr.length) {
      if (strFuncFirst.indexOf(sarr[i]) > -1) {
        strFunction = "";
        iFirst = i;
        while((i < sarr.length) && (strOpr.indexOf(sarr[i]) < 0)) {
          if (sarr[i] == ')') {
            JOptionPane.showMessageDialog(this, "表达式缺左括号!");
            System.exit(0);
          }

          if (sarr[i] != '(') {
            strFunction = strFunction + sarr[i];
            i = i + 1;
          }
          else {
            iLeftBracket = 1;
            iRightBracket = 0;
            strSub = "";
            bNotEqu = true;
            i = i + 1;
            while( bNotEqu && i < sarr.length) {
              strSub = strSub + sarr[i];
              if (sarr[i] == '(') {
                iLeftBracket = iLeftBracket + 1;
              }
              if (sarr[i] == ')') {
                iRightBracket = iRightBracket + 1;
              }
              if (iLeftBracket == iRightBracket) {
                bNotEqu = false;
              }
              i = i + 1;
            }

            if (bNotEqu) {
              JOptionPane.showMessageDialog(this, "表达式缺右括号!");
              System.exit(0);
            }

            i = i - 1;
            if (strSub.length() > 0) {
              strSub = strSub.substring(0, strSub.length() - 1);
            }

            dResult = CalculateFuction(strFunction, strSub);
            s = s.substring(0, iFirst) + String.valueOf(dResult) + s.substring(i + 1);
            sarr = s.toCharArray();
            i = iFirst + String.valueOf(dResult).length();
          }
        }
      }
      i = i + 1;
    }

    strResult = s;
    return strResult;
  }

  /**检查表达式是否有非法字符*/
  public boolean CheckExpCharValid(String sExp) {
    int i = 0;
    String strValidChar = "0123456789.+-*/()^";
    char[] strExps = sExp.toCharArray();

    for (i = 0; i < strExps.length; i ++) {
      if (strValidChar.indexOf(String.valueOf(strExps[i])) < 0) {
        JOptionPane.showMessageDialog(this, "存在非法字符!表达式:" + sExp + ",位置:" + String.valueOf(i));
        return false;
      }
    }

    return true;
  }

  /**检查表达式左右括号是否匹配*/
  public boolean CheckExpBracket(String sExp) {
    int i, iLeftBracket, iRightBracket;
    char[] s = sExp.toCharArray();
    boolean bNotEqu;

    if (s.length == 0) {
      return true;
    }

    i = 0;
    while (i < s.length) {
      if (s[i] == ')') {
        JOptionPane.showMessageDialog(this, "表达式缺左括号!");
        return false;
      }

      if (s[i] == '(') {
        bNotEqu = true;
        iRightBracket = 0;
        iLeftBracket = 0;
        while (bNotEqu && (i < s.length)) {
          if (s[i] == ')') {
            iRightBracket = iRightBracket + 1;
          }
          if (s[i] == '(') {
            iLeftBracket = iLeftBracket + 1;
          }
          if (iLeftBracket == iRightBracket) {
            bNotEqu = false;
          }
          i = i + 1;
        }

        if (bNotEqu) {
          JOptionPane.showMessageDialog(this, "表达式缺右括号!");
          return false;
        }
      }
      i = i + 1;
    }
    return true;
  }

  /**函数求值*/
  public double CalculateFuction(String sFunctionName, String sParams ) {
    System.out.println(sFunctionName + "(" + sParams  + ")");

    String strFuncName = sFunctionName;
    double dResult = 0;
    //ABS; SQRT; SIN; COS; TAN; PI; EXP; LN

    if (strFuncName.toUpperCase().equals("ABS")) {
      dResult = Math.abs(CalculateExp(sParams));
    }
    else if (strFuncName.toUpperCase().equals("SQRT")) {
      dResult = Math.sqrt(CalculateExp(sParams));
    }

    else if (strFuncName.toUpperCase().equals("SIN")) {
      dResult = Math.sin(CalculateExp(sParams));
    }
    else if (strFuncName.toUpperCase().equals("COS")) {
      dResult = Math.cos(CalculateExp(sParams));
    }
    else if (strFuncName.toUpperCase().equals("TAN")) {
      dResult = Math.tan(CalculateExp(sParams));
    }

    else if (strFuncName.toUpperCase().equals("PI")) {
      dResult = Math.PI;
    }

    else if (strFuncName.toUpperCase().toString() == "EXP") {
      dResult = Math.exp(CalculateExp(sParams));
    }
    else if (strFuncName.toUpperCase().toString() == "LN") {
      dResult = Math.log(CalculateExp(sParams));
    }

    return dResult;
  }

  /**计算简单表达式,二目运算*/
  public double CalculateSimple(double dVar1, double dVar2,  char chOpr ) {
    System.out.println(String.valueOf(dVar1) + String.valueOf(chOpr) + String.valueOf(dVar2));

    double dResult = 0;
    String strOprs = "+-*/^";
    if (strOprs.indexOf(String.valueOf(chOpr)) < 0) {
      JOptionPane.showMessageDialog(this, "无效的操作运算符!");
      System.exit(0);
    }

    switch(chOpr) {
      case '+': {
        dResult = dVar1 + dVar2;
        break;
      }
      case '-': {
        dResult = dVar1 - dVar2;
        break;
      }
      case '*': {
        dResult = dVar1 * dVar2;
        break;
      }
      case '/': {
        if (dVar2 == 0) {
          JOptionPane.showMessageDialog(this, "除0错误:" + String.valueOf(dVar1) + String.valueOf(chOpr) + String.valueOf(dVar2));
          System.exit(0);
        }
        dResult = dVar1 / dVar2;
        break;
      }
      case '^': {
        try {
          dResult = Math.pow(dVar1, dVar2);
        }
        catch (Exception e) {
          JOptionPane.showMessageDialog(this, "表达式有误:" + String.valueOf(dVar1) + String.valueOf(chOpr) + String.valueOf(dVar2));
          System.exit(0);
        }
        break;
      }

    }
    return dResult;
  }
}

class ExpCalFrame_btnCal_actionAdapter
    implements ActionListener {
  private ExpCalFrame adaptee;
  ExpCalFrame_btnCal_actionAdapter(ExpCalFrame adaptee) {
    this.adaptee = adaptee;
  }

  public void actionPerformed(ActionEvent e) {

    adaptee.btnCal_actionPerformed(e);
  }
}

⌨️ 快捷键说明

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