📄 expcalframe.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 + -