文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用Java实现计算器

2023-06-20 17:07

关注

这篇文章主要介绍“怎么用Java实现计算器”,在日常操作中,相信很多人在怎么用Java实现计算器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java实现计算器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文实例为大家分享了Java实现计算器设计的具体代码,供大家参考,具体内容如下

需求分析

设计思路

实现一个Java计算器界面类
2、实现一个Java计算带括号加减乘除表达式的类
3、实现主函数调用

设计实现

Java计算器项目结构:

怎么用Java实现计算器

Calculator类为计算器界面设计、Calculate类为计算带括号加减乘除表达式的类,Main函数为项目程序入口。

Java计算器界面设计实现代码:

package Calculator;import java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JTextField;public class Calculator extends JFrame{   private double result=0; private int count=0;  public Calculator() {  this.setSize(330,399);    this.setTitle("计算器");    init();//  this.pack();  this.setVisible(true);  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   }  public void init() {//初始化界面    this.setLayout(new BorderLayout()); //总体布局为边框式布局        JTextField textField=new JTextField();  textField.disable();  textField.setPreferredSize(new Dimension(this.getWidth(),50));  this.add(textField,BorderLayout.NORTH);         JPanel panel=new JPanel();  panel.setLayout(new BorderLayout());  this.add(panel, BorderLayout.CENTER);    JPanel panelN=new JPanel();  panelN.setLayout(new GridLayout(1,6));  JButton MC=new JButton("MC");  JButton MR=new JButton("MR");  JButton M0=new JButton("M+");  JButton M1=new JButton("M-");  JButton MS=new JButton("MS");  JButton M=new JButton("M");  panelN.add(MC);panelN.add(MR);panelN.add(M0);  panelN.add(M1);panelN.add(MS);panelN.add(M);  panel.add(panelN,BorderLayout.NORTH);    CardLayout cardLayout=new CardLayout();  JPanel panelC=new JPanel();  panelC.setLayout(cardLayout);    JPanel panel0=new JPanel();  panel0.setLayout(new GridLayout(6,4));  JButton[] standredButton=new JButton[24];  String str[]={"%","√","x&sup2;","1/x",    "CE","C","×","/",    "7","8","9","*",    "4","5","6","-",    "1","2","3","+",    "±","0",".","="   };  for(int i=0;i<standredButton.length;i++) {   standredButton[i]=new JButton(str[i]);   String text=standredButton[i].getText();   standredButton[i].addActionListener(new ActionListener() {        @Override    public void actionPerformed(ActionEvent e) {     // TODO Auto-generated method stub     if(text.equals("CE")||text.equals("C")) {      textField.setText("");     }     else if(text.equals("=")) {      String expression=textField.getText();      Calculate cal=new Calculate();      textField.setText(cal.evaluateExpression(expression)+"");     }     else if(text.equals("%")) {           }     else if(text.equals("√")) {      result=Double.parseDouble(textField.getText());      result=Math.sqrt(result);      textField.setText(result+"");     }     else if(text.equals("x&sup2;")) {      result=Double.parseDouble(textField.getText());      result*=result;      textField.setText(result+"");     }     else if(text.equals("1/x")) {      result=Double.parseDouble(textField.getText());      result=1/result;      textField.setText(result+"");     }     else if(text.equals("±")) {      if(count==0) {       textField.setText(textField.getText()+"-");       count=1;      }      else {       textField.setText(textField.getText()+"+");       count=0;      }     }     else if(text.equals("×")) {      textField.setText(textField.getText().substring(0, textField.getText().length()-1));     }     else {      textField.setText(textField.getText()+text);     }             }       }      );   panel0.add(standredButton[i]);  }  panelC.add(panel0);    JPanel panel1=new JPanel();  panel1.setLayout(new GridLayout(7,5));  JButton scienceButton[]=new JButton[35];  String str1[]= {  "x&sup2;","x^y","sin","cos","tan",  "√","10^x","log","Exp","Mod",  "↑","CE","C","×","/",  "π","7","8","9","*",  "n!","4","5","6","-",  "±","1","2","3","+",  "(",")","0",".","="      };  for(int i=0;i<str1.length;i++) {   scienceButton[i]=new JButton(str1[i]);   //scienceButton[i].addActionListener();   panel1.add(scienceButton[i]);  }  panelC.add(panel1);     panel.add(panelC,BorderLayout.CENTER);      JMenuBar menuBar=new JMenuBar();  this.setJMenuBar(menuBar);  JMenu modelMenu=new JMenu("模式");  menuBar.add(modelMenu);  JMenuItem standred=new JMenuItem("标准");    standred.addActionListener(new ActionListener() {   @Override   public void actionPerformed(ActionEvent e) {    // TODO Auto-generated method stub    cardLayout.first(panelC);   }    });  modelMenu.add(standred);  JMenuItem science=new JMenuItem("科学");  science.addActionListener(new ActionListener() {   @Override   public void actionPerformed(ActionEvent e) {    // TODO Auto-generated method stub    cardLayout.last(panelC);   }     });  modelMenu.add(science);   }}

Java计算带括号加减乘除表达式类的实现:

package Calculator;import java.util.*;public class Calculate {    //这个函数的作用就是使用空格分割字符串,以便后面使用分割函数使得将字符串分割成数组    public String insetBlanks(String s) {        String result = "";        for (int i = 0; i < s.length(); i++) {            if (s.charAt(i) == '(' || s.charAt(i) == ')' ||                    s.charAt(i) == '+' || s.charAt(i) == '-'                    || s.charAt(i) == '*' || s.charAt(i) == '/')                result += " " + s.charAt(i) + " ";            else                result += s.charAt(i);        }        return result;    }    public double evaluateExpression(String expression) {        Stack<Double> operandStack = new Stack<>();        Stack<Character> operatorStack = new Stack<>();        expression = insetBlanks(expression);        String[] tokens = expression.split(" ");        for (String token : tokens) {            if (token.length() == 0)   //如果是空格的话就继续循环,什么也不操作                continue;            //如果是加减的话,因为加减的优先级最低,因此这里的只要遇到加减号,无论操作符栈中的是什么运算符都要运算            else if (token.charAt(0) == '+' || token.charAt(0) == '-') {                //当栈不是空的,并且栈中最上面的一个元素是加减乘除的人任意一个                while (!operatorStack.isEmpty()&&(operatorStack.peek() == '-' || operatorStack.peek() == '+' || operatorStack.peek() == '/' || operatorStack.peek() == '*')) {                    processAnOperator(operandStack, operatorStack);   //开始运算                }                operatorStack.push(token.charAt(0));   //运算完之后将当前的运算符入栈            }            //当前运算符是乘除的时候,因为优先级高于加减,因此要判断最上面的是否是乘除,如果是乘除就运算,否则的话直接入栈            else if (token.charAt(0) == '*' || token.charAt(0) == '/') {                while (!operatorStack.isEmpty()&&(operatorStack.peek() == '/' || operatorStack.peek() == '*')) {                    processAnOperator(operandStack, operatorStack);                }                operatorStack.push(token.charAt(0));   //将当前操作符入栈            }            //如果是左括号的话直接入栈,什么也不用操作,trim()函数是用来去除空格的,由于上面的分割操作可能会令操作符带有空格            else if (token.trim().charAt(0) == '(') {                operatorStack.push('(');            }            //如果是右括号的话,清除栈中的运算符直至左括号            else if (token.trim().charAt(0) == ')') {                while (operatorStack.peek() != '(') {                    processAnOperator(operandStack, operatorStack);    //开始运算                }                operatorStack.pop();   //这里的是运算完之后清除左括号            }            //这里如果是数字的话直接如数据的栈            else {                operandStack.push(Double.parseDouble(token));   //将数字字符串转换成数字然后压入栈中            }        }        //最后当栈中不是空的时候继续运算,知道栈中为空即可        while (!operatorStack.isEmpty()) {            processAnOperator(operandStack, operatorStack);        }        return operandStack.pop();    //此时数据栈中的数据就是运算的结果    }    //这个函数的作用就是处理栈中的两个数据,然后将栈中的两个数据运算之后将结果存储在栈中    public void processAnOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {        char op = operatorStack.pop();  //弹出一个操作符        Double op1 = operandStack.pop();  //从存储数据的栈中弹出连个两个数用来和操作符op运算        Double op2 = operandStack.pop();        if (op == '+')  //如果操作符为+就执行加运算            operandStack.push(op1 + op2);        else if (op == '-')            operandStack.push(op2 - op1);   //因为这个是栈的结构,自然是上面的数字是后面的,因此用op2-op1        else if (op == '*')            operandStack.push(op1 * op2);        else if (op == '/')            operandStack.push(op2 / op1);    }}

主函数:

package Calculator;public class Main { public static void main(String[] args) {  // TODO Auto-generated method stub  Calculator calculator=new Calculator(); }}

可以随意缩小放大界面,界面部件会跟随界面大小自适应调整。

其他功能

目前实现了标准型计算,科学型计算更加复杂,实现了界面,没有计算功能,后续可能会继续开发,敬请期待。

到此,关于“怎么用Java实现计算器”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯