Java 简单计算器

直接上代码


package cal;

public class Main {
    public static void main(String[] args) {
        Demo.createGrid();
    }
}

生成界面:

package cal;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Demo extends JFrame {


    public static void createGrid() {

        Font fn = new Font("黑体", Font.BOLD, 25);

        JFrame jf = new JFrame("计算器");


        jf.setBounds(600, 100, 600, 700);

        jf.setLayout(new BorderLayout());// 将界面设置为边界布局
        // 创建一个装文本的容器
        JPanel text = new JPanel(new GridLayout(2, 1));

        // 创建一个文本框
        JTextField jt = new JTextField(40);
        jt.setHorizontalAlignment(JTextField.RIGHT);
        jt.setFont(fn);
        jt.setText("0");


        // 创建一个文本域
        JTextArea ja = new JTextArea(2, 40);
        ja.setFont(fn);

        text.add(jt);
        text.add(ja);

        // jt.requestFocus();

        // 给按钮建一个网格布局
        JPanel jp = new JPanel(new GridLayout(5, 5));
        String[] str = { "CE", "C", "DEL", "%", "/", "sin", "1", "2", "3", "*", "cos", "4", "5", "6", "-", "tan", "7",
                "8", "9", "+", "(", ")", "0", ".", "=" };

        JButton[] bu = new JButton[str.length];

        for (int i = 0; i < 25; i++) {
            bu[i] = new JButton(str[i]);
            bu[i].setFont(fn);
            bu[i].setContentAreaFilled(false);//将按钮设为透明

            String str1 = bu[i].getText();
            if (str1.equals("tan") || str1.equals("cos") || str1.equals("sin")) {
                bu[i].addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String s = jt.getText();
                        if (s.compareTo("0") == 0) {
                            jt.setText(str1 + "(");
                        } else {
                            jt.setText(new StringBuffer(s).append(str1).append("(").toString());
                        }
                    }
                });
            } else if (str1.equals("DEL")) {
                bu[i].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        StringBuffer sb = new StringBuffer(jt.getText());
                        if (sb.length() == 1) {
                            jt.setText("0");
                        } else {
                            jt.setText(sb.deleteCharAt(sb.length() - 1).toString());
                        }
                        ja.setText("");
                    }
                });
            } else if (str1.equals("CE")) {
                bu[i].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        StringBuffer sb = new StringBuffer(jt.getText());
                        for (int i = sb.length() - 1; i >= 0
                                && (Character.isDigit(sb.charAt(i)) || sb.charAt(i) == '.'); i--) {
                            sb.deleteCharAt(i);
                        }
                        if (sb.length() == 0) {
                            sb.append('0');
                        }
                        jt.setText(sb.toString());
                        ja.setText("");
                    }
                });
            } else if (str1.equals("C")) {
                bu[i].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        jt.setText("0");
                        ja.setText("");
                    }
                });
            } else if (str1.equals("=")) {
                bu[i].addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String s = jt.getText();

                        ja.setText(ReversePolish.reverse(s));
                        // jt.requestFocus();
                    }

                });
            } else {
                bu[i].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        String s = jt.getText();
                        if (s.compareTo("0") == 0 && !judge(str1)) {
                            jt.setText(str1);
                        } else {
                            jt.setText(s + str1);
                        }
                    }
                });
            }

            jp.add(bu[i]);
        }

        jf.add(text, BorderLayout.NORTH);
        jf.add(jp);
        jf.setVisible(true);
    }

    private static boolean judge(String s) {
        if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%") || s.equals(".")) {
            return true;
        } else {
            return false;
        }
    }

}

运算处理:

package cal;

import java.util.LinkedList;

public class ReversePolish {

    private static LinkedList<String> number = new LinkedList<String>();
    private static LinkedList<String> symbol = new LinkedList<String>();
    private static LinkedList<String> operation = new LinkedList<String>();

    private static void initialization(){
        number.clear();
        symbol.clear();
        operation.clear();
    }

    private static String[] handle(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '+'||ch == '-'||ch == '*'||ch == '/'||ch == '(' || ch == ')'||ch == '%') {
                int index = sb.length();
                if(index > 0 && sb.charAt(index-1) != ' ') {
                    sb.append(' ');
                }
                sb.append(ch).append(' ');

            } else if (ch == 't') {
                sb.append("tan");
                i += 2;

            } else if (ch == 's') {
                sb.append("sin");
                i += 2;

            } else if (ch == 'c') {
                sb.append("cos");
                i += 2;

            } else {
                sb.append(ch);
            }
        }


        return sb.toString().trim().split(" ");
    }

    public static String reverse(String s) {
        initialization();

        String[] str = handle(s);

        //构建逆波兰表达式
        for (String ss : str) {
            //System.out.println(ss);

            if (Character.isDigit(ss.charAt(0))) {
                number.add(ss);
            } else if (symbol.size() == 0) {
                symbol.add(ss);
            } else if (judge(symbol.getFirst(), ss)) {
                symbol.addFirst(ss);
            } else {
                if (ss.compareTo(")") == 0) {
                    while (!symbol.isEmpty()) {
                        if (symbol.getFirst().compareTo("(") == 0) {
                            symbol.removeFirst();
                            if(symbol.isEmpty()) {
                                break;
                            }
                            if((symbol.getFirst().equals("tan")||symbol.getFirst().equals("sin")||symbol.getFirst().equals("cos"))) {

                                number.add(symbol.removeFirst());
                            }
                            break;
                        } else {
                            number.add(symbol.removeFirst());
                        }
                    }
                } else {
                    while (!symbol.isEmpty() && !judge(symbol.getFirst(), ss)) {
                        number.add(symbol.removeFirst());
                    }
                    symbol.addFirst(ss);
                }
            }
        }
        while (!symbol.isEmpty()) {
            number.add(symbol.removeFirst());
        }

        //计算结果
        for (int i = 0; i < number.size(); i++) {
            //System.out.println(number.get(i));

            char ch = number.get(i).charAt(0);
            if (Character.isDigit(ch)) {
                operation.addFirst(number.get(i));

            } else if (ch == 't') {
                double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
                operation.addFirst(String.valueOf(Math.tan(a)));

            } else if (ch == 's') {
                double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
                operation.addFirst(String.valueOf(Math.sin(a)));

            } else if (ch == 'c') {
                double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
                operation.addFirst(String.valueOf(Math.cos(a)));

            } else if (ch == '*') {
                double a = Double.valueOf(operation.removeFirst());
                double b = Double.valueOf(operation.removeFirst());
                operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b * a))));

            } else if (ch == '/') {
                if(number.get(i-1).compareTo("0") == 0){
                    return "除数不能为零!";
                }
                double a = Double.valueOf(operation.removeFirst());
                double b = Double.valueOf(operation.removeFirst());
                System.out.println(a+" "+b+" "+String.valueOf(b/a));
                operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b / a))));

            } else if (ch == '%') {
                String a = operation.removeFirst();
                String b = operation.removeFirst();
                if(a.indexOf('.') != -1 || b.indexOf('.') != -1) {
                    return "浮点类型数据不能进行取模运算!";
                }
                operation.addFirst(String.valueOf(Integer.valueOf(b) % Integer.valueOf(a)));

            } else if (ch == '+') {
                double a = Double.valueOf(operation.removeFirst());
                double b = Double.valueOf(operation.removeFirst());
                operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b + a))));

            } else if (ch == '-') {
                double a = Double.valueOf(operation.removeFirst());
                double b = Double.valueOf(operation.removeFirst());
                operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b - a))));

            }
        }

        return operation.getFirst();
    }

    private static String delSuffixZero(StringBuffer str) {
        int start = str.indexOf(".");
        int end = str.length();
        int i;
        for(i = end-1; i >= start && str.charAt(i) == '0'; i--);
        if(i < end-1) {
            str.delete(i, end);
        }
        return str.toString();
    }

    /*
     * 判断栈顶符号与待进栈符号的优先级 s为栈顶符号,s2为待进栈符号 若s2优先级小于
     * 等于s返回false,否则返回true
     */
    private static boolean judge(String s, String s2) {
        if (s2.compareTo(")") == 0) {
            return false;
        } else if (s2.compareTo("-") == 0 || s2.compareTo("+") == 0) {
            if(s.equals("(") || s.equals("tan") || s.equals("sin") || s.equals("cos")) {
                return true;
            }
            return false;
        } else if (s2.compareTo("*") == 0 || s2.compareTo("/") == 0 || s2.compareTo("%") == 0) {
            if (s.compareTo("*") == 0 || s2.compareTo("/") == 0 || s2.compareTo("%") == 0) {
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

}

效果图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/k_young1997/article/details/81514733