标题:小程序-计算器的实现,与比较
取消只看楼主
crf1205
Rank: 2
等 级:论坛游民
威 望:1
帖 子:11
专家分:15
注 册:2016-11-28
结帖率:0
 问题点数:0 回复次数:0 
小程序-计算器的实现,与比较
程序代码:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Calculator {

    public static void main(String[] args) {
        new MyFrame();
    }
}

class MyFrame extends JFrame{    
    private JTextArea txt = new  JTextArea(2,21);
    private String title = "陈瑞丰的计算器";
    private ArrayList<String> numbs = new ArrayList<>(10);
    private String numbers ="1234567890.";
    private String operators ="-+*/";
    
    public MyFrame(){
        setSize(250,220);
        setTitle(this.title);//固定其标题为“陈瑞丰的计算器”;
        setResizable(false);//不可修改窗体大小;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口的关闭按钮的功能;
        txt.setEditable(false);
        numbs.add("0");//防止出现空指针,另外,在进行计算时,如果首先输入运算符,则默认第一个数字为0;
        /*以下为lambda表达式的方式创建的内部类的实现,是实现的ActionListener接口*/
        ActionListener actionListener2 =(ActionEvent e)->{     // "+-*/" 的动作监听器;
            String label = ((JButton) e.getSource()).getText();//获得当前按钮上的信息;
            txt.setText(myString(numbs)+label);
            numbs.add(label);
        };
        
        ActionListener actionListener =(ActionEvent e)->{      //数字键的动作监听器;
            String ele = numbs.get(numbs.size()-1);            //获得当前存储的集合的最后一个元素;
            String label = ((JButton) e.getSource()).getText();//获得当前按钮上的信息;
            txt.setText(myString(numbs)+label);
            if(operators.contains(ele))
                numbs.add(label);
            else
                numbs.set(numbs.size()-1,ele+label);    //System.out.println(numbs); //观察数组是否正确传入到数组中去了;
            };
            
        /* 使用for循环简并代码以后出现了不可预期的输出结果,将setVisible和setLayout的位置放置到代码的后段,问题得以改善;
         * 以下代码为创建20个操作按钮,并添加它们的动作监听器;添加组件的顺序会直接影响到组件在框架中的排布,这需要注意*/
        ArrayList<JButton> btns = new ArrayList<>(20);
        add(txt);
        String[] labels = new String[]{"7","8","9","/","√","4","5","6","*","<-","1","2","3","-","CE","0",".","sin","+","="};
           for(int i=0;i<20;i++)    {
               btns.add(new JButton(labels[i])); 
               JButton ele =btns.get(i);
               add(ele);
               if(numbers.contains(labels[i])) 
                   ele.addActionListener(actionListener);
               else if(operators.contains(labels[i]))
                   ele.addActionListener(actionListener2);     }
        //设置√的动作监听器;   
        btns.get(4).addActionListener((ActionEvent e)->{ 
                String ele = numbs.get(numbs.size()-1);            //获得当前存储的集合的最后一个元素;
                Double num = 0.0;
                if(operators.contains(ele))        numbs.add(""+num);
                else {        num=Math.sqrt(Double.parseDouble(ele));
                            numbs.set(numbs.size()-1,""+num);        }
                txt.setText(myString(numbs)+"\n"+"√("+ele+")="+num);     });
        //设置<-的动作监听器;
        btns.get(9).addActionListener((ActionEvent e)->{ 
            numbs.remove(numbs.size()-1);
            txt.setText(myString(numbs));    });
        //设置CE的动作监听器;
        btns.get(14).addActionListener((ActionEvent e)->{ 
            numbs.removeAll(numbs);
            numbs.add("0");
            txt.setText(myString(numbs));
        });
        //设置sin的动作监听器;
        btns.get(17).addActionListener((ActionEvent e)->{ 
            String ele = numbs.get(numbs.size()-1);            //获得当前存储的集合的最后一个元素;
            Double num = 0.0;                                   //如果在一个运算符号后输入sin或者√,则默认计算0;
            if(operators.contains(ele))        numbs.add(""+num);
            else {        num=Math.sin(Double.parseDouble(ele));
                        numbs.set(numbs.size()-1,""+num);        }
            txt.setText(myString(numbs)+"\n"+"sin("+ele+")="+num);     });
        //设置=的动作监听器;
        btns.get(19).addActionListener((ActionEvent e)->{ 
            ArrayList<String> numbs2=numbs;                    //创建一个新的数组,作为原数组的拷贝;
            String ele = numbs2.get(numbs2.size()-1);
            Double num = 0.0;
            if(operators.contains(ele))
                numbs2.add(""+num);  
            while(numbs2.contains("*")||numbs2.contains("/")){
            for(int i=0;i<numbs2.size();i++){
                if("/".equals(numbs2.get(i))){
                    numbs2.set(i,(Double.parseDouble(numbs2.get(i-1))/Double.parseDouble(numbs2.get(i+1)))+"");
                    numbs2.remove(i+1);numbs2.remove(i-1);//注意,这里要先删除i+1,再删除i-1,否则必定出错;
                }
                if("*".equals(numbs2.get(i))){
                    numbs2.set(i,(Double.parseDouble(numbs2.get(i-1))*Double.parseDouble(numbs2.get(i+1)))+"");
                    numbs2.remove(i+1);numbs2.remove(i-1);//注意,这里要先删除i+1,再删除i-1,否则必定出错;
                }
            }}
            for(int i=0;i<numbs2.size();i++){
                if("-".equals(numbs2.get(i))){
                    double the =-Double.parseDouble(numbs2.get(i+1));
                    numbs2.set(i+1,the+"");
                    numbs2.remove(i);
                }
            }
            double result=0;
            for(int i=0;i<numbs2.size();i++){
                if(!operators.contains(numbs2.get(i))){
                    result=result+Double.parseDouble(numbs2.get(i));
                }
            }
            txt.setText(myString(numbs)+"\n"+"result="+result); 
            numbs.removeAll(numbs);
            numbs.add(result+"");
        });
           
        setLayout(new FlowLayout(FlowLayout.CENTER));//设置按钮的布局为与开始边对齐;
        setVisible(true);
    }
    private String myString(ArrayList<String> lst){ //用以显示在txt上的数组;
        String rt = "";
        for(String ele:lst)        rt=rt+ele;
        return rt;        }
}

这个本来是借鉴网上https://www. ;不过写的很不一样,大家可以比较一下,至于算法我写的很粗糙,欢迎各位提出更优化的算法,谢谢!!
搜索更多相关主题的帖子: 计算器 
2017-02-08 00:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474062-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.694717 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved