自制的简易版java计算器

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值