zoukankan      html  css  js  c++  java
  • Java代码实现计算器加减乘除简易功能

    package test;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.util.HashMap;
    import java.util.Stack;
     
    /**
     * Created by zxx on 2020/10/15.
     */
    public class Calculator extends JFrame{
     
        private Stack<Double> operandStack= new Stack<>();
        private Stack<String> operatorStack = new Stack<>();
     
        private Calculator(){
     
            setTitle("计算器");
            setSize(266,340);
            //setSize(400,540);
            Container c=getContentPane();
            c.setLayout(null);
     
     
            JTextArea jt=new JTextArea(100,100);
            jt.setFont(new Font("Aria",Font.BOLD,32));
            jt.setLineWrap(true);
            JScrollPane sp=new JScrollPane(jt);
            jt.setCaretPosition(jt.getDocument().getLength());
            sp.setBounds(0,0,250,100);
            c.add(sp);
     
            JPanel p=new JPanel();
            p.setLayout(new GridLayout(5,4,0,0));
     
            p.setBounds(0,100,250,200);
            String[] num={"(",")","AC","/","7","8","9","*","4","5","6","-","1","2","3","+","0",".","DEL","="};
            JButton[] jb=new JButton[20];
            for(int i=0;i<20;i ++ ){
                jb[i]=new JButton(num[i]);
                p.add(jb[i]);
            }
            c.add(p);
     
            for(int i=0;i<18;i  ++){
                if(i!=2){
                    final int j=i;
                    jb[i].addActionListener(e-> jt.append(num[j]));
                }
            }
     
            jb[2].addActionListener(e->{
                jt.setText("");
                operandStack.clear();
                operatorStack.clear();
            });
            jb[18].addActionListener(e->{
                try{
                    jt.setText(jt.getText().substring(0,jt.getText().length()-1));
                }catch(Exception ignored) { }//忽略这个异常   IDEA就是好用!!!
            });
            jb[19].addActionListener(e->{
                try{
                    double x= calculate(jt.getText()+ "#");
                    jt.setText("");
                    jt.append(String.valueOf(x));
                }catch(Exception ex){
                    if(ex.getMessage()==null)
                        jt.setText("ERROR!");
                    else
                        jt.setText(ex.getMessage());
                }
            });
            //禁止文本域的enter换行
            KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
            jt.getInputMap().put(enter, "none");
     
            this.getRootPane().setDefaultButton(jb[19]);
           
            c.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) 
                {
                	
                } 
                public void keyPressed(KeyEvent e)			//键盘按键监听
                {
                	char label=e.getKeyChar();
                	String k=String.valueOf(label);
                	if(label==KeyEvent.VK_ENTER)
                	{
                		calculate();
                	}
                	else if(label==KeyEvent.VK_BACK_SPACE) 
                	{
                		String s = jt.getText();
                		if(s!=null) 
                		{
                			calculate();				//调用定义的处理←方法
                		}else 
                		{
                			jt.setText(s);
                		}			
                	}
                	else
                	{
                		calculate(k);					//按下数字和运算符号的叠加
                	}
                }	
                public void keyReleased(KeyEvent e) 
                {
                	
                }
    
            });
          
     
            setVisible(true);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            
            
            
        }
        
        private void calculate(){
            String b = operatorStack.pop();
            double c = operandStack.pop();
            double d = operandStack.pop();
            double e;
            if (b.equals("+")) {
                e = d  + c;
                operandStack.push(e);
            }
            if (b.equals("-")) {
                e = d - c;
                operandStack.push(e);
            }
            if (b.equals("*")) {
                e = d * c;
                operandStack.push(e);
            }
            if (b.equals("/")) {
                if(c==0)
                    throw new ArithmeticException("DivideByZero!");//不可修改为Exception
                // Exception的异常是必须处理的,是受控异常;而ArithmeticException 不是必须处理的 ,受控异常必须强制处理
                e = d / c;
                operandStack.push(e);
            }
        }
     
        private Double calculate(String text){
            HashMap<String,Integer> precede=new HashMap<>();
            precede.put("(",0);
            precede.put(")",0);
            precede.put("/",2);
            precede.put("*",2);
            precede.put("-",1);
            precede.put("+",1);
            precede.put("#",0);
     
            operatorStack.push("#");
     
            int flag=0;
            for(int i=0;i<text.length();i++  ){
                String a=String.valueOf(text.charAt(i));
                if(!a.matches("[0-9.]")){
                    if(flag!=i)
                        operandStack.push(Double.parseDouble(text.substring(flag,i)));
                    flag=i+ 1;
                    while(!(a.equals("#")&&operatorStack.peek().equals("#"))){
                        if(precede.get(a)>precede.get(operatorStack.peek())||a.equals("(")){
                            operatorStack.push(a);
                            break;
                        }else {
                            if(a.equals(")")) {
                                while(!operatorStack.peek().equals("("))
                                    calculate();
                                operatorStack.pop();
                                break;
                            }
                            calculate();
                        }
                    }
     
                }
            }
     
            return(operandStack.pop());
        }
     
     
        public static void main(String[] args){
            new Calculator();
        }
    }
    
  • 相关阅读:
    数据库设计的几个建议
    CAS单点登录和spring securtiy集成
    冒烟测试
    匠人精神
    iOS UIButton 设置图片文字垂直排列
    PHP字符串处理函数
    php 数组的常用函数
    Linux中常用操作命令
    yii2.0高级框架配置时打开init.bat秒退的解决方法 (两种方法)
    前端优化网站性能的14条规则
  • 原文地址:https://www.cnblogs.com/1112zx/p/13818714.html
Copyright © 2011-2022 走看看