Java仿windows自带的计算器-课程设计

一段尘封已久的代码,当年的课程设计。《java程序设计》课程设计报告
课题名称:GUI计算器设计
1. 课程设计题目
   基于GUI的计算器设计
2. 课程设计目的
1. 巩固和加深课堂所学知识;
2. 将课本上的理论知识和实际应用有机的结合起来,培养同学们分析和解决实际问题的能力;
3. 通过对java语言程序代码的阅读、修改、设计,理解和掌握复杂的java语言应用程序的编程,提高实践编程能力。
3. 程序运行环境及开发工具
    本程序在Windows XP的PC机上利用Jbuilder9.0的软件开发实现,在Windows XP平台上Jbuilder9.0及Eclipse环境中运行通过。
4. 程序功能使用说明
运行该程序后,参与运算的操作数可有鼠标点击相应按钮输入,也可有键盘输入,但操作符应有鼠标点击相应的按钮,当:
1.在简易计算中可以按照常规输入计算,基本无bug,“%”未设置其用途;
2.简易计算中,可以进行+、-、*、/、乘方(^)、开方(√)及阶乘(!)运算;
3.科学计算中有许多功能为实现,主要能进行加、减、乘、除、乘方、开方、幂、开n次方、倒数、阶乘、ln、e的x次幂、三角函数等高级运算;
4.例如:
(1).         1     +     9     =     10
(2).         25   +     -8    =     17
(3).         98   -      35   =     63
(4).         96   *     2     =     192
(5).         96   /      4     =     24
(6).         4     ^     3     =     64
(7).         100 √          =     10
(8).         -9    √          =     不能执行此操作!!
(9).         20   !             =     2432902008176640000
(10).       -20  !             =     不能执行此操作!!
(11).       0     !             =     1
(12).       8     ln           =     2.0794415416798357
(13).       2     Exp        =     7.38905609893065
(14).       8     x^y 3     =     512
(15).       20   x^2        =     400
(16).       100  n!     =  93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
(17).       30  sin  =  0.49999999999999994(0.5)   (求sin30度)
其他(cos,tan)依次类推;
(18).1/x计算有bug;
(19).       3     x√ 8     =     2     (求8开3次方);
(20).       95   Mod      10   =     5     (95对10求余)
5. 关键算法与技术:
       1.大数阶乘;
       2.界面切换;
       3.GirdLayout布局管理器的使用;
       4.事件响应;
       5.匿名内部类的使用;
       6.
6. 设计思路:
     本程序采用模块化设计,调试方便,程序的可读性好。在老师的指导下,由主程序启动简易计算器,根据使用者的需要可以在简易计算器中进行运算操作,若不能满 足用户功能,可以选择使用科学计算器,具体操作与目前市面上的计算器差不多,用户还可以选择使用说明进行查看具体操作。由于时间及个人水平的问题,科学计 算中还有很多功能未实现。
具体思路:用户输入(点击)某一数字或操作符,程序将自行判断是操作数还是操作符,
1.      若为一操作数的首次输入,则将显示区的“0”替换,若该操作数不为首次输入则将显示区的数字串接上此次输入的数字;
2.      若为操作符,将判断是否为带符号操作数,若是则保存符号,反之为纯操作符:若为二元操作符就将显示区的字符串转化为双精度数;若为等号就进行计算结果并显示结果;若为一目操作符就进行相应的一目运算并显示结果;
3.      进行相应的初始化操作,为下一次输入做准备;
4.      根据自己的理解画了下面的简单的流程图。

7.编码实现:
//package 计算器;
001package org.csmn.app;
002 
003import java.awt.*;
004import java.awt.event.*;
005import javax.swing.*;
006import java.io.*;
007import java.math.*;
008import java.util.*;
009 
010/**
011 * <p>Title: 用户应用界面计算器</p>
012 * <p>Description: 包含简易计算与功能更加强大的科学计算</p>
013 * <p>Copyright: Copyright (c) 2008</p>
014 * <p>Company: </p>
015 * <a href="http://my.oschina.net/arthor" target="_blank" rel="nofollow">@author</a>  车水码农
016 * @version 1.0
017 */
018public class Calculat {
019    static JTextField show;//设置输入区,显示区
020    static double opNum = 0;//存放操作数
021    static String opChar = "=";//存放操作符
022    static boolean flag = true;//设置标志
023 
024    public static void main(String[] args) {
025        new EasyFrame();//产生首界面——简易计算器
026    }
027}
028 
029class EasyFrame { //构建简易计算器框架界面
030    static JFrame frame;
031 
032    public EasyFrame() {
033        frame = new JFrame("简易计算器");
034        Toolkit kit = Toolkit.getDefaultToolkit();//设置图标
035        //下面这条语句不好,不具有可移植性
036        Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
037        frame.setIconImage(image);
038        frame.addWindowListener(new WindowAdapter() {//响应关闭事件
039            public void windowClosing(WindowEvent e) {
040                System.exit(0);
041            }
042        });
043        JMenuBar mb = new JMenuBar();//创建菜单栏
044        JMenu m1 = new JMenu("编辑");//创建菜单
045        JMenu m2 = new JMenu("操作");
046        JMenu m3 = new JMenu("帮助");
047        JMenuItem mi1c = new JMenuItem("复制", KeyEvent.VK_C);//创建菜单项
048        JMenuItem mi1v = new JMenuItem("粘贴", KeyEvent.VK_V);
049        JMenuItem mi21 = new JMenuItem("基本计算");
050        JMenuItem mi22 = new JMenuItem("科学计算");
051        JMenuItem mi31 = new JMenuItem("使用说明");
052        JMenuItem mi32 = new JMenuItem("About...");
053        frame.setJMenuBar(mb);//添加菜单到窗口
054        mb.add(m1);
055        mb.add(m2);
056        mb.add(m3);
057        m1.add(mi1c);
058        m1.add(mi1v);
059        m2.add(mi21);
060        m2.add(mi22);
061        m3.add(mi31);
062        m3.add(mi32);
063        /*菜单项监听事件 */
064        mi1c.addActionListener(new MenuItemListener());//监听复制
065        mi1v.addActionListener(new MenuItemListener());//监听粘贴
066        mi22.addActionListener(new MenuItemListener());
067        mi31.addActionListener(new MenuItemListener());
068        mi32.addActionListener(new MenuItemListener());
069        Container cp = frame.getContentPane();//获取内容窗格
070        cp.add(new easyCalPanel());//将简易计算器面板加入到框架中
071        frame.setSize(280, 250);
072        //frame.pack();//将框架设置合适的大小
073        frame.setVisible(true);//设置框架可见
074    }
075}
076 
077class AdvanceFrame { //构建高级计算器框架界面
078    static JFrame frame;
079 
080    public AdvanceFrame() {
081        frame = new JFrame("科学计算器");
082        Toolkit kit = Toolkit.getDefaultToolkit();//设置图标
083        Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
084        frame.setIconImage(image);
085        JMenuBar mb = new JMenuBar();//创建菜单栏
086        JMenu m1 = new JMenu("编辑");
087        JMenu m2 = new JMenu("操作");
088        JMenu m3 = new JMenu("帮助");
089        JMenuItem mi1c = new JMenuItem("复制", KeyEvent.VK_C);
090        JMenuItem mi1v = new JMenuItem("粘贴", KeyEvent.VK_V);
091        JMenuItem mi21 = new JMenuItem("基本计算");
092        JMenuItem mi22 = new JMenuItem("科学计算");
093        JMenuItem mi31 = new JMenuItem("使用说明");
094        JMenuItem mi32 = new JMenuItem("About...");
095        frame.setJMenuBar(mb);//添加菜单栏
096        mb.add(m1);
097        mb.add(m2);
098        mb.add(m3);//添加菜单
099        m1.add(mi1c);
100        m1.add(mi1v);
101        m2.add(mi21);
102        m2.add(mi22);
103        m3.add(mi31);
104        m3.add(mi32);
105        mi1c.addActionListener(new MenuItemListener());//监听复制
106        mi1v.addActionListener(new MenuItemListener());//监听粘贴
107        mi21.addActionListener(new MenuItemListener());//监听简易计算
108        mi31.addActionListener(new MenuItemListener());//监听使用说明
109        mi32.addActionListener(new MenuItemListener());//监听关于
110        Container cp = frame.getContentPane();//获取框架的内容窗格
111        cp.add(new AdvanceCalPanel());//添加高级计算面板
112        frame.pack();//设置适当的大小
113        frame.setVisible(true);//可见
114        frame.addWindowListener(new WindowAdapter() {//响应关闭按钮
115            public void windowClosing(WindowEvent e) {
116                System.exit(0);
117            }
118        });
119    }
120}
121 
122class MenuItemListener implements ActionListener {//响应菜单事件
123    public void actionPerformed(ActionEvent e) {
124        if ("基本计算".equals(e.getActionCommand())) {
125            new EasyFrame();//切换到简易计算器窗口
126            AdvanceFrame.frame.setVisible(false);
127        } else if ("科学计算".equals(e.getActionCommand())) {
128            new AdvanceFrame();//切换到高级计算界面
129            EasyFrame.frame.setVisible(false);
130        } else if ("复制".equals(e.getActionCommand())) {
131            //
132        } else if ("粘贴".equals(e.getActionCommand())) {
133            //
134        } else if ("使用说明".equals(e.getActionCommand())) {
135            try {
136                FileInputStream fis = new FileInputStream("使用说明.txt");
137                InputStreamReader isr = new InputStreamReader(fis);
138                BufferedReader br = new BufferedReader(isr);
139                JTextArea helpArea = new JTextArea(15, 48);
140                //helpArea.enable(false);
141                helpArea.setEditable(false);
142                helpArea.setDisabledTextColor(Color.black);
143                JScrollPane scroll = new JScrollPane(helpArea);
144                String s;
145                while ((s = br.readLine()) != null) {
146                    helpArea.append(s);
147                    helpArea.append("\n");
148                }
149                JOptionPane.showMessageDialog(null, scroll, "帮助主题", JOptionPane.PLAIN_MESSAGE);
150                br.close();
151            } catch (IOException ex) {
152                ex.printStackTrace();
153            }
154            //System.exit(0);   //如果加上此句,当关掉JOptionPane时就会关掉JFrame;
155        } else if (e.getActionCommand().equals("About...")) {
156            JTextArea aboutArea = new JTextArea();
157            aboutArea.setText("版权拥有者:车水码农\n开发时间:2008-12-16\n");
158            JOptionPane.showMessageDialog(null, aboutArea, "关于 计算器", JOptionPane.PLAIN_MESSAGE);
159        }
160    }
161}
162 
163class AdvanceCalPanel extends JPanel { //创建高级计算面板
164    private static final long serialVersionUID = 2696716054985506500L;
165 
166    public AdvanceCalPanel() {
167        setLayout(new BorderLayout());//设置布局方式
168        Calculat.show = new JTextField("0", 27);//显示文本区
169        Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 16));//设置字体
170        Calculat.show.setHorizontalAlignment(JTextField.RIGHT);//设置光标位置
171        JPanel ps = new JPanel();//创建面板加载显示区文本框
172        ps.add(Calculat.show);
173        JPanel pbl = new JPanel();//创建面板加载按钮
174        pbl.setLayout(new GridLayout(10, 5, 1, 1));//设置按钮面板的布局
175        pbl.setBorder(BorderFactory.createEtchedBorder());//设置边框
176        //pbr.setLayout(new GridLayout(5,6,1,2));
177        //pbr.setBorder(BorderFactory.createEtchedBorder());
178        String[] larr = { //按钮
179        "Sta", "F-E", "(", ")", "MC", "clr", "Avg", "dms", "Exp", "ln", "MR",
180                "Dec", "Sum", "sin", "x^y", "log", "MS", "Bin", "E(x)", "cos",
181                "x^2", "n!", "M+", "Oct", "D(x)", "tan", "x√", "1/x", "PI",
182                "Hex", "D", "E", "F", "/", "Mod", "And", "A", "B", "C", "*",
183                "Or", "Xor", "7", "8", "9", "-", "Lsh", "Not", "4", "5", "6",
184                "+", "Int", "shift", "1", "2", "3", ".", "0", "=" };
185        for (int i = 0; i < larr.length; i++) {
186            addButton(pbl, larr[i]);//创建按钮
187        }
188        setBorder(BorderFactory.createEtchedBorder());//设置边框
189        add(pbl, BorderLayout.CENTER);//分别添加两面板到框架中
190        add(ps, BorderLayout.NORTH);
191    }
192 
193    private void addButton(Container c, String s) { //创建按钮,加入到面板并监听按钮事件
194        JButton bt = new JButton(s);
195        c.add(bt);
196        bt.addActionListener(new buttonListener());
197    }
198}
199 
200class easyCalPanel extends JPanel {//操作基本等同于创建高级计算面板
201    private static final long serialVersionUID = 3224376138339105930L;
202 
203    public easyCalPanel() {
204        setLayout(new BorderLayout());
205        Calculat.show = new JTextField("0", 17);
206        Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 18));
207        Calculat.show.setHorizontalAlignment(JTextField.RIGHT);
208        JPanel ps = new JPanel();
209        ps.add(Calculat.show);
210        JPanel pb = new JPanel();
211        pb.setLayout(new GridLayout(5, 4, 1, 1));
212        pb.setBorder(BorderFactory.createEtchedBorder());
213        String bts = "%^√!789/456*123-0.=+";
214        for (int i = 0; i < bts.length(); i++) {
215            addButton(pb, bts.substring(i, i + 1));
216        }
217        add(pb, BorderLayout.CENTER);
218        add(ps, BorderLayout.NORTH);
219    }
220 
221    private void addButton(Container c, String s) {
222        JButton bt = new JButton(s);
223        bt.setFont(new Font("Dialog", Font.PLAIN, 18));//设置字体
224        c.add(bt);
225        bt.addActionListener(new buttonListener());
226    }
227}
228 
229class buttonListener implements ActionListener {//响应按钮事件
230 
231    public void actionPerformed(ActionEvent e) {
232        String s = e.getActionCommand();//获取命令
233        if ('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) {//该命令为正操作数
234            if (Calculat.flag) { //若初次输入该操作数(如:输入“123”中的“1”)
235                Calculat.show.setText(s);
236            } else {
237                //(如:输入“123”中的"2"或"3")
238                Calculat.show.setText(Calculat.show.getText() + s);
239            }
240            Calculat.flag = false;//修改标志
241        } else {//命令为操作数为负数或操作符
242            if (Calculat.flag) {//初次输入
243                if (s.equals("-")) {//为负数
244                    Calculat.show.setText(s);
245                    Calculat.flag = false;
246                } else {//连续输入几个操作符
247                    Calculat.opChar = s; ///
248                }
249            } else {//为操作符
250                calculate cal = new calculate();//创建计算类实例
251                double x = Double.parseDouble(Calculat.show.getText());//将输入的操作数转换为double型
252                cal.calopr1(x);//双目运算及处理单目运算的操作数
253                Calculat.opChar = s;//保存运算符
254                if (Calculat.opChar.equals("!") || Calculat.opChar.equals("√")//操作数必须为正的单目运算
255                        || Calculat.opChar.equals("n!")) {
256                    if (Calculat.opNum < 0) {
257                        Calculat.show.setText("不能执行此操作!!");
258                    } else {
259                        cal.calopr2((int) Calculat.opNum, Calculat.opChar);//单目运算
260                    }
261                    Calculat.opChar = "=";//保存符号为下一次运算做准备
262                } else if (Calculat.opChar.equals("1/x")
263                        || Calculat.opChar.equals("x^2")
264                        || Calculat.opChar.equals("ln")
265                        || Calculat.opChar.equals("log")
266                        || Calculat.opChar.equals("sin")
267                        || Calculat.opChar.equals("cos")
268                        || Calculat.opChar.equals("tan")
269                        || Calculat.opChar.equals("Exp")) {//普通单目运算
270                    cal.calopr2((int) Calculat.opNum, Calculat.opChar);//单目运算
271                    Calculat.opChar = "=";//保存符号为下一次运算做准备
272                }
273                Calculat.flag = true;//设置标志为下一次运算做准备
274            }
275        }
276    }
277}
278 
279class calculate {//计算处理
280    public void calopr1(double n) {//处理双目运算及单目运算的操作数
281        String str = "";
282        if (Calculat.opChar.equals("+")) {
283            Calculat.opNum += n;
284        } else if (Calculat.opChar.equals("-")) {
285            Calculat.opNum -= n;
286        } else if (Calculat.opChar.equals("*")) {
287            Calculat.opNum *= n;
288        } else if (Calculat.opChar.equals("/")) {
289            if (n == 0) {
290                str = "除数为0!!!";
291            } else {
292                Calculat.opNum /= n;
293            }
294        } else if (Calculat.opChar.equals("^") || Calculat.opChar.equals("x^y")) {
295            Calculat.opNum = Math.pow(Calculat.opNum, n);
296        } else if (Calculat.opChar.equals("x√")) {
297            Calculat.opNum = Math.pow(n, 1 / Calculat.opNum);
298        } else if (Calculat.opChar.equals("=")) {
299            Calculat.opNum = n;
300        } else if (Calculat.opChar.equals("Mod")) {
301            Calculat.opNum = Math.abs(Math.IEEEremainder(Calculat.opNum, n));
302        }
303        Calculat.show.setText(str + Calculat.opNum);
304    }
305 
306    public void calopr2(int n, String opChar) { //处理单目运算
307        if (opChar.equals("!") || opChar.equals("n!")) {
308            Calculat.show.setText(new Factorial().factorial((int) Calculat.opNum).toString());
309        } else if (opChar.equals("√")) {
310            Calculat.show.setText("" + Math.sqrt(n));
311        } else if (opChar.equals("1/x")) {
312            Calculat.show.setText("" + (1.0 / n));
313        } else if (opChar.equals("x^2")) {
314            Calculat.show.setText("" + Math.pow(n, 2));
315        } else if (opChar.equals("ln")) {
316            Calculat.show.setText("" + Math.log(n));
317        } else if (opChar.equals("log")) {
318            //Calculat.show.setText("" + Math.log10(n));
319        } else if (opChar.equals("sin")) {
320            Calculat.show.setText("" + Math.sin(Math.toRadians(n)));
321        } else if (opChar.equals("cos")) {
322            Calculat.show.setText("" + Math.cos(Math.toRadians(n)));
323        } else if (opChar.equals("tan")) {
324            Calculat.show.setText("" + Math.tan(Math.toRadians(n)));
325        } else if (opChar.equals("Exp")) {
326            Calculat.show.setText("" + Math.exp(n));
327        }
328    }
329}
330 
331class Factorial { //计算大数阶乘
332    protected static ArrayList<BigInteger> table = new ArrayList<BigInteger>();
333    static {
334        table.add(BigInteger.valueOf(1));
335    }
336 
337    /** Creates a new instance of factorial */
338    public static synchronized BigInteger factorial(int x) {
339        if (x < 0) {
340            throw new IllegalArgumentException("x must be non-negative.");
341        }
342        for (int size = table.size(); size <= x; size++) {
343            BigInteger lastfact = (BigInteger) table.get(size - 1);
344            BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
345            table.add(nextfact);
346        }
347        return (BigInteger) table.get(x);
348    }
349}

转载于:https://my.oschina.net/u/140625/blog/59275

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值