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

📄 expcalframe.java~57~

📁 数值计算,表达式求值, 如计算3 + 2 * ( 3 + 2) / 5 + 8 + Sin( pi() / 180 * 30 ) + 1 + 2 ^ 10, 可自定义函数, 采用递归算法
💻 JAVA~57~
字号:
package expresscalculate;

import java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.*;
import java.lang.Math.*;

public class ExpCalFrame
    extends JFrame {
  JPanel contentPane;
  XYLayout xYLayout1 = new XYLayout();
  JTextField jtfExp = new JTextField();
  JButton btnCal = new JButton();
  JTextField jtfResult = new JTextField();
  javax.swing.JList jlExp = new JList();
  javax.swing.JList jlFun = new JList();
  javax.swing.JButton jButton1 = new JButton();
  public ExpCalFrame() {
    try {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      jbInit();
    }
    catch (Exception exception) {
      exception.printStackTrace();
    }
  }

  /**
   * Component initialization.
   *
   * @throws java.lang.Exception
   */
  private void jbInit() throws Exception {
    contentPane = (JPanel) getContentPane();
    contentPane.setLayout(xYLayout1);
    setSize(new Dimension(600, 500));
    setTitle("表达式计算");
    jtfExp.setText(
        "3 + 2 * ( 3 + 2) / 5 + 8 + Sin( pi() / 180 * 30 ) + 1 + 2 ^ 10");
    btnCal.setIcon(null);
    btnCal.setText("计算");
    btnCal.addActionListener(new ExpCalFrame_btnCal_actionAdapter(this));
    jtfResult.setText("");
    contentPane.setFont(new java.awt.Font("宋体", Font.PLAIN, 9));
    jButton1.setIcon(null);
    jButton1.setText("jButton1");
    contentPane.add(jtfExp, new XYConstraints(32, 29, 341, 27));
    contentPane.add(btnCal, new XYConstraints(31, 135, 94, -1));
    contentPane.add(jtfResult, new XYConstraints(31, 88, 168, 28));
    contentPane.add(jlExp, new XYConstraints(318, 77, 268, 154));
    contentPane.add(jlFun, new XYConstraints(308, 271, 284, 139));
    contentPane.add(jButton1, new XYConstraints(93, 186, 111, 36));
  }

  public void btnCal_actionPerformed(ActionEvent e) {

    String strResult = "";
    double dResult = CalculateExp(jtfExp.getText());
    strResult = String.valueOf(dResult);
    jtfResult.setText(strResult);
  }

  /**计算表达式*/
  public double CalculateExp(String sExp) {
    System.out.println(sExp);
    double[] a = new double[10];
    char[] b = new char[10];
    int m, n, iLeftBracket, iRightBracket, i;
    String strNum, strSub;
    boolean bEnd, bFlag, bNotEqu;
    String s;
    char[] sarr;
    String strOpr = "+-*/()^";

    s = sExp;
    s = StrDelBlank(s);
    s = ReplaceFunction(s);
    sarr = s.toCharArray();
    if (s.length() == 0) {
      return 0;
    }

    if (!(CheckExpCharValid(s))) {
      return 0;
    }

    if (!(CheckExpBracket(s))) {
      return 0;
    }

    if ((sarr[0] == '+') || (sarr[0] == '-')) {
      if (sarr.length == 1) {
        JOptionPane.showMessageDialog(this, "表达式有误! 表达式:" + s);
        System.exit(0);
      }
      if (sarr[1] == '(') {
        s = s.substring(1);
        return CalculateExp("(-1)*" + s);
      }

      for (i = 1; i < sarr.length; i ++) {
        if (strOpr.indexOf(sarr[i]) > -1) {
          s = "(" + s.substring(0, i) + ")" + s.substring(i);
          return CalculateExp(s);
        }
      }
      return Double.parseDouble(s);
    }

    for (i = 0; i < 10; i ++) {
      a[i] = 0;
      b[i] = ' ';
    }

    i = 0;
    m = -1;
    n = -1;
    while (i < sarr.length) {
      switch (sarr[i]) {
        case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': {
          bEnd = false;
          strNum = "";
          while (!bEnd) {
            if (i == sarr.length - 1) {
              if (strOpr.indexOf(sarr[i]) < 0) {
                strNum = strNum + sarr[i];
                m = m + 1;
                try {
                  a[m] = Double.parseDouble(strNum);
                }
                catch (Exception e){
                  JOptionPane.showMessageDialog(this, "数值表达式错误:" + strNum + "; " + e.getMessage());
                  System.exit(0);
                }
                if (m != n + 1) {
                  JOptionPane.showMessageDialog(this, "表达式有误!操作符,操作不匹配!" + s);
                  System.exit(0);
                }
                i = i + 1;
              }
              bEnd = true;
            }
            else {
              if (strOpr.indexOf(sarr[i]) > -1) {
                bEnd = true;
              }
              else {
                strNum = strNum + sarr[i];
                i = i + 1;
              }

              if (bEnd ) {
                m = m + 1;
                try {
                  a[m] = Double.parseDouble(strNum);
                }
                catch (Exception e){
                  JOptionPane.showMessageDialog(this, "数值表达式错误:" + strNum + "; " + e.getMessage());
                  System.exit(0);
                }
                if (m != n + 1) {
                  JOptionPane.showMessageDialog(this, "表达式有误!操作符,操作不匹配!" + s);
                  System.exit(0);
                }
              }
            }
          }
          break;
        }

        case '+': case '-': case '*': case '/': case '^': {
          n = n + 1;
          b[n] = sarr[i];
          if (m != n ) {
            JOptionPane.showMessageDialog(this, "表达式有误!操作符,操作不匹配!" + s);
            System.exit(0);
          }

          i = i + 1;
          break;
        }

        case '(': {
          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);
          }

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

          m = m + 1;
          a[m] = CalculateExp(strSub);
          if (m != n + 1) {
            JOptionPane.showMessageDialog(this, "表达式有误!操作符,操作不匹配!" + s);
            System.exit(0);
          }

          break;
        }

        case ')': {
          JOptionPane.showMessageDialog(this, "表达式缺左括号!");
          System.exit(0);
          break;
        }

        default: {
          JOptionPane.showMessageDialog(this, "表达式:" + s + " 位置:" + String.valueOf(i) + " 处的 " + sarr[i]);
          System.exit(0);
          break;
        }
      }

      if (m == n + 1 && n > -1) {
        if (b[n] == '*' || b[n] == '/' || b[n] == '^') {
          a[m-1] = CalculateSimple(a[m-1], a[m], b[n]);
          a[m] = 0;
          b[n] = ' ';
          m = m - 1;
          n = n - 1;
        }
      }

      bFlag = true;
      while (bFlag) {
        if (m != -1 && m == n && m != 0 && (b[n] == '+' || b[n] == '-')) {
          a[m - 1] = CalculateSimple(a[m - 1], a[m], b[n - 1]);
          a[m] = 0;
          m = m - 1;
          n = n - 1;
          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 + -