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 計算器;
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 }
相關文章
相關標籤/搜索