自制的简易版java计算器

来源:互联网 发布:网络销售好做吗做金融 编辑:程序博客网 时间:2024/05/16 18:11

用了大概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.

0 0