简易计算器(源码)

放假结束,2019正式开工~

 基本实现的简单功能  + - * /

    MC:清除存储的数据                      MR:读取存储的数据
    MS:将所显示的数存入存储器中,存储器中原有的数据被覆盖
    M+:将输入的数加上存储器中的数,所得结果存入存储器
    M-:将存储器中的数减去输入的数,所得结果存入存储器
    CE:在数字输入期间按下此键,将清除输入寄存器中的值并显示"0",可重新输入
    C:清除全部数据结果和运算符

github地址:https://github.com/vanyongqi/Calculator

                                    

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.security.PrivateKey;
import java.util.Vector;
import  java.math.BigDecimal;
/*
    MC:清除存储的数据
    MR:读取存储的数据
    MS:将所显示的数存入存储器中,存储器中原有的数据被覆盖
    M+:将输入的数加上存储器中的数,所得结果存入存储器
    M-:将存储器中的数减去输入的数,所得结果存入存储器
    CE:在数字输入期间按下此键,将清除输入寄存器中的值并显示"0",可重新输入
    C:清除全部数据结果和运算符
*/
public  class Calculator extends JFrame implements ActionListener {
    private final String[] KEYS = {"7", "8", "9", "/", "sqrt",//创建数组,用于存储操作按键
            "4", "5", "6", "*", "%",
            "1", "2", "3", "-", "1/x",
            "0", "+/-", ".", "+", "="};
    private final String[] COMMAND = {" 回退", "CE", "C"};//创建数组用于存储功能按键
    // CE:在数字输入期间按下此键,将清除输入寄存器中的值并显示"0",可重新输入 C:清除全部数据结果和运算符

    private final String[] M = {"功能键", "MC", "MR", "MS", "M+"};//创建数组 存储M类型的操作按键
    /*MC:清除存储的数据
    MR:读取存储的数据
    MS:将所显示的数存入存储器中,存储器中原有的数据被覆盖
    M+:将输入的数加上存储器中的数,所得结果存入存储器
    M-:将存储器中的数减去输入的数,所得结果存入存储器*/

    //创建三个JButton数组用于存储上述String数组的各个功能
    private JButton keys[] = new JButton[KEYS.length];
    private JButton commands[] = new JButton[COMMAND.length];
    private JButton m[] = new JButton[M.length];
    private JTextField resultText = new JTextField("0");

    private boolean firstDigit = true;
    private double resultNum = 0.0;
    private String operator = "=";
    private boolean operatorValidFlag = true;

    public Calculator() {
        super();
        init();
        //设置计算器背景颜色
        this.setBackground(Color.LIGHT_GRAY);
        //设置计算器标题
        this.setTitle("MR:FAN's Calculator");
        //设置计算器的左上角坐标
        this.setLocation(500, 300);
        //禁止修改计算器窗口尺寸
        this.setResizable(false);
        //使计算器自动调整组件大小
        this.pack();
    }

    private void init() {
        //将JtextField的内容设置为右对齐
        resultText.setHorizontalAlignment(JTextField.RIGHT);
        //将文本框的背景设置为白色
        resultText.setBackground(Color.white);

/************将String数组的内容添加到JButton数组中*************/

        //按钮panel
        JPanel calckeyPanel1 = new JPanel();
        calckeyPanel1.setLayout(new GridLayout(4, 5, 3, 3));
        for (int i = 0; i < KEYS.length; i++) {
            keys[i] = new JButton(KEYS[i]);
            calckeyPanel1.add(keys[i]);
            keys[i].setForeground(Color.black);
        }

        //命令panel
        JPanel commandsPanel = new JPanel();
        commandsPanel.setLayout(new GridLayout(1, 3, 3, 3));
        for (int i = 0; i < COMMAND.length; i++) {
            commands[i] = new JButton(COMMAND[i]);
            commandsPanel.add(commands[i]);
            commands[i].setForeground(Color.green);
        }

        //计算panel
        JPanel calmsPanel = new JPanel();
        calmsPanel.setLayout(new GridLayout(5, 1, 3, 3));
        for (int i = 0; i < M.length; i++) {
            m[i] = new JButton(M[i]);
            calmsPanel.add(m[i]);
            m[i].setForeground(Color.cyan);
        }

        /****************************************************************************/

        //创建一个新的panel将按钮和命令panel按照格式置放
        JPanel panel1 = new JPanel();
        panel1.setLayout(new BorderLayout(3, 3));
        panel1.add("North", commandsPanel);
        panel1.add("Center", calckeyPanel1);
        //创建一个新的panel将点击的数字输入到该panel中
        JPanel top = new JPanel();
        top.setLayout(new BorderLayout());
        top.add("Center", resultText);

        //将三个JPanel 添加到当前的面板
        getContentPane().setLayout(new BorderLayout(3, 5));
        getContentPane().add("North", top);
        getContentPane().add("Center", panel1);
        getContentPane().add("West", calmsPanel);

        //所有JButton添加监听
        for (int i = 0; i < KEYS.length; i++)
            keys[i].addActionListener(this);
        for (int i = 0; i < COMMAND.length; i++)
            commands[i].addActionListener(this);
        for (int i = 0; i < M.length; i++)
            m[i].addActionListener(this);
    }
        //实现监听接口
    public void actionPerformed(ActionEvent e) {

        String label = e.getActionCommand();
        if(label.equals(COMMAND[0])){
            Backspace();
        }
        else if(label.equals(COMMAND[1])){
            resultText.setText("0");
        }
        else if(label.equals(COMMAND[2]))
           C();
        else if("0123456789.".indexOf(label)>=0)
            Number(label);
        else { handleOperator(label);
        }
    }
//处理回退功能 将字符串利用subString截取
    public void Backspace(){
        String text = resultText.getText();
        int i = text.length();
        if(i > 0){
            text = text.substring(0,i-1);
            if(text.length() == 0){
                resultText.setText("0");
                firstDigit = true;
                operator = "=";
            }
            else{
                resultText.setText(text);
            }
        }
    }
// 处理数字  先判断是不是首数字 再判断是否为小鼠
    public void Number(String key){
        if(firstDigit){
            resultText.setText(key);
        }else if ((key.equals("."))&&(resultText.getText().indexOf(".")< 0 )){
            resultText.setText(resultText.getText()+".");
        }else if (!key.equals(".")){
            resultText.setText(resultText.getText()+key);
        }
        firstDigit = false;
    }
//初始化
    public void C(){
        resultText.setText("0");
        firstDigit = true;
        operator = "=";
    }
//处理操作运算符 ”/“ 和”1/x“需考虑 0为除数
    private void handleOperator(String key){
        if(operator.equals("/")) {
            if (getNumberFromText() == 0.0) {
                operatorValidFlag = false;
                resultText.setText("除数不为0");
            } else {
                resultNum /= getNumberFromText();
            }
        }
        else if (operator.equals("1/x")){
            if(resultNum == 0.0) {
                operatorValidFlag = false;
                resultText.setText(" 0 没有倒数");
            }
            else{
              resultNum = 1 /  resultNum;
            }
        }
        else if (operator.equals("+")){ resultNum += getNumberFromText(); }
        else if (operator.equals("-")){ resultNum -= getNumberFromText(); }
        else if (operator.equals("*")){ resultNum *= getNumberFromText(); }
        else if (operator.equals("sqrt")){resultNum = Math.sqrt(resultNum);}
        else if (operator.equals("%")){ resultNum /=100;}
        else if (operator.equals("+/-")){resultNum = resultNum*(-1);}
        else if (operator.equals("=")){resultNum =getNumberFromText();}
        if(operatorValidFlag){
             long t1;
             double t2;
             t1 = (long)resultNum;
             t2 = resultNum - t1;
             if(t2 == 0)
                 resultText.setText(String.valueOf(t1));
             else
                 resultText.setText(String.valueOf(resultNum));
        }
        operator = key;
        firstDigit = true;
        operatorValidFlag = true;

    }
    public  double getNumberFromText(){
        double result = 0;
        try{ result  = Double.valueOf(resultText.getText()).doubleValue();}
        catch(NumberFormatException E){E.printStackTrace();}
        return result;
    }

    public static void main(String args[]) {
        Calculator calculator1 = new Calculator();
        calculator1.setVisible(true);
        calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

 

全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
笑着秋招😊:我一直认为努力有回报是一件很幸福很幸福的事情,恭喜你
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务