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 计算器;
view source print ?
001 package org.csmn.app;
002  
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import java.io.*;
007 import java.math.*;
008 import 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  */
018 public 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  
029 class 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  
077 class 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  
122 class 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  
163 class 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  
200 class 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  
229 class 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  
279 class 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  
331 class 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 }

你可能感兴趣的:(Java仿windows自带的计算器-课程设计)