返回顶部
首页 > 资讯 > 后端开发 > Python >java实现科学计算器的全过程与代码
  • 685
分享到

java实现科学计算器的全过程与代码

2024-04-02 19:04:59 685人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍实现思路实现过程和代码1.界面设计2.栈,中缀转后缀3.判断错误4.计算后缀表达式5.事件监听器完整代码总结介绍 本次设计的是一个有33个按钮的科学计算器。可以进行加,减,乘

介绍

本次设计的是一个有33个按钮的科学计算器。可以进行加,减,乘,除,开根号,阶乘,次方,百分号,对数,三角函数的计算。

实现思路

通过点击按钮可以得到一个算术表达式,并且它是一个字符串类型,然后需要做的就是把这个字符串转化为计算机可计算的形式。这里就需要用到中缀表达式转化为后缀表达式。转化完之后通过栈来一步步的进行输出和计算,最后输出结果。

实现过程和代码

1.界面设计

设计效果如图所示:

计算器界面

由图片可知,总共设计了两个文本框和33个按钮(这里的布局是我直接用setBounds()方法设计的。因为如果用布局管理器的话要达到自己想要的效果不太方便)。

在设计时要注意的是:

1.不能把按钮和文本框直接加入JFrame中,因为如果JFrame.setLayout(null)的话,面板上就会出问题,什么都看不到或者其他情况。因此建议创建一个JPanel,把JPanel的setLayout()设置为空。把按钮和文本框加入到JPanel中,再把JPanel加入到JFrame中。就不会出问题了。JFrame的布局管理器默认为流式布局,位置是中心区域。

2.设计完长度后,宽度一般要再加15个像素点,高度要再加35个像素点.要不然会有一部分按钮看不到。如我本意要设计的面板宽为600,高为400,则实际上是

jFrame.setSize(614, 437);

下面就是我设计的界面的代码:

	private JFrame jFrame = new JFrame("计算器");
	//设置字体,是否加粗,大小
    private FontUIResource f = new FontUIResource("隶书", 1, 20);
    private FontUIResource f1 = new FontUIResource("楷书", 0, 35);
    private JPanel jPanel = new JPanel();
    private int buttonx = 100;
    private int buttony = 50;
    private int yy = 50;
    //两个文本框
    private JTextField jTextField1 = new JTextField("0", 30);
    private JTextField jTextField2 = new JTextField("输入要求在main()中", 30);
    private String str = "";
    private String temp = "";
    private int indexYN = 0;
    private String[] strings = {
            "(", ")", "1/x", "x^2", "x^3", "x^y",
            "x!", "√", "e", "ln", "log", "%",
            "sin", "cos", "tan", "π", "+", "=",
            "7", "8", "9", "0", "-",
            "4", "5", "6", ".", "*",
            "1", "2", "3", "c", "÷"
    };
    //33个按钮
    private JButton[] buttons = new JButton[33];

    public void loAsi(){
        int tep = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 6; j++) {
                buttons[tep] = new JButton(strings[tep]);
                buttons[tep].setFont(f);
                buttons[tep++].setFocusable(false);
            }
        }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                buttons[tep] = new JButton(strings[tep]);
                buttons[tep].setFont(f);
                buttons[tep++].setFocusable(false);
            }
        }
        int lo = 0;
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 6; j++) {
                buttons[lo++].setBounds(buttonx * j, yy * (2 + i), buttonx, buttony);
            }
        }
        for (int i = 0; i < 5; i++) {
            buttons[lo++].setBounds(buttonx * i, yy * 4, buttonx, buttony);
        }
        buttons[lo++].setBounds(buttonx * 5, yy * 4, buttonx, buttony * 4);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                buttons[lo++].setBounds(buttonx * j, yy * (5 + i), buttonx, buttony);
            }
        }
        jTextField1.setBounds(0, yy, 600, yy);//设置位置
        jTextField1.setFont(f1);设置字体
        jTextField1.setHorizontalAlignment(JLabel.RIGHT);//文本靠右
        jTextField1.setEditable(false);//不可修改
        jTextField1.setBackground(Color.WHITE);//颜色为白色
        jTextField2.setBounds(0, 0, 600, yy);
        jTextField2.setFont(f1);
        jTextField2.setHorizontalAlignment(JLabel.RIGHT);
        jTextField2.setEditable(false);
        jTextField2.setBackground(Color.WHITE);
    }
    public void initButton(){//把按钮添加到jPanel中
        this.loAsi();
        jPanel.add(jTextField1);
        jPanel.add(jTextField2);
        for (int i = 0; i < buttons.length; i++) {
            jPanel.add(buttons[i]);
        }
        jPanel.setLayout(null);//布局管理器为空,自定义设计
    }
     public void init(){
        this.initButton();
        this.buttonLister();
        jFrame.add(jPanel);//把jPanel添加到jFrame中
        jFrame.setSize(614, 437);//jFrame的长宽
        jFrame.setResizable(false);//大小不可修改
        jFrame.setLocationRelativeTo(null);//位置为显示器的正中间
        //窗口监听器,点右上角的关闭就关闭窗口
        //可以不写,应为JFrame默认的就可以关闭,不需要写事件监听器。如果是Frame的话需要写。
        jFrame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        jFrame.setVisible(true);//设置面板可见
    }

2.栈,中缀转后缀

我总共设计了12种运算符:(+, -, * , /, ^, !, g, l, o, s, c, t)分别是加,减,乘,除,次方,阶乘,开根号,,对数ln, 对数log2, sin, cos, tan
e是Math.E, p是Math.PI, %是直接乘以0.001

把中缀表达式转换为后缀表达式。例如:

中缀表达式:1+2*3+(l2+3)/2

后缀表达式为:123*+23+2/+

后缀表达式的运算步骤是:

1.16+23+2/+
2.723+2/+
3.752/+
4.7 2.5+
5.9.5

代码如下:

private List<String> zhongZhui(String str) {//把输入的字符串转换成中缀表达式。存入list中
        int index = 0;
        List<String> list = new ArrayList<>();
        do{
            char ch = str.charAt(index);
            if("+-*/^!logsct()".indexOf(str.charAt(index)) >= 0){
                //是操作符,直接添加至list中
                index ++;
                list.add(ch+"");
            }else if (str.charAt(index) == 'e' || str.charAt(index) == 'p'){
                index ++;
                list.add(ch+"");
            } else if("0123456789".indexOf(str.charAt(index)) >= 0){
                //是数字,判断多位数的情况
                String str1 = "";
                while (index < str.length() && "0123456789.".indexOf(str.charAt(index)) >= 0){
                    str1 += str.charAt(index);
                    index ++;
                }
                list.add(str1);

            }
        }while (index < str.length());
        return list;
    }

    public List<String> houZhui(List<String> list){//中缀表达式转换称后缀表达式
        Stack<String> fuZhan = new Stack<>();
        List<String> list2 = new ArrayList<>();
        if (!list.isEmpty()) {
            for (int i = 0; i < list.size(); i++) {
                if (isNumber(list.get(i))){
                    list2.add(list.get(i));
                } else if (list.get(i).charAt(0) == '('){
                    fuZhan.push(list.get(i));
                } else if (isOperator(list.get(i)) && list.get(i).charAt(0) != '('){
                    if (fuZhan.isEmpty()){
                        fuZhan.push(list.get(i));
                    } else {//符栈不为空
                        if (list.get(i).charAt(0) != ')'){
                            if (adv(fuZhan.peek()) <= adv(list.get(i))){
                                //入栈
                                fuZhan.push(list.get(i));
                            } else {//出栈
                                while (!fuZhan.isEmpty() && !"(".equals(fuZhan.peek())){
                                    if(adv(list.get(i)) <= adv(fuZhan.peek())){
                                        list2.add(fuZhan.pop());
                                    }
                                }
                                if (fuZhan.isEmpty() || fuZhan.peek().charAt(0) == '('){
                                    fuZhan.push(list.get(i));
                                }
                            }
                        } else if (list.get(i).charAt(0) == ')'){
                            while (fuZhan.peek().charAt(0) != '('){
                                list2.add(fuZhan.pop());
                            }
                            fuZhan.pop();
                        }
                    }
                }
            }
            while (!fuZhan.isEmpty()){
                list2.add(fuZhan.pop());
            }
        } else {
            jTextField1.setText("");
        }
        return list2;
    }
    public static boolean isOperator(String op){//判断是否为操作符
        if ("0123456789.ep".indexOf(op.charAt(0)) == -1) {
            return true;
        } else {
            return false;
        }
    }
    public static boolean isNumber(String num){//判断是否为操作数
        if ("0123456789ep".indexOf(num.charAt(0)) >= 0) {
            return true;
        } else {
            return false;
        }
    }
    public static int adv(String f){//判断操作符的优先级
        int result = 0;
        switch(f) {
            case "+":
                result = 1;
                break;
            case "-":
                result = 1;
                break;
            case "*":
                result = 2;
                break;
            case "/":
                result = 2;
                break;
            case "^":
                result = 3;
                break;
            case "!":
                result = 4;
                break;
            case "g":
                result = 4;
                break;
            case "l":
                result = 4;
                break;
            case "o":
                result = 4;
                break;
            case "s":
                result = 4;
                break;
            case "c":
                result = 4;
                break;
            case "t":
                result = 4;
                break;
        }
        return result;
    }

3.判断错误

下面是一些我能想到的一些输入错误和运算错误:

//当只有一位字符时,只能是“0123456789ep”中的一个
//1.第一个字符只能为"losctg(0123456789ep"中的一个
//2.“±/”后面只能是"0123456789losctg(ep"中的一个
//3.".“后面只能是“0123456789”中的一个
//4.”!"后面只能是“±/^)”中的一个
//5."losctg"后面只能是“0123456789(ep”中的一个
//6."0"的判断操作
//1.当0的上一个字符不为"0123456789."时,后一位只能是“±/.!^)”中的一个
//2.如果0的上一位为“.”,则后一位只能是“0123456789±/.^)”中的一个
//3.如果0到上一个运算符之间没有“.”的话,整数位第一个只能是“123456789”,
// 且后一位只能是“0123456789±/.!^)”中的一个。
//4.如果0到上一个运算符之间有一个“.”的话,则后一位只能是“0123456789±/.^)”中的一个
//7."123456789"后面只能是“0123456789±/.!^)”中的一个
//8."(“后面只能是“0123456789locstg()ep”中的一个
//9.”)"后面只能是“±/!^)”中的一个
//10.最后一位字符只能是“0123456789!)ep”中的一个
//12.不能有多个“.”
//13."ep"后面只能是“±*/^)”中的一个
除数不能为0
阶乘必须为自然数
ln的x必须大于0
log的x必须大于0
tan的x不能为±(π/2 + kπ)
括号是否匹配

代码如下:

public void estimate(){//判断输入是否错误
        int i = 0;
        if (str.length() == 0){
        }
        if (str.length() == 1){
            //当只有一位字符时,只能是“0123456789ep”中的一个
            if ("0123456789ep".indexOf(str.charAt(0)) == -1){
                jTextField1.setText("输入错误!");
                indexYN = 1;
            }
        }
        if (str.length() > 1){
            for (i = 0; i < str.length() - 1; i++) {
                //1.第一个字符只能为"losctg(0123456789ep"中的一个
                if ("losctg(0123456789ep".indexOf(str.charAt(0)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //2.“+-*/”后面只能是"0123456789losctg(ep"中的一个
                if ("+-*/".indexOf(str.charAt(i)) >= 0 && "0123456789losctg(ep".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //3."."后面只能是“0123456789”中的一个
                if (str.charAt(i) == '.' && "0123456789".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //4."!"后面只能是“+-*/^)”中的一个
                if (str.charAt(i) == '!' && "+-*/^)".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //5."losctg"后面只能是“0123456789(ep”中的一个
                if ("losctg".indexOf(str.charAt(i)) >= 0 && "0123456789(ep".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //6."0"的判断操作
                if (str.charAt(0) == '0' && str.charAt(1) == '0'){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                if (i >= 1 && str.charAt(i) == '0'){
                    //&& str.charAt(0) == '0' && str.charAt(1) == '0'
                    int m = i;
                    int n = i;
                    int is = 0;
                    //1.当0的上一个字符不为"0123456789."时,后一位只能是“+-*/.!^)”中的一个
                    if ("0123456789.".indexOf(str.charAt(m - 1)) == -1 && "+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }
                    //2.如果0的上一位为“.”,则后一位只能是“0123456789+-*/.^)”中的一个
                    if (str.charAt(m - 1) == '.' && "0123456789+-*/.^)".indexOf(str.charAt(i + 1)) == -1){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }
                    n -= 1;
                    while (n > 0){
                        if ("(+-*/^glosct".indexOf(str.charAt(n)) >= 0){
                            break;
                        }
                        if (str.charAt(n) == '.'){
                            is++;
                        }
                        n--;
                    }

                    //3.如果0到上一个运算符之间没有“.”的话,整数位第一个只能是“123456789”,
                    //  且后一位只能是“0123456789+-*/.!^)”中的一个。
                    if ((is == 0 && str.charAt(n) == '0') || "0123456789+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }
                    //4.如果0到上一个运算符之间有一个“.”的话,则后一位只能是“0123456789+-*/.^)”中的一个
                    if (is == 1 && "0123456789+-*/.^)".indexOf(str.charAt(i + 1)) == -1){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }
                    if (is > 1){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }

                }
                //7."123456789"后面只能是“0123456789+-*/.!^)”中的一个
                if ("123456789".indexOf(str.charAt(i)) >= 0 && "0123456789+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //8."("后面只能是“0123456789locstg()ep”中的一个
                if (str.charAt(i) == '(' && "0123456789locstg()ep".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //9.")"后面只能是“+-*/!^)”中的一个
                if (str.charAt(i) == ')' && "+-*/!^)".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //10.最后一位字符只能是“0123456789!)ep”中的一个
                if ("0123456789!)ep".indexOf(str.charAt(str.length() - 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
                //12.不能有多个“.”
                if (i > 2 && str.charAt(i) == '.'){
                    int n = i - 1;
                    int is = 0;
                    while (n > 0){
                        if ("(+-*/^glosct".indexOf(str.charAt(n)) >= 0){
                            break;
                        }
                        if (str.charAt(n) == '.'){
                            is++;
                        }
                        n--;
                    }
                    if (is > 0){
                        jTextField1.setText("输入错误!");
                        indexYN = 1;
                    }
                }
                //13."ep"后面只能是“+-*/^)”中的一个
                if ("ep".indexOf(str.charAt(i)) >= 0 && "+-*/^)".indexOf(str.charAt(i + 1)) == -1){
                    jTextField1.setText("输入错误!");
                    indexYN = 1;
                }
            }
        }
    }

4.计算后缀表达式

代码如下:

public double math(List<String> list2) {//通过后缀表达式进行计算
        Stack<String> stack = new Stack<String>();
        for (int i = 0; i < list2.size(); i++) {
            if (isNumber(list2.get(i))) {
                if (list2.get(i).charAt(0) == 'e'){
                    stack.push(String.valueOf(Math.E));
                } else if (list2.get(i).charAt(0) == 'p'){
                    stack.push(String.valueOf(Math.PI));
                } else {
                    stack.push(list2.get(i));
                }
            } else if (isOperator(list2.get(i))){
                double res = 0;
                if (list2.get(i).equals("+")) {
                    double num2 = Double.parseDouble(stack.pop());
                    double num1 = Double.parseDouble(stack.pop());
                    res = num1 + num2;
                } else if (list2.get(i).equals("-")) {
                    double num2 = Double.parseDouble(stack.pop());
                    double num1 = Double.parseDouble(stack.pop());
                    res = num1 - num2;
                } else if (list2.get(i).equals("*")) {
                    double num2 = Double.parseDouble(stack.pop());
                    double num1 = Double.parseDouble(stack.pop());
                    res = num1 * num2;
                } else if (list2.get(i).equals("/")) {
                    double num2 = Double.parseDouble(stack.pop());
                    double num1 = Double.parseDouble(stack.pop());
                    if (num2 != 0){
                        res = num1 / num2;
                    } else {
                        jTextField1.setText("除数不能为0");
                        indexYN = 1;
                    }
                } else if (list2.get(i).equals("^")) {
                    double num2 = Double.parseDouble(stack.pop());
                    double num1 = Double.parseDouble(stack.pop());
                    res = Math.pow(num1, num2);
                } else if (list2.get(i).equals("!")) {
                    double num1 = Double.parseDouble(stack.pop());
                    if (num1 == 0 || num1 == 1){
                        res = 1;
                    } else if (num1 == (int)num1 && num1 > 1){
                        int d = 1;
                        for (int j = (int)num1; j >0; j--) {
                            d *= j;
                        }
                        res = d;
                    } else {
                        jTextField1.setText("阶乘必须为自然数");
                        indexYN = 1;
                    }
                } else if (list2.get(i).equals("g")) {
                    double num1 = Double.parseDouble(stack.pop());
                    res = Math.sqrt(num1);
                } else if (list2.get(i).equals("l")) {
                    double num1 = Double.parseDouble(stack.pop());
                    if (num1 > 0){
                        res = Math.log(num1);
                    } else {
                        jTextField1.setText("ln的x必须大于0");
                        indexYN = 1;
                    }
                } else if (list2.get(i).equals("o")) {
                    double num1 = Double.parseDouble(stack.pop());
                    if (num1 > 0){
                        res = Math.log(num1) / Math.log(2);
                    } else {
                        jTextField1.setText("log的x必须大于0");
                        indexYN = 1;
                    }
                } else if (list2.get(i).equals("s")) {
                    double num1 = Double.parseDouble(stack.pop());
                    res = Math.sin(num1);
                } else if (list2.get(i).equals("c")) {
                    double num1 = Double.parseDouble(stack.pop());
                    res = Math.cos(num1);
                } else if (list2.get(i).equals("t")) {
                    double num1 = Double.parseDouble(stack.pop());
                    if (Math.cos(num1) != 0){
                        res = Math.tan(num1);
                    } else {
                        jTextField1.setText("tan的x不能为+-(π/2 + kπ)");
                        indexYN = 1;
                    }
                }
                stack.push("" + res);
            }
        }
        if (indexYN == 0){
            if (!stack.isEmpty()){
                return Double.parseDouble(stack.pop());
            } else {
                return 0;
            }
        } else {
            return -999999;
        }
    }

    public void zhanDui(){//进行计算,并且判断括号是否匹配
        String khao = "";
        int leftkh = 0;
        int rightkh = 0;
        int m = 0;
        //判断括号是否成对
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '('){
                khao += '(';
                leftkh++;
            }
            if (str.charAt(i) == ')'){
                khao += ')';
                rightkh++;
            }
        }
        if (leftkh != rightkh){
            jTextField1.setText("输入错误!括号不匹配");
            indexYN = 1;
        }
        if ((leftkh == 0 && rightkh == 0) || ((leftkh == rightkh && leftkh > 0) && khao.charAt(0) == '(' && khao.charAt(khao.length() - 1) == ')')){
            if (indexYN == 0){
                List<String> list1 = zhongZhui(str);
                //System.out.println(list1);
                List<String> list2 = houZhui(list1);
                //System.out.println(list2);
                if (indexYN == 0){
                    if (math(list2) == -999999){
                        jTextField1.setText(jTextField1.getText());
                    } else {
                        jTextField1.setText(String.valueOf(math(list2)));
                        jTextField2.setText(String.valueOf(math(list2)));
                        jTextField2.setText(String.valueOf(math(list2)));
                    }
                }
            }
        } else {
            jTextField1.setText("输入错误!括号不匹配");
            indexYN = 1;
        }
    }

5.事件监听器

因为设置了33个按钮,所以每个按钮都要设计事件监听器,我设置的目的是把点中的按钮的值写入到文本框中输出,并且把它代表的数值或者操作符存放到字符串中,以便于进行中缀转后缀和运算。

代码如下:

public void buttonLister(){//事件监听器
     int tep = 0;
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerfORMed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "(");
             str += "(";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + ")");
             str += ")";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "1/");
             str += "1/";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^2");
             str += "^2";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^3");
             str += "^3";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^");
             str += "^";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "!");
             str += "!";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "√");
             str += "g";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "e");
             str += "e";
             //str += "2.7182818284590452354";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "ln");
             str += "l";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "log");
             str += "o";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "%");
             str += "*0.01";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "sin");
             str += "s";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "cos");
             str += "c";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "tan");
             str += "t";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "π");
             str += "p";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "+");
             str += "+";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             if (str != ""){
                 estimate();
                 zhanDui();
             } else {
                 str = "";
             }
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "7");
             str += "7";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "8");
             str += "8";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "9");
             str += "9";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "0");
             str += "0";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "-");
             str += "-";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "4");
             str += "4";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "5");
             str += "5";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "6");
             str += "6";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + ".");
             str += ".";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "*");
             str += "*";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "1");
             str += "1";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "2");
             str += "2";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "3");
             str += "3";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText("");
             str = "";
             indexYN = 0;
         }
     });
     buttons[tep].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "÷");
             str += "/";
         }
     });
 }

完整代码

直接拷贝到Java中就可以用:

一个类走完程序。

main函数中还可以设置面板风格。有

  • Niumbus风格
  • windows风格
  • Windows经典风格

三种风格可以自定义选择,我个人觉得Niumbus风格比较好看。选择哪一个就释放哪一个,把另外两个注释掉就可以了。

package com.lmdxyt;

import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class jsQ {
 private JFrame jFrame = new JFrame("计算器");
 private FontUIResource f = new FontUIResource("隶书", 1, 20);
 private FontUIResource f1 = new FontUIResource("楷书", 0, 35);
 private JPanel jPanel = new JPanel();
 private int buttonx = 100;
 private int buttony = 50;
 private int yy = 50;
 private JTextField jTextField1 = new JTextField("0", 30);
 private JTextField jTextField2 = new JTextField("输入要求在main()中", 30);
 private String str = "";
 private String temp = "";
 private int indexYN = 0;
 private String[] strings = {
         "(", ")", "1/x", "x^2", "x^3", "x^y",
         "x!", "√", "e", "ln", "log", "%",
         "sin", "cos", "tan", "π", "+", "=",
         "7", "8", "9", "0", "-",
         "4", "5", "6", ".", "*",
         "1", "2", "3", "c", "÷"
 };
 private JButton[] buttons = new JButton[33];

 public void loAsi(){
     int tep = 0;
     for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 6; j++) {
             buttons[tep] = new JButton(strings[tep]);
             buttons[tep].setFont(f);
             buttons[tep++].setFocusable(false);
         }
     }
     for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 5; j++) {
             buttons[tep] = new JButton(strings[tep]);
             buttons[tep].setFont(f);
             buttons[tep++].setFocusable(false);
         }
     }
     int lo = 0;
     for (int i = 0; i < 2; i++) {
         for (int j = 0; j < 6; j++) {
             buttons[lo++].setBounds(buttonx * j, yy * (2 + i), buttonx, buttony);
         }
     }
     for (int i = 0; i < 5; i++) {
         buttons[lo++].setBounds(buttonx * i, yy * 4, buttonx, buttony);
     }
     buttons[lo++].setBounds(buttonx * 5, yy * 4, buttonx, buttony * 4);
     for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 5; j++) {
             buttons[lo++].setBounds(buttonx * j, yy * (5 + i), buttonx, buttony);
         }
     }
     jTextField1.setBounds(0, yy, 600, yy);
     jTextField1.setFont(f1);
     jTextField1.setHorizontalAlignment(JLabel.RIGHT);
     jTextField1.setEditable(false);
     jTextField1.setBackground(Color.WHITE);
     jTextField2.setBounds(0, 0, 600, yy);
     jTextField2.setFont(f1);
     jTextField2.setHorizontalAlignment(JLabel.RIGHT);
     jTextField2.setEditable(false);
     jTextField2.setBackground(Color.WHITE);
 }
 public void initButton(){//把按钮添加到jPanel中
     this.loAsi();
     jPanel.add(jTextField1);
     jPanel.add(jTextField2);
     for (int i = 0; i < buttons.length; i++) {
         jPanel.add(buttons[i]);
     }
     jPanel.setLayout(null);
 }

 private List<String> zhongZhui(String str) {//把输入的字符串转换成中缀表达式。存入list中
     int index = 0;
     List<String> list = new ArrayList<>();
     do{
         char ch = str.charAt(index);
         if("+-*/^!logsct()".indexOf(str.charAt(index)) >= 0){
             //是操作符,直接添加至list中
             index ++;
             list.add(ch+"");
         }else if (str.charAt(index) == 'e' || str.charAt(index) == 'p'){
             index ++;
             list.add(ch+"");
         } else if("0123456789".indexOf(str.charAt(index)) >= 0){
             //是数字,判断多位数的情况
             String str1 = "";
             while (index < str.length() && "0123456789.".indexOf(str.charAt(index)) >= 0){
                 str1 += str.charAt(index);
                 index ++;
             }
             list.add(str1);

         }
     }while (index < str.length());
     return list;
 }

 public List<String> houZhui(List<String> list){//中缀表达式转换称后缀表达式
     Stack<String> fuZhan = new Stack<>();
     List<String> list2 = new ArrayList<>();
     if (!list.isEmpty()) {
         for (int i = 0; i < list.size(); i++) {
             if (isNumber(list.get(i))){
                 list2.add(list.get(i));
             } else if (list.get(i).charAt(0) == '('){
                 fuZhan.push(list.get(i));
             } else if (isOperator(list.get(i)) && list.get(i).charAt(0) != '('){
                 if (fuZhan.isEmpty()){
                     fuZhan.push(list.get(i));
                 } else {//符栈不为空
                     if (list.get(i).charAt(0) != ')'){
                         if (adv(fuZhan.peek()) <= adv(list.get(i))){
                             //入栈
                             fuZhan.push(list.get(i));
                         } else {//出栈
                             while (!fuZhan.isEmpty() && !"(".equals(fuZhan.peek())){
                                 if(adv(list.get(i)) <= adv(fuZhan.peek())){
                                     list2.add(fuZhan.pop());
                                 }
                             }
                             if (fuZhan.isEmpty() || fuZhan.peek().charAt(0) == '('){
                                 fuZhan.push(list.get(i));
                             }
                         }
                     } else if (list.get(i).charAt(0) == ')'){
                         while (fuZhan.peek().charAt(0) != '('){
                             list2.add(fuZhan.pop());
                         }
                         fuZhan.pop();
                     }
                 }
             }
         }
         while (!fuZhan.isEmpty()){
             list2.add(fuZhan.pop());
         }
     } else {
         jTextField1.setText("");
     }
     return list2;
 }
 public static boolean isOperator(String op){//判断是否为操作符
     if ("0123456789.ep".indexOf(op.charAt(0)) == -1) {
         return true;
     } else {
         return false;
     }
 }
 public static boolean isNumber(String num){//判断是否为操作数
     if ("0123456789ep".indexOf(num.charAt(0)) >= 0) {
         return true;
     } else {
         return false;
     }
 }
 public static int adv(String f){//判断操作符的优先级
     int result = 0;
     switch(f) {
         case "+":
             result = 1;
             break;
         case "-":
             result = 1;
             break;
         case "*":
             result = 2;
             break;
         case "/":
             result = 2;
             break;
         case "^":
             result = 3;
             break;
         case "!":
             result = 4;
             break;
         case "g":
             result = 4;
             break;
         case "l":
             result = 4;
             break;
         case "o":
             result = 4;
             break;
         case "s":
             result = 4;
             break;
         case "c":
             result = 4;
             break;
         case "t":
             result = 4;
             break;

     }
     return result;
 }

 public void buttonLister(){//事件监听器
     int tep = 0;
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "(");
             str += "(";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + ")");
             str += ")";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "1/");
             str += "1/";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^2");
             str += "^2";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^3");
             str += "^3";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "^");
             str += "^";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "!");
             str += "!";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "√");
             str += "g";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "e");
             str += "e";
             //str += "2.7182818284590452354";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "ln");
             str += "l";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "log");
             str += "o";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "%");
             str += "*0.01";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "sin");
             str += "s";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "cos");
             str += "c";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "tan");
             str += "t";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "π");
             str += "p";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "+");
             str += "+";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             if (str != ""){
                 estimate();
                 zhanDui();
             } else {
                 str = "";
             }
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "7");
             str += "7";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "8");
             str += "8";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "9");
             str += "9";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "0");
             str += "0";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "-");
             str += "-";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "4");
             str += "4";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "5");
             str += "5";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "6");
             str += "6";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + ".");
             str += ".";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "*");
             str += "*";
         }
     });

     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "1");
             str += "1";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "2");
             str += "2";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "3");
             str += "3";
         }
     });
     buttons[tep++].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText("");
             str = "";
             indexYN = 0;
         }
     });
     buttons[tep].addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             jTextField1.setText(jTextField1.getText() + "÷");
             str += "/";
         }
     });
 }

 public void init(){
     this.initButton();
     this.buttonLister();
     jFrame.add(jPanel);
     jFrame.setSize(614, 437);
     jFrame.setResizable(false);
     jFrame.setLocationRelativeTo(null);
     jFrame.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
             System.exit(0);
         }
     });
     jFrame.setVisible(true);
 }
 public void estimate(){//判断输入是否错误
     int i = 0;
     if (str.length() == 0){
     }
     if (str.length() == 1){
         //当只有一位字符时,只能是“0123456789ep”中的一个
         if ("0123456789ep".indexOf(str.charAt(0)) == -1){
             jTextField1.setText("输入错误!");
             indexYN = 1;
         }
     }
     if (str.length() > 1){
         for (i = 0; i < str.length() - 1; i++) {
             //1.第一个字符只能为"losctg(0123456789ep"中的一个
             if ("losctg(0123456789ep".indexOf(str.charAt(0)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //2.“+-*/”后面只能是"0123456789losctg(ep"中的一个
             if ("+-*/".indexOf(str.charAt(i)) >= 0 && "0123456789losctg(ep".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //3."."后面只能是“0123456789”中的一个
             if (str.charAt(i) == '.' && "0123456789".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //4."!"后面只能是“+-*/^)”中的一个
             if (str.charAt(i) == '!' && "+-*/^)".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //5."losctg"后面只能是“0123456789(ep”中的一个
             if ("losctg".indexOf(str.charAt(i)) >= 0 && "0123456789(ep".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //6."0"的判断操作
             if (str.charAt(0) == '0' && str.charAt(1) == '0'){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             if (i >= 1 && str.charAt(i) == '0'){
                 //&& str.charAt(0) == '0' && str.charAt(1) == '0'
                 int m = i;
                 int n = i;
                 int is = 0;
                 //1.当0的上一个字符不为"0123456789."时,后一位只能是“+-*/.!^)”中的一个
                 if ("0123456789.".indexOf(str.charAt(m - 1)) == -1 && "+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }
                 //2.如果0的上一位为“.”,则后一位只能是“0123456789+-*/.^)”中的一个
                 if (str.charAt(m - 1) == '.' && "0123456789+-*/.^)".indexOf(str.charAt(i + 1)) == -1){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }
                 n -= 1;
                 while (n > 0){
                     if ("(+-*/^glosct".indexOf(str.charAt(n)) >= 0){
                         break;
                     }
                     if (str.charAt(n) == '.'){
                         is++;
                     }
                     n--;
                 }

                 //3.如果0到上一个运算符之间没有“.”的话,整数位第一个只能是“123456789”,
                 //  且后一位只能是“0123456789+-*/.!^)”中的一个。
                 if ((is == 0 && str.charAt(n) == '0') || "0123456789+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }
                 //4.如果0到上一个运算符之间有一个“.”的话,则后一位只能是“0123456789+-*/.^)”中的一个
                 if (is == 1 && "0123456789+-*/.^)".indexOf(str.charAt(i + 1)) == -1){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }
                 if (is > 1){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }

             }
             //7."123456789"后面只能是“0123456789+-*/.!^)”中的一个
             if ("123456789".indexOf(str.charAt(i)) >= 0 && "0123456789+-*/.!^)".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //8."("后面只能是“0123456789locstg()ep”中的一个
             if (str.charAt(i) == '(' && "0123456789locstg()ep".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //9.")"后面只能是“+-*/!^)”中的一个
             if (str.charAt(i) == ')' && "+-*/!^)".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //10.最后一位字符只能是“0123456789!)ep”中的一个
             if ("0123456789!)ep".indexOf(str.charAt(str.length() - 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
             //12.不能有多个“.”
             if (i > 2 && str.charAt(i) == '.'){
                 int n = i - 1;
                 int is = 0;
                 while (n > 0){
                     if ("(+-*/^glosct".indexOf(str.charAt(n)) >= 0){
                         break;
                     }
                     if (str.charAt(n) == '.'){
                         is++;
                     }
                     n--;
                 }
                 if (is > 0){
                     jTextField1.setText("输入错误!");
                     indexYN = 1;
                 }
             }
             //13."ep"后面只能是“+-*/^)”中的一个
             if ("ep".indexOf(str.charAt(i)) >= 0 && "+-*/^)".indexOf(str.charAt(i + 1)) == -1){
                 jTextField1.setText("输入错误!");
                 indexYN = 1;
             }
         }
     }
 }
 public double math(List<String> list2) {//通过后缀表达式进行计算
     Stack<String> stack = new Stack<String>();
     for (int i = 0; i < list2.size(); i++) {
         if (isNumber(list2.get(i))) {
             if (list2.get(i).charAt(0) == 'e'){
                 stack.push(String.valueOf(Math.E));
             } else if (list2.get(i).charAt(0) == 'p'){
                 stack.push(String.valueOf(Math.PI));
             } else {
                 stack.push(list2.get(i));
             }
         } else if (isOperator(list2.get(i))){
             double res = 0;
             if (list2.get(i).equals("+")) {
                 double num2 = Double.parseDouble(stack.pop());
                 double num1 = Double.parseDouble(stack.pop());
                 res = num1 + num2;
             } else if (list2.get(i).equals("-")) {
                 double num2 = Double.parseDouble(stack.pop());
                 double num1 = Double.parseDouble(stack.pop());
                 res = num1 - num2;
             } else if (list2.get(i).equals("*")) {
                 double num2 = Double.parseDouble(stack.pop());
                 double num1 = Double.parseDouble(stack.pop());
                 res = num1 * num2;
             } else if (list2.get(i).equals("/")) {
                 double num2 = Double.parseDouble(stack.pop());
                 double num1 = Double.parseDouble(stack.pop());
                 if (num2 != 0){
                     res = num1 / num2;
                 } else {
                     jTextField1.setText("除数不能为0");
                     indexYN = 1;
                 }
             } else if (list2.get(i).equals("^")) {
                 double num2 = Double.parseDouble(stack.pop());
                 double num1 = Double.parseDouble(stack.pop());
                 res = Math.pow(num1, num2);
             } else if (list2.get(i).equals("!")) {
                 double num1 = Double.parseDouble(stack.pop());
                 if (num1 == 0 || num1 == 1){
                     res = 1;
                 } else if (num1 == (int)num1 && num1 > 1){
                     int d = 1;
                     for (int j = (int)num1; j >0; j--) {
                         d *= j;
                     }
                     res = d;
                 } else {
                     jTextField1.setText("阶乘必须为自然数");
                     indexYN = 1;
                 }
             } else if (list2.get(i).equals("g")) {
                 double num1 = Double.parseDouble(stack.pop());
                 res = Math.sqrt(num1);
             } else if (list2.get(i).equals("l")) {
                 double num1 = Double.parseDouble(stack.pop());
                 if (num1 > 0){
                     res = Math.log(num1);
                 } else {
                     jTextField1.setText("ln的x必须大于0");
                     indexYN = 1;
                 }
             } else if (list2.get(i).equals("o")) {
                 double num1 = Double.parseDouble(stack.pop());
                 if (num1 > 0){
                     res = Math.log(num1) / Math.log(2);
                 } else {
                     jTextField1.setText("log的x必须大于0");
                     indexYN = 1;
                 }
             } else if (list2.get(i).equals("s")) {
                 double num1 = Double.parseDouble(stack.pop());
                 res = Math.sin(num1);
             } else if (list2.get(i).equals("c")) {
                 double num1 = Double.parseDouble(stack.pop());
                 res = Math.cos(num1);
             } else if (list2.get(i).equals("t")) {
                 double num1 = Double.parseDouble(stack.pop());
                 if (Math.cos(num1) != 0){
                     res = Math.tan(num1);
                 } else {
                     jTextField1.setText("tan的x不能为+-(π/2 + kπ)");
                     indexYN = 1;
                 }
             }
             stack.push("" + res);
         }
     }
     if (indexYN == 0){
         if (!stack.isEmpty()){
             return Double.parseDouble(stack.pop());
         } else {
             return 0;
         }
     } else {
         return -999999;
     }
 }

 public void zhanDui(){//进行计算,并且判断括号是否匹配
     String khao = "";
     int leftkh = 0;
     int rightkh = 0;
     int m = 0;
     //判断括号是否成对
     for (int i = 0; i < str.length(); i++) {
         if (str.charAt(i) == '('){
             khao += '(';
             leftkh++;
         }
         if (str.charAt(i) == ')'){
             khao += ')';
             rightkh++;
         }
     }
     if (leftkh != rightkh){
         jTextField1.setText("输入错误!括号不匹配");
         indexYN = 1;
     }
     if ((leftkh == 0 && rightkh == 0) || ((leftkh == rightkh && leftkh > 0) && khao.charAt(0) == '(' && khao.charAt(khao.length() - 1) == ')')){
         if (indexYN == 0){
             List<String> list1 = zhongZhui(str);
             //System.out.println(list1);
             List<String> list2 = houZhui(list1);
             //System.out.println(list2);
             if (indexYN == 0){
                 if (math(list2) == -999999){
                     jTextField1.setText(jTextField1.getText());
                 } else {
                     jTextField1.setText(String.valueOf(math(list2)));
                     jTextField2.setText(String.valueOf(math(list2)));
                     jTextField2.setText(String.valueOf(math(list2)));
                 }
             }
         }
     } else {
         jTextField1.setText("输入错误!括号不匹配");
         indexYN = 1;
     }
 }

 public static void main(String[] args) {
     
     new JSQ().init();
     //Niumbus风格
     try {
         UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
     } catch (ClassNotFoundException ex) {
         ex.printStackTrace();
     } catch (InstantiationException ex) {
         ex.printStackTrace();
     } catch (IllegalAccessException ex) {
         ex.printStackTrace();
     } catch (UnsupportedLookAndFeelException ex) {
         ex.printStackTrace();
     }
     
    
 }
}

总结

到此这篇关于java实现科学计算器的文章就介绍到这了,更多相关java科学计算器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java实现科学计算器的全过程与代码

本文链接: https://lsjlt.com/news/151565.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java实现科学计算器的全过程与代码
    目录介绍实现思路实现过程和代码1.界面设计2.栈,中缀转后缀3.判断错误4.计算后缀表达式5.事件监听器完整代码总结介绍 本次设计的是一个有33个按钮的科学计算器。可以进行加,减,乘...
    99+
    2024-04-02
  • java如何实现科学计算器
    这篇文章主要介绍了java如何实现科学计算器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java如何实现科学计算器文章都会有所收获,下面我们一起来看看吧。实现思路通过点击按钮可以得到一个算术表达式,并且它是一...
    99+
    2023-07-02
  • Python语言实现科学计算器
    本文实例为大家分享了Python语言实现科学计算器的具体代码,供大家参考,具体内容如下 自学Python语言一个月,还是小白,发一个科学计算器的代码,希望大家批评指正,共勉嘛。 c...
    99+
    2024-04-02
  • Android实现横屏切换科学计算器
    本文实例为大家分享了Android实现横屏切换科学计算器的具体代码,供大家参考,具体内容如下 简单计算器设计,实现以下功能: 1、竖屏时能实现基本的加减乘除运算、回退和清空输入。 2...
    99+
    2024-04-02
  • java实现计算器的代码怎么写
    以下是一个简单的Java代码实现计算器的示例:```javaimport java.util.Scanner;public class Calculator {public static void main(String[] args)...
    99+
    2023-08-11
    java
  • java 简单的计算器程序实例代码
    java 简单的计算器程序实现实例:import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator { public...
    99+
    2023-05-31
    java 计算器 ava
  • 如何使用java代码实现计算器
    这篇“如何使用java代码实现计算器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用java代码实现计算器”文章吧。运...
    99+
    2023-06-30
  • 如何使用Java中的NumPy库实现高效的科学计算?
    如何使用Java中的NumPy库实现高效的科学计算? NumPy是Python中用于科学计算的一个开源库,它提供了高效的数值运算和矩阵操作功能。而Java作为另一个流行的编程语言,也可以使用NumPy库来实现高效的科学计算。在本文中,我们将...
    99+
    2023-08-28
    numy shell 并发
  • NumPy科学计算大全:探索数据的奥秘与魅力
    NumPy是Python中最受欢迎的科学计算库之一。它提供了丰富的功能,包括: 多维数组:NumPy提供了ndarray类来存储和操作多维数组。ndarray可以被认为是Python列表的扩展,但它具有更快的速度和更强大的功能。 矩阵...
    99+
    2024-02-11
    NumPy Python 科学计算 数据分析 数组 矩阵 向量 统计 线性代数 优化 图像处理
  • Android Color颜色过度计算实现代码
    Android Color颜色过度计算实现代码在看自定义TypeEvaluator来计算属性动画的属性值时,用到了对颜色的过度计算,翻看了好多博客,找到了比较有优秀的解决方案,在此记录,以备后用。实现效果图:实现代码:private int...
    99+
    2023-05-31
    android color 颜色
  • Java计算代码段执行时间的详细过程
    目录前言场景代码实现MethodBody 接口定义CalcExecuteTimeResult 运行结果实体ExecuteTemplate 执行模板定义CalcExecuteTimeC...
    99+
    2023-02-07
    Java代码段执行时间 Java代码段运行时间
  • Python NumPy宝典:数据分析与科学计算的利器
    一、NumPy简介: NumPy是Python中用于科学计算和数据分析的强大库,提供了一系列高效且易用的工具,能够轻松处理多维数组并执行各种数学运算。NumPy的基础数据结构是多维数组ndarray,可以存储不同类型的数据,例如数字、字符...
    99+
    2024-02-11
    NumPy Python 数据分析 科学计算 数组操作 数学运算 数据聚合 线性代数 随机数生成
  • android计算器简单实现代码
    本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下 java代码: package com.itheima74.simplecalculat...
    99+
    2022-06-06
    Android
  • Git和Numpy的结合,如何高效地管理科学计算代码?
    随着科学计算的发展,越来越多的研究者开始使用代码来辅助他们的研究工作。代码的使用不仅可以提高工作效率,还可以减少出错的可能性,并且方便进行结果的共享和复现。然而,当代码量变得越来越庞大时,代码管理的问题也随之而来。在这个时候,Git和Nu...
    99+
    2023-10-24
    git 教程 numpy
  • Django+Bootstrap实现计算器的示例代码
    目录准备工作导入Bootstrap前端框架编写前端内容编写视图函数准备工作 创建一个应用 添加应用到配置 创建一个html 编写视图函数 from django.short...
    99+
    2024-04-02
  • Android中怎么实现一个横屏切换科学计算器
    这篇文章给大家介绍Android中怎么实现一个横屏切换科学计算器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简单计算器设计,实现以下功能:竖屏时能实现基本的加减乘除运算、回退和清空输入。2、横屏时变为科学计算器,实现...
    99+
    2023-06-15
  • 如何通过Java编程实现高效的算法计算?
    Java是一种高效的编程语言,它可以帮助我们实现高效的算法计算。在本文中,我们将讨论如何通过Java编程实现高效的算法计算。我们将从算法的基础知识开始,然后介绍Java编程语言的一些核心概念,最后展示一些演示代码。 算法是解决问题的方法。在...
    99+
    2023-09-25
    编程算法 laravel 对象
  • python3.5 + PyQt5 +Eric6 实现的一个计算器代码
    目前可以实现简单的计算。计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少。 python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 计算器...
    99+
    2022-06-04
    计算器 代码
  • java实现计算器模板及源码
    计算器实现了大部分基础功能:基本运算,菜单栏选项,并且拓展了普通型和科学兴选项等等,读者可以在此基础上进行修改和拓展。其他具体实现方法可以看源码,里面有详细的概述,代码框架清晰。 运...
    99+
    2024-04-02
  • Python实现计算AUC的示例代码
    目录为什么这样一个指标可以衡量分类效果auc理解AUC计算方法一方法二实现及验证AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作