用了大概3天零散时间吧,结合这学期学过的逆波兰表达式的知识,写了一个简易的java计算器,权当是练手啦。
一共用了3个类,每个类完成不同的功能。
SimpleCalculator类
package myCalculator;
import java.awt.*;
import java.awt.event.*;
import java.util.EventListener;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
//import org.xml.sax.DocumentHandler;
public class SimpleCalculator extends JFrame{
private JLabel lbl1, lbl2;
private JTextField tf1, tf2;
private Get_exp G = new Get_exp();
private Container c = getContentPane();
public SimpleCalculator(){
super("SimpleCalculator");
c.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 20));
lbl1 = new JLabel("Please enter your expression.");
lbl2 = new JLabel("The value of your expression.");
tf1 = new JTextField(20);
tf2 = new JTextField(20);
tf1.setFont(getFont());
tf2.setFont(getFont());
tf1.addActionListener(new Handler1());
tf1.getDocument().addDocumentListener(new Handler2());
tf2.addActionListener(new Handler1());
c.add(lbl1);
c.add(tf1);
c.add(lbl2);
c.add(tf2);
setSize(200, 350);
setVisible(true);
}
public static void main(String[] args){
SimpleCalculator app = new SimpleCalculator();
app.addWindowListener(new Handler3());
}
class Handler1 implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource() == tf1){
tf2.setText(G.calculate());
}
}
}
class Handler2 implements DocumentListener{
public void insertUpdate(DocumentEvent e){
G.get_exp(tf1.getText());
}
public void removeUpdate(DocumentEvent e){
G.get_exp(tf1.getText());
}
public void changedUpdate(DocumentEvent e){
}
}
static class Handler3 extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
}
Get_exp类
package myCalculator;
class Get_exp {
private String exp;
public void get_exp(String str){
exp = str;
}
public String calculate(){
double value = 0;
value = (new Do_cal()).docal(exp);
value = (double)(Math.round(value*100000))/100000;
return String.valueOf(value);
}
}
Do_cal类
package myCalculator;
import java.util.*;
public class Do_cal {
static int operator(char ch){
switch(ch){
case '+' : return 1;
case '-' : return 2;
case '*' : return 3;
case '/' : return 4;
default : return 0;
}
}
static int priority(char c){
switch(c){
case '+' :
case '-' : return 1;
case '*' :
case '/' : return 2;
case '(' : return 3;
default : return 0;
}
}
double docal(String str){
int i = 0, len;
double value = 0.0, temp_value;
char c;
char temp[] = new char[20];
int j = -1;
double out[] = new double[str.length()];//store postorder expression
int rear = -1;
int flag[] = new int[50];//store if operator
for(int k = 0; k < 50; k++)
flag[k] = 0;
Stack s = new Stack();
int top = -1;
len = str.length();
while( i<len ){
c = str.charAt(i);
while( (c>='0'&& c<='9') || c == '.' || c == '-'){//c is a positive number
if(j == -1){
temp = new char[20];//store number
}
if(c == '-'){
if(str.charAt(i-1) == '(')
temp[++j] = c;
else
break;
}
else
temp[++j] = c;
c = str.charAt(++i);
if(!( (c>='0'&& c<='9') || c == '.') ){
String temp_str = new String(temp);
temp_value = Double.parseDouble(temp_str);
out[++rear] = temp_value;
j = -1;
}
}
if(c == '(' || c == ')'){
if(c == '(')
s.push(c);
else{
char ch;
while((ch = (char)s.pop()) != '('){
out[++rear] = 0;
flag[rear] = operator(ch);
}
}
}
if(c == '+' || c == '-' || c == '*' || c == '/'){
if(s.isEmpty() || priority(c) > priority((char) s.peek()) || priority((char) s.peek()) == 3 )
s.push(c);
else{
while(!(s.isEmpty() || (char)s.peek() == '(')){
out[++rear] = 0;
flag[rear] = operator((char)s.pop());
}
s.push(c);
}
}
if(c == '=')
break;
i++;
}
while(!s.isEmpty()){
out[++rear] = 0;
flag[rear] = operator((char)s.pop());
}
//inorder transform done
i = 0;
double a = 0, b = 0;
while(i <= rear){
if(out[i] != 0.0){
s.push(out[i]);
}
else{
if(flag[i] != 0.0){
a = (double)s.pop();
b = (double)s.pop();
switch(flag[i]){
case 1 :
s.push(a+b);
break;
case 2 :
s.push(b-a);
break;
case 3 :
s.push(a*b);
break;
case 4 :
s.push(b/a);
break;
default : break;
}
}
else
s.push(out[i]);
}
i++;
}
value = (double)s.pop();
return value;
}
}
最后附一张截图
That’s all.