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 計算器;java

package org.csmn.app;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.math.*;
import java.util.*;

/**
 * <p>Title: 用戶應用界面計算器</p>
 * <p>Description: 包含簡易計算與功能更增強大的科學計算</p>
 * <p>Copyright: Copyright (c) 2008</p>
 * <p>Company: </p>
 * @author  車水碼農
 * @version 1.0
 */
public class Calculat {
	static JTextField show;//設置輸入區,顯示區
	static double opNum = 0;//存放操做數
	static String opChar = "=";//存放操做符
	static boolean flag = true;//設置標誌

	public static void main(String[] args) {
		new EasyFrame();//產生首界面——簡易計算器
	}
}

class EasyFrame { //構建簡易計算器框架界面
	static JFrame frame;

	public EasyFrame() {
		frame = new JFrame("簡易計算器");
		Toolkit kit = Toolkit.getDefaultToolkit();//設置圖標
		//下面這條語句很差,不具備可移植性
		Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
		frame.setIconImage(image);
		frame.addWindowListener(new WindowAdapter() {//響應關閉事件
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		JMenuBar mb = new JMenuBar();//建立菜單欄
		JMenu m1 = new JMenu("編輯");//建立菜單
		JMenu m2 = new JMenu("操做");
		JMenu m3 = new JMenu("幫助");
		JMenuItem mi1c = new JMenuItem("複製", KeyEvent.VK_C);//建立菜單項
		JMenuItem mi1v = new JMenuItem("粘貼", KeyEvent.VK_V);
		JMenuItem mi21 = new JMenuItem("基本計算");
		JMenuItem mi22 = new JMenuItem("科學計算");
		JMenuItem mi31 = new JMenuItem("使用說明");
		JMenuItem mi32 = new JMenuItem("About...");
		frame.setJMenuBar(mb);//添加菜單到窗口
		mb.add(m1);
		mb.add(m2);
		mb.add(m3);
		m1.add(mi1c);
		m1.add(mi1v);
		m2.add(mi21);
		m2.add(mi22);
		m3.add(mi31);
		m3.add(mi32);
		/*菜單項監聽事件 */
		mi1c.addActionListener(new MenuItemListener());//監聽複製
		mi1v.addActionListener(new MenuItemListener());//監聽粘貼
		mi22.addActionListener(new MenuItemListener());
		mi31.addActionListener(new MenuItemListener());
		mi32.addActionListener(new MenuItemListener());
		Container cp = frame.getContentPane();//獲取內容窗格
		cp.add(new easyCalPanel());//將簡易計算器面板加入到框架中
		frame.setSize(280, 250);
		//frame.pack();//將框架設置合適的大小
		frame.setVisible(true);//設置框架可見
	}
}

class AdvanceFrame { //構建高級計算器框架界面
	static JFrame frame;

	public AdvanceFrame() {
		frame = new JFrame("科學計算器");
		Toolkit kit = Toolkit.getDefaultToolkit();//設置圖標
		Image image = kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
		frame.setIconImage(image);
		JMenuBar mb = new JMenuBar();//建立菜單欄
		JMenu m1 = new JMenu("編輯");
		JMenu m2 = new JMenu("操做");
		JMenu m3 = new JMenu("幫助");
		JMenuItem mi1c = new JMenuItem("複製", KeyEvent.VK_C);
		JMenuItem mi1v = new JMenuItem("粘貼", KeyEvent.VK_V);
		JMenuItem mi21 = new JMenuItem("基本計算");
		JMenuItem mi22 = new JMenuItem("科學計算");
		JMenuItem mi31 = new JMenuItem("使用說明");
		JMenuItem mi32 = new JMenuItem("About...");
		frame.setJMenuBar(mb);//添加菜單欄
		mb.add(m1);
		mb.add(m2);
		mb.add(m3);//添加菜單
		m1.add(mi1c);
		m1.add(mi1v);
		m2.add(mi21);
		m2.add(mi22);
		m3.add(mi31);
		m3.add(mi32);
		mi1c.addActionListener(new MenuItemListener());//監聽複製
		mi1v.addActionListener(new MenuItemListener());//監聽粘貼
		mi21.addActionListener(new MenuItemListener());//監聽簡易計算
		mi31.addActionListener(new MenuItemListener());//監聽使用說明
		mi32.addActionListener(new MenuItemListener());//監聽關於
		Container cp = frame.getContentPane();//獲取框架的內容窗格
		cp.add(new AdvanceCalPanel());//添加高級計算面板
		frame.pack();//設置適當的大小
		frame.setVisible(true);//可見
		frame.addWindowListener(new WindowAdapter() {//響應關閉按鈕
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
}

class MenuItemListener implements ActionListener {//響應菜單事件
	public void actionPerformed(ActionEvent e) {
		if ("基本計算".equals(e.getActionCommand())) {
			new EasyFrame();//切換到簡易計算器窗口
			AdvanceFrame.frame.setVisible(false);
		} else if ("科學計算".equals(e.getActionCommand())) {
			new AdvanceFrame();//切換到高級計算界面
			EasyFrame.frame.setVisible(false);
		} else if ("複製".equals(e.getActionCommand())) {
			//
		} else if ("粘貼".equals(e.getActionCommand())) {
			//
		} else if ("使用說明".equals(e.getActionCommand())) {
			try {
				FileInputStream fis = new FileInputStream("使用說明.txt");
				InputStreamReader isr = new InputStreamReader(fis);
				BufferedReader br = new BufferedReader(isr);
				JTextArea helpArea = new JTextArea(15, 48);
				//helpArea.enable(false);
				helpArea.setEditable(false);
				helpArea.setDisabledTextColor(Color.black);
				JScrollPane scroll = new JScrollPane(helpArea);
				String s;
				while ((s = br.readLine()) != null) {
					helpArea.append(s);
					helpArea.append("\n");
				}
				JOptionPane.showMessageDialog(null, scroll, "幫助主題", JOptionPane.PLAIN_MESSAGE);
				br.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
			//System.exit(0);   //若是加上此句,當關掉JOptionPane時就會關掉JFrame;
		} else if (e.getActionCommand().equals("About...")) {
			JTextArea aboutArea = new JTextArea();
			aboutArea.setText("版權擁有者:車水碼農\n開發時間:2008-12-16\n");
			JOptionPane.showMessageDialog(null, aboutArea, "關於 計算器", JOptionPane.PLAIN_MESSAGE);
		}
	}
}

class AdvanceCalPanel extends JPanel { //建立高級計算面板
	private static final long serialVersionUID = 2696716054985506500L;

	public AdvanceCalPanel() {
		setLayout(new BorderLayout());//設置佈局方式
		Calculat.show = new JTextField("0", 27);//顯示文本區
		Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 16));//設置字體
		Calculat.show.setHorizontalAlignment(JTextField.RIGHT);//設置光標位置
		JPanel ps = new JPanel();//建立面板加載顯示區文本框
		ps.add(Calculat.show);
		JPanel pbl = new JPanel();//建立面板加載按鈕
		pbl.setLayout(new GridLayout(10, 5, 1, 1));//設置按鈕面板的佈局
		pbl.setBorder(BorderFactory.createEtchedBorder());//設置邊框
		//pbr.setLayout(new GridLayout(5,6,1,2));
		//pbr.setBorder(BorderFactory.createEtchedBorder());
		String[] larr = { //按鈕
		"Sta", "F-E", "(", ")", "MC", "clr", "Avg", "dms", "Exp", "ln", "MR",
				"Dec", "Sum", "sin", "x^y", "log", "MS", "Bin", "E(x)", "cos",
				"x^2", "n!", "M+", "Oct", "D(x)", "tan", "x√", "1/x", "PI",
				"Hex", "D", "E", "F", "/", "Mod", "And", "A", "B", "C", "*",
				"Or", "Xor", "7", "8", "9", "-", "Lsh", "Not", "4", "5", "6",
				"+", "Int", "shift", "1", "2", "3", ".", "0", "=" };
		for (int i = 0; i < larr.length; i++) {
			addButton(pbl, larr[i]);//建立按鈕
		}
		setBorder(BorderFactory.createEtchedBorder());//設置邊框
		add(pbl, BorderLayout.CENTER);//分別添加兩面板到框架中
		add(ps, BorderLayout.NORTH);
	}

	private void addButton(Container c, String s) { //建立按鈕,加入到面板並監聽按鈕事件
		JButton bt = new JButton(s);
		c.add(bt);
		bt.addActionListener(new buttonListener());
	}
}

class easyCalPanel extends JPanel {//操做基本等同於建立高級計算面板
	private static final long serialVersionUID = 3224376138339105930L;

	public easyCalPanel() {
		setLayout(new BorderLayout());
		Calculat.show = new JTextField("0", 17);
		Calculat.show.setFont(new Font("Dialog", Font.PLAIN, 18));
		Calculat.show.setHorizontalAlignment(JTextField.RIGHT);
		JPanel ps = new JPanel();
		ps.add(Calculat.show);
		JPanel pb = new JPanel();
		pb.setLayout(new GridLayout(5, 4, 1, 1));
		pb.setBorder(BorderFactory.createEtchedBorder());
		String bts = "%^√!789/456*123-0.=+";
		for (int i = 0; i < bts.length(); i++) {
			addButton(pb, bts.substring(i, i + 1));
		}
		add(pb, BorderLayout.CENTER);
		add(ps, BorderLayout.NORTH);
	}

	private void addButton(Container c, String s) {
		JButton bt = new JButton(s);
		bt.setFont(new Font("Dialog", Font.PLAIN, 18));//設置字體
		c.add(bt);
		bt.addActionListener(new buttonListener());
	}
}

class buttonListener implements ActionListener {//響應按鈕事件

	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();//獲取命令
		if ('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) {//該命令爲正操做數
			if (Calculat.flag) { //若初次輸入該操做數(如:輸入「123」中的「1」)
				Calculat.show.setText(s);
			} else {
				//(如:輸入「123」中的"2"或"3")
				Calculat.show.setText(Calculat.show.getText() + s);
			}
			Calculat.flag = false;//修改標誌
		} else {//命令爲操做數爲負數或操做符
			if (Calculat.flag) {//初次輸入
				if (s.equals("-")) {//爲負數
					Calculat.show.setText(s);
					Calculat.flag = false;
				} else {//連續輸入幾個操做符
					Calculat.opChar = s; ///
				}
			} else {//爲操做符
				calculate cal = new calculate();//建立計算類實例
				double x = Double.parseDouble(Calculat.show.getText());//將輸入的操做數轉換爲double型
				cal.calopr1(x);//雙目運算及處理單目運算的操做數
				Calculat.opChar = s;//保存運算符
				if (Calculat.opChar.equals("!") || Calculat.opChar.equals("√")//操做數必須爲正的單目運算
						|| Calculat.opChar.equals("n!")) {
					if (Calculat.opNum < 0) {
						Calculat.show.setText("不能執行此操做!!");
					} else {
						cal.calopr2((int) Calculat.opNum, Calculat.opChar);//單目運算
					}
					Calculat.opChar = "=";//保存符號爲下一次運算作準備
				} else if (Calculat.opChar.equals("1/x")
						|| Calculat.opChar.equals("x^2")
						|| Calculat.opChar.equals("ln")
						|| Calculat.opChar.equals("log")
						|| Calculat.opChar.equals("sin")
						|| Calculat.opChar.equals("cos")
						|| Calculat.opChar.equals("tan")
						|| Calculat.opChar.equals("Exp")) {//普通單目運算
					cal.calopr2((int) Calculat.opNum, Calculat.opChar);//單目運算
					Calculat.opChar = "=";//保存符號爲下一次運算作準備
				}
				Calculat.flag = true;//設置標誌爲下一次運算作準備
			}
		}
	}
}

class calculate {//計算處理
	public void calopr1(double n) {//處理雙目運算及單目運算的操做數
		String str = "";
		if (Calculat.opChar.equals("+")) {
			Calculat.opNum += n;
		} else if (Calculat.opChar.equals("-")) {
			Calculat.opNum -= n;
		} else if (Calculat.opChar.equals("*")) {
			Calculat.opNum *= n;
		} else if (Calculat.opChar.equals("/")) {
			if (n == 0) {
				str = "除數爲0!!!";
			} else {
				Calculat.opNum /= n;
			}
		} else if (Calculat.opChar.equals("^") || Calculat.opChar.equals("x^y")) {
			Calculat.opNum = Math.pow(Calculat.opNum, n);
		} else if (Calculat.opChar.equals("x√")) {
			Calculat.opNum = Math.pow(n, 1 / Calculat.opNum);
		} else if (Calculat.opChar.equals("=")) {
			Calculat.opNum = n;
		} else if (Calculat.opChar.equals("Mod")) {
			Calculat.opNum = Math.abs(Math.IEEEremainder(Calculat.opNum, n));
		}
		Calculat.show.setText(str + Calculat.opNum);
	}

	public void calopr2(int n, String opChar) { //處理單目運算
		if (opChar.equals("!") || opChar.equals("n!")) {
			Calculat.show.setText(new Factorial().factorial((int) Calculat.opNum).toString());
		} else if (opChar.equals("√")) {
			Calculat.show.setText("" + Math.sqrt(n));
		} else if (opChar.equals("1/x")) {
			Calculat.show.setText("" + (1.0 / n));
		} else if (opChar.equals("x^2")) {
			Calculat.show.setText("" + Math.pow(n, 2));
		} else if (opChar.equals("ln")) {
			Calculat.show.setText("" + Math.log(n));
		} else if (opChar.equals("log")) {
			//Calculat.show.setText("" + Math.log10(n));
		} else if (opChar.equals("sin")) {
			Calculat.show.setText("" + Math.sin(Math.toRadians(n)));
		} else if (opChar.equals("cos")) {
			Calculat.show.setText("" + Math.cos(Math.toRadians(n)));
		} else if (opChar.equals("tan")) {
			Calculat.show.setText("" + Math.tan(Math.toRadians(n)));
		} else if (opChar.equals("Exp")) {
			Calculat.show.setText("" + Math.exp(n));
		}
	}
}

class Factorial { //計算大數階乘
	protected static ArrayList<BigInteger> table = new ArrayList<BigInteger>();
	static {
		table.add(BigInteger.valueOf(1));
	}

	/** Creates a new instance of factorial */
	public static synchronized BigInteger factorial(int x) {
		if (x < 0) {
			throw new IllegalArgumentException("x must be non-negative.");
		}
		for (int size = table.size(); size <= x; size++) {
			BigInteger lastfact = (BigInteger) table.get(size - 1);
			BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
			table.add(nextfact);
		}
		return (BigInteger) table.get(x);
	}
}

 


8.程序運行結果截圖:算法


參考文獻:
[ 1 ]. 幸運幃等編著. Java程序設計(第二版). 北京:清華大學出版社,2006.8
[ 2 ]. 葛朝軍等編著. java2使用培訓教程. 北京:清華大學出版社,2005.1編程

相關文章
相關標籤/搜索