📄 expcalframe.java
字号:
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.JLabel jLabel1 = new JLabel();
javax.swing.JLabel jLabel2 = new JLabel();
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(500, 300));
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("");
jLabel1.setText("表达式");
jLabel2.setText("值");
contentPane.add(jtfExp, new XYConstraints(9, 36, 472, 27));
contentPane.add(jtfResult, new XYConstraints(11, 99, 168, 28));
contentPane.add(btnCal, new XYConstraints(223, 169, 94, -1));
contentPane.add(jLabel1, new XYConstraints(10, 13, -1, -1));
contentPane.add(jLabel2, new XYConstraints(10, 81, -1, -1));
Font fontSet = new Font("宋体", Font.PLAIN, 12);
setControlFont(contentPane, fontSet);
}
/**
* 设置控件字体(递归)
*
* @param component Component 控件
* @param fontSet Font 要设成的字体
*/
public void setControlFont(Component component, Font fontSet) {
//System.out.println("设置字体" + component.getClass().getName());
if (component instanceof Container) {
Component c[] = ( (Container) component).getComponents();
for (int i = 0, n = c.length; i < n; i++) {
c[i].setFont(fontSet);
setControlFont(c[i], fontSet);
}
}
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -