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 operandStack= new Stack<>();

    private Stack 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();

    }

    }

Java代码实现计算器加减乘除简易功能的更多相关文章

  1. java代码实现文件的下载功能

    昨天,根据需求文档的要求,自己要做一个关于文件下载的功能,从学校毕业已经很久了,自己好长时间都没有做过这个了,于是自己上网百度,最终开发出来的代码如下: 哦!对了,我先说一下我的思路,首先需要获取服务 ...

  2. java代码---------实现布尔型的功能,是否执行下一步的关键

    总结:灵活 package com.sads; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  3. 干货 | 云智慧透视宝Java代码性能监控实现原理

    这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,做一手好菜的男神老公的大作,曾发表于技术公号,经本人授权转载~~ 一.Java ...

  4. [java代码库]-简易计算器(第二种)

    [java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...

  5. Java计算器的简易实现(+-*/)

    java计算器的简易实现(+-*/) import java.util.Scanner; /* 写一个计算器 实现加减乘除四个功能 并且能够用循环接收新的数据,通过用户交互实现 写四个方法 + - * ...

  6. 200行Java代码搞定计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示 ...

  7. KONGA下的HAMC插件功能 --JAVA代码实现

    设置HAMC插件 postman模拟请发发送:  Java代码: HMAC-SHA-256工具类 1 import java.security.InvalidKeyException; 2 impor ...

  8. java图形界面 计算器实现

    编写程序实现一个简单计算器的基本功能,具体可以模仿Windows附件中的计算器或模拟常见的实物计算器. package beizi; import java.awt.EventQueue; impor ...

  9. 怎样编写高质量的java代码

    代码质量概述     怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍.也请有过代码质量相关经验的朋友 ...

随机推荐

  1. Mysql优化概述及其压力测试工具

    衡量指标 TPS:Transactions Per Second (每秒传输的事物处理个数) ,这是指服务器每秒处理的事物数,支持事物的存储引擎如Innodb等特有的一个性能指标; QPS:Queri ...

  2. pwnable.kr之passcode

    使用ssh passcode@pwnable.kr -p2222登录到远程服务器, ls -l 查看目录下的文件, -r--r----- root passcode_pwn Jun flag -r-x ...

  3. Python算法题:有100只大、中、小骆驼,100框土豆,一只大骆驼可以背3框,中骆驼可以背俩框,小骆驼两只背一筐,问大中小各有多少只骆驼?

    1 for x in range(0,100): 2 for y in range(0,100): 3 for z in range(0, 100): 4 if x*3+y*2+0.5*z == 10 ...

  4. [POJ3253]Fence Repair(单调队列)

    题目链接 http://poj.org/problem?id=3253 题目描述 大意:切长度为a的木条的花费是a,给定最终切好的n段各自的长度,问由原来的一根木条(长度为n段长度和)以最终总花费最小 ...

  5. 我的Python自学之路-001 列表的知识

    #_date_:2020/9/11 '''列表和字典是python中用的最多的数据类型 假如要存储一个班级的人名,需要怎么做?有这么几种方法:1.定义很多个变量: name0 = 'wucaho' n ...

  6. hystrix源码之请求合并

    请求合并 使用HystrixObservableCollapser可以将参数不同,但执行过程相同的调用合并执行.当调用observe.toObservable方法时,会向RequestCollapse ...

  7. 分享一个php的防火墙,拦截SQL注入和xss

    一个基于php的防火墙程序,拦截sql注入和xss攻击等 安装 composer require xielei/waf 使用说明 $waf = new \Xielei\Waf\Waf(); $waf- ...

  8. day56:django:csrf_token&文件上传

    目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...

  9. 种子爆破&[GWCTF 2019]枯燥的抽奖

    伪随机数的爆破,种子爆破 做到了一道题,就是有个伪随机数爆破的漏洞,当时尽管是看到了这两个敏感的函数,但是先去看其他的了,没有看到什么漏洞,所以我当时是准备直接强行爆破,之后看到使用伪随机数爆破的方式 ...

  10. Processing 高效控制管理图形方法(二)

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/70992924