Java計(jì)算器_課程設(shè)計(jì)文檔和代碼_第1頁(yè)
Java計(jì)算器_課程設(shè)計(jì)文檔和代碼_第2頁(yè)
Java計(jì)算器_課程設(shè)計(jì)文檔和代碼_第3頁(yè)
Java計(jì)算器_課程設(shè)計(jì)文檔和代碼_第4頁(yè)
Java計(jì)算器_課程設(shè)計(jì)文檔和代碼_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一課程設(shè)計(jì)的目的計(jì)算器在我們的生活中常常會(huì)使用到,本次課程設(shè)計(jì),通過(guò)界面以及其中的邏輯處理,完成了四那么運(yùn)算的處理。通過(guò)awt包或者swing包中的界面設(shè)計(jì)局部對(duì)界面設(shè)計(jì)的細(xì)節(jié)可以有更多的了解。利用面向?qū)ο蟮乃枷?,將各個(gè)組件的事件響應(yīng)分別用不同的類(lèi)表達(dá)出來(lái)。面向?qū)ο蟮乃枷霃暮艽蟪潭壬峡梢宰尦绦虻乃悸犯忧逦铱芍赜眯院芨?。?duì)于具有相同事件響應(yīng)的組件那么可以調(diào)用相同的類(lèi)來(lái)處理事件。除此之外,利用棧的知識(shí)來(lái)解決運(yùn)算符優(yōu)先的問(wèn)題也讓我們對(duì)java中的棧有了更多的了解。 1二課程設(shè)計(jì)的任務(wù)與要求a. 使用Java的awt包或Swing包的類(lèi)庫(kù)設(shè)計(jì)圖形界面的計(jì)算器 b 該計(jì)算器能夠完成加減乘除的四那

2、么混合運(yùn)算注意運(yùn)算優(yōu)先級(jí) c 使用圖形界面中的事件委托機(jī)制來(lái)處理事件響應(yīng) 2三需求分析 1.該計(jì)算器完成的功能有:用戶(hù)能夠完成四那么混合運(yùn)算+、-、*、/,并且計(jì)算器能夠自動(dòng)的識(shí)別運(yùn)算符的優(yōu)先級(jí),根據(jù)輸入的運(yùn)算公式,自動(dòng)計(jì)算出相應(yīng)的結(jié)果。同時(shí)完成計(jì)算器中的backspace、ce按鈕,能夠完成消除或者刪除的功能。 2.出錯(cuò)處理當(dāng)用戶(hù)如果按下的是除零的操作,顯示框?qū)@示“被除數(shù)不能為0。當(dāng)用戶(hù)如果連續(xù)屢次按下運(yùn)算符,計(jì)算器自動(dòng)記憶第一次運(yùn)算符,并且做防連續(xù)輸入相同的運(yùn)算符或者是不同的運(yùn)算符。當(dāng)用戶(hù)在同一個(gè)數(shù)據(jù)中屢次輸入小數(shù)點(diǎn),計(jì)算器能夠自動(dòng)判斷小數(shù)點(diǎn)重復(fù),自動(dòng)只記憶第一個(gè)小數(shù)點(diǎn)。當(dāng)用戶(hù)在同一個(gè)數(shù)

3、據(jù)中輸入多個(gè)負(fù)號(hào),計(jì)算器能夠自動(dòng)做重復(fù)檢查,不顯示多余的負(fù)號(hào)。 當(dāng)用戶(hù)在使用backspace功能刪除越界數(shù)據(jù)時(shí)候,計(jì)算器自動(dòng)做相應(yīng)處理。 3.數(shù)據(jù)處理在程序的起始,建立了兩個(gè)棧,分別用來(lái)存儲(chǔ)操作數(shù)和操作符。在計(jì)算器的核心運(yùn)算代買(mǎi)中,運(yùn)用這兩個(gè)棧來(lái)實(shí)現(xiàn)算法中的優(yōu)先級(jí)的處理,使用“#號(hào)來(lái)標(biāo)記目標(biāo)計(jì)算公式的結(jié)束。目標(biāo)計(jì)算公式通過(guò)計(jì)算器的鍵盤(pán)實(shí)現(xiàn)輸入,當(dāng)按下“=號(hào)之后,計(jì)算器通過(guò)調(diào)用計(jì)算器核心函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的處理。 3四類(lèi)層次中各個(gè)類(lèi)的描述包括屬性和方法 本次課程設(shè)計(jì)一共分為了5個(gè)類(lèi),每個(gè)類(lèi)都各自完成不同的功能。l class MyCalculator: 類(lèi)MyCalculator是主類(lèi),含有mai

4、n函數(shù), 通過(guò)new CalFrame()來(lái)運(yùn)行程序。l class CalFrame: 類(lèi)CalFrame完成的功能是計(jì)算器界面的設(shè)計(jì),并且將每個(gè)組件都添加事件響應(yīng)。具體的事件響應(yīng)操作將在其他的類(lèi)中逐一實(shí)現(xiàn)。 l class HandleWin:點(diǎn)擊關(guān)閉windows窗口的控制類(lèi)。l class HandleNum:字符串輸入控制類(lèi)。l Class HandleEqual:等號(hào)出發(fā)事件的響應(yīng)機(jī)制類(lèi)。 屬性包括:09的數(shù)字鍵JButton num1; JButton num2; JButton num3; JButton num4; JButton num5; JButton num6; JB

5、utton num7; JButton num8; JButton num9; JButton num0; + - * / 四個(gè)控制按鈕 JButton plus;JButton minus;JButton mutiply;JButton divide;. +/- 兩個(gè)按鈕JButton point;JButton sign; Backspace ce = 三個(gè)按鈕JButton bs;JButton ce;JButton equal; 將這些按鈕按照一定的順序添加到現(xiàn)實(shí)面板中。Panel p1,p2,p3,p4;/為了布局的方便,利用borderLayout,通過(guò)幾個(gè)面板來(lái)添加 Stack

6、<Double> OPNT = new Stack <Double> ();/用來(lái)記錄操作數(shù)的棧Stack <String> OPTR = new Stack <String> ();/用來(lái)記錄操作符的棧,棧底壓入“#,取到了“#"代表已到棧底 boolean pointswitch = true;/小數(shù)點(diǎn)開(kāi)關(guān)boolean oprateswitch = false;/運(yùn)算符開(kāi)關(guān)boolean siginswitch = true;/ 正負(fù)號(hào)開(kāi)關(guān) 4方法: publ

7、ic void actionPerformed(ActionEvent e)當(dāng)按下了控制按鈕,根據(jù)搜索控制開(kāi)關(guān)來(lái)確定能否繼續(xù)添加,各個(gè)相應(yīng)的處理機(jī)制。 public double segmentation(String myString)字符串優(yōu)先級(jí)計(jì)算代碼的核心函數(shù)。public int compare(char ch1,char ch2)1值為ch1大于ch2;-1為ch1小于ch2;0為ch1等于ch2public double oprate(double a,char b,double ce)通過(guò)參數(shù)b來(lái)判斷加減乘除 5五計(jì)算器界面的設(shè)計(jì) 本程序的實(shí)現(xiàn)使用了swing和awt兩個(gè)包,主

8、題程序界面按鍵根據(jù)微軟計(jì)算器的布置界面進(jìn)行設(shè)置,采用比較人性化的常規(guī)按鍵排布。返回計(jì)算結(jié)果的“=號(hào)鍵使用了兩倍于普通按鍵面積的設(shè)計(jì),使的擊中的概率更加大。整體界面是采用了BorderLayout布局,通過(guò)4個(gè)panel進(jìn)行布局的詳細(xì)劃分,panel3用來(lái)存儲(chǔ)位于panel4左下角的GridLayout1,2,4,4布局,panel1、panel2、panel3分別用來(lái)表示BorderLayout的上中下三個(gè)模塊。Panel1中添加了一個(gè)Label display,display用來(lái)作為顯示器,實(shí)時(shí)的顯示輸入和計(jì)算的數(shù)據(jù)。其中display需要設(shè)置為右對(duì)齊和只讀屬性。Panel2中添加數(shù)字輸入鍵

9、和根本操作符鍵,panel采用了GridLayout布局,將整個(gè)panel2平分為4*4個(gè)空間,其中,數(shù)字鍵采用了15磅字體和藍(lán)色文字,操作符采用了15磅字體和紅色文字,是的界面更加顯眼和便于區(qū)分。Panel4中首先劃分為GridLayout1,2,4,4,在Panel4中,再次使用了GridLayout1,2,4,4將panel4的左側(cè)一分為二,左邊為panle3,這個(gè)的根底上程序往panel3中添加了backspace和ce兩個(gè)按鍵,在Panel4的右側(cè)單元格中添加了“=號(hào)按鈕,這個(gè)時(shí)候的“=號(hào)就是相當(dāng)于兩個(gè)普通按鈕的長(zhǎng)度和大小。整個(gè)程序界面的設(shè)計(jì)工作根本完成。 6六系統(tǒng)測(cè)試截圖1.系統(tǒng)初

10、始運(yùn)行界面 圖1 系統(tǒng)初始運(yùn)行界面截圖2.計(jì)算器按鍵測(cè)試 3.運(yùn)算符重復(fù)輸入測(cè)試圖2 系統(tǒng)按鍵測(cè)試截圖 圖3 加號(hào)重復(fù)輸入測(cè)試截圖 73.被除數(shù)為0的測(cè)試 4.小數(shù)點(diǎn)重復(fù)性檢查圖4 1/0的結(jié)果Infinity截圖 圖5 小數(shù)點(diǎn)重復(fù)輸入錯(cuò)誤檢查截圖5.backspace按鍵越界操作 圖6 使用backspace鍵做越界操作的截圖 86.優(yōu)先級(jí)程序計(jì)算 7.計(jì)算結(jié)果 圖7 計(jì)算2/3+6*9-3截圖 圖8 上面有優(yōu)先級(jí)的公式計(jì)算結(jié)果 9七設(shè)計(jì)步驟 本次最先開(kāi)始程序界面的設(shè)計(jì),通過(guò)界面的設(shè)計(jì),這樣心中更加清楚功能的完成。所以先實(shí)現(xiàn)了一個(gè)類(lèi)CalFrame,將每一個(gè)需要的組件全都進(jìn)行添加進(jìn)來(lái),并運(yùn)用

11、了相應(yīng)的布局方式。這樣一個(gè)界面就顯示出來(lái)了。其實(shí)在這個(gè)過(guò)程中還進(jìn)行了很屢次布局方式的嘗試,但最后也是以上面所說(shuō)的這種來(lái)完成。因?yàn)橐还膊艑W(xué)習(xí)了四種布局方式,應(yīng)用能力有局限。 接下來(lái)逐步實(shí)現(xiàn)邏輯功能。即每個(gè)組件的事件響應(yīng)。因?yàn)楹竺孢€涉及到運(yùn)算符的優(yōu)先級(jí)的問(wèn)題,需要應(yīng)用到棧,所以先完成一些簡(jiǎn)單的操作。接下來(lái)完成的是數(shù)字鍵的事件響應(yīng)。這樣后面的其他按鈕的事件響應(yīng)才能繼續(xù)下去。因此完成根本的數(shù)據(jù)顯示是必須得。這個(gè)實(shí)現(xiàn)是很簡(jiǎn)單的,通過(guò)actionPerformed的實(shí)現(xiàn),獲取到了信息來(lái)實(shí)現(xiàn)相應(yīng)功能的輸出。在actionPerformed中需要完成的還有ce 以及backspace 按鈕的事件響應(yīng)。首先弄清

12、楚了雖然兩個(gè)鍵代表的是清空和去除。backspace按鈕的事件響應(yīng)。完成逐一刪除單個(gè)數(shù)字的功能,利用到字符串中的取出相應(yīng)長(zhǎng)度的子字符串來(lái)完成顯示框的顯示。Ce那么是將所以相關(guān)的控制開(kāi)關(guān)和棧重置。在完成了根本的這些操作后,將要進(jìn)行的是運(yùn)算符的運(yùn)算過(guò)程??紤]到優(yōu)先級(jí)的問(wèn)題,將應(yīng)用棧來(lái)完成。因此先定義了兩個(gè)靜態(tài)的棧來(lái)存入用戶(hù)每次在按下等號(hào)之前輸入的字符串的使用正那么表達(dá)式的分解操作數(shù)和操作符。對(duì)于每個(gè)運(yùn)算符的處理都是一樣的,即將每次按下運(yùn)算符時(shí)將顯示框中的內(nèi)容壓入棧中,并且將該運(yùn)算符壓入棧中。最后是對(duì)等于號(hào)的事件響應(yīng)。通過(guò)慢慢的添加,計(jì)算器的運(yùn)算功能就完成了。 10八總結(jié) 這個(gè)學(xué)期的java課程設(shè)計(jì)

13、-計(jì)算器對(duì)我來(lái)說(shuō)是一個(gè)不斷學(xué)習(xí),逐步完善的過(guò)程。開(kāi)始的時(shí)候拿到題目看到只有四那么混合運(yùn)算就理所當(dāng)然的認(rèn)為應(yīng)該是非常簡(jiǎn)單的的一個(gè)程序而已。首先開(kāi)始了程序的界面的設(shè)計(jì)。并且將一些簡(jiǎn)單的按鈕的事件響應(yīng)完成了。剩下了運(yùn)算符優(yōu)先級(jí)的問(wèn)題以及數(shù)據(jù)的處理問(wèn)題。于是在同學(xué)的幫助下利用正那么表達(dá)式來(lái)完成輸入字符串的切割,但是如果自己一個(gè)人單挑來(lái)說(shuō),對(duì)于題目中的數(shù)據(jù)處理的問(wèn)題一時(shí)不知道該如何與正那么表達(dá)式連接上。最后我還是選擇用棧來(lái)處理。這個(gè)過(guò)程讓我明白了學(xué)習(xí)知識(shí)的時(shí)候?qū)嵺`與理論之間是有很大的差異的。應(yīng)用能力我還有待加強(qiáng)。于是我開(kāi)始熟悉棧的使用。以前在c+的學(xué)習(xí)中接觸過(guò)棧,這次的使用思想是一樣的,只需要在了解一下

14、java 中的相關(guān)一些函數(shù)便可。但實(shí)際在寫(xiě)程序的過(guò)程中,由于有一些特殊情況的考慮與進(jìn)出入棧的聯(lián)系,還是碰到了一些問(wèn)題。但在后來(lái)我慢慢的整理清楚思路以后,邏輯列清楚了,便也將這些問(wèn)題解決了。逐步的將各項(xiàng)功能都完善了。當(dāng)然目前我的計(jì)算器也只是完成了四那么混合運(yùn)算,實(shí)際上還應(yīng)該有很多功能可以添參加計(jì)算器的。本次java課程設(shè)計(jì)也讓我明白只要我一步步去做,那么程序功能便會(huì)不斷強(qiáng)大。同時(shí)很重要的一點(diǎn)便是以后要多加強(qiáng)自己的動(dòng)手實(shí)踐能力。 11參考文獻(xiàn) 1 Struts Web設(shè)計(jì)與開(kāi)發(fā)大全/邱哲,王俊標(biāo),馬斗編著.北京:清華大學(xué)出版社,2006.22 JSP應(yīng)用開(kāi)發(fā)詳解/劉曉華,張建,周慧貞編著.3版.北

15、京:電子工業(yè)出版社,2007.1 12附錄A:程序源代碼 import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern; public class MyCalculator public static void main(String args)new CalFrame(); class CalFrame extends JFrame String opnt,optr;S

16、tack <Double> OPNT = new Stack <Double> ();Stack <String> OPTR = new Stack <String> (); Label display; /顯示JButton num = new JButton10;/按鍵設(shè)計(jì)JButton plus; JButton minus; JButton mutiply; JButton divide; JButton bs;JButton ce;JButton equal;JButton

17、 point; JButton sign;JButton lbracket; JButton rbracket; Panel p1,p2,p3,p4; String disp = ""/用戶(hù)輸入的表達(dá)式 String result = "" ;/用戶(hù)輸入的字符串 CalFrame() OPTR.push("#"); for(int i=0;i<=9;+i) numi = new JButton(String.valueOf(i); plus = new JButton(&a

18、mp;quot;+"); plus.setForeground(Color.red); plus.setFont(new Font("Dialog",1,15); minus = new JButton("-"); minus.setForeground(Color.red); minus.setFont(new Font("Dialog",1,15); mutiply = new JButton("*"); mutiply.setF

19、oreground(Color.red); mutiply.setFont(new Font("Dialog",1,15); divide = new JButton("/");13divide.setForeground(Color.red);divide.setFont(new Font("Dialog",1,15);equal = new JButton("=");equal.setForeground(Color.red);equal.setF

20、ont(new Font("Dialog",1,15);point = new JButton(".");point.setFont(new Font("Dialog",1,15);sign = new JButton("+/-");sign.setFont(new Font("Dialog",1,15);bs = new JButton("backspace");bs.setFo

21、reground(Color.red);bs.setFont(new Font("Dialog",1,8);ce = new JButton("ce");ce.setFont(new Font("Dialog",1,15);p1 = new Panel();p1.setLayout(new BorderLayout(); display = new Label("0.",Label.RIGHT);display.setBackground(Color.

22、white); p1.add(display,BorderLayout.NORTH); p2 = new Panel();p2.setLayout(new GridLayout(4,4,4,4); p2.add(num7);p2.add(num8);p2.add(num9);p2.add(divide);p2.add(num4);p2.add(num5);p2.add(num6);p2.add(mutiply);p2.add(num1);p2.add(num2);p2.add(num3);p2.add(minus);p2.add(num0);p2.add(sign);p2.add(point)

23、;p2.add(plus);p3 = new Panel(new GridLayout(1,2,4,4);p3.add(bs);p3.add(ce); p4 = new Panel(new GridLayout(1,2,4,4);p4.add(p3);p4.add(equal); setTitle("超級(jí)計(jì)算器"); setLayout(new BorderLayout(); add(p1,BorderLayout.NORTH); add(p2,BorderLayout.CENTER); add(p4,BorderLayout.SOUTH);14 setVi

24、sible(true); pack(); setResizable(false); setBounds(600,350,300,230); addWindowListener(new HandleWin(); for(int i=0;i<=9;+i) numi.setForeground(Color.blue); numi.setFont(new Font("Dialog",1,15); numi.addActionListener(new HandleNum(this,i); plus.addActionListener(new Handle

25、Num(this); minus.addActionListener(new HandleNum(this); mutiply.addActionListener(new HandleNum(this); divide.addActionListener(new HandleNum(this); point.addActionListener(new HandleNum(this); sign.addActionListener(new HandleNum(this); bs.addActionListener(new HandleNum(this); ce.addActionListener

26、(new HandleNum(this); equal.addActionListener (new HandleEqual(this); class HandleWin extends WindowAdapter/關(guān)閉計(jì)算器 public void windowClosing(WindowEvent e) (e.getWindow().dispose(); System.exit(0); boolean pointswitch = true;/小數(shù)點(diǎn)開(kāi)關(guān) boolean oprateswitch = false;/運(yùn)算符開(kāi)關(guān) boolean siginswitch = true;/ clas

27、s HandleNum implements ActionListener/字符串的輸入 JFrame my_Num; int itemp = 0; HandleNum(JFrame f,int a) my_Num = f; itemp = a; HandleNum(JFrame f) my_Num = f; public void actionPerformed(ActionEvent e) 15 if(e.getSource()=numitemp)/輸入數(shù)字字符 oprateswitch = true; siginswitch = false; disp = disp + itemp; d

28、isplay.setText(disp); if(oprateswitch&&e.getSource()=plus)/輸入加號(hào) pointswitch = true; oprateswitch = false; siginswitch = true; disp = disp + "+" display.setText(disp); if(oprateswitch&&e.getSource()=minus)/輸入減號(hào) pointswitch = true; oprateswitch = false

29、; siginswitch = true; disp = disp + "-" display.setText(disp); if(oprateswitch&&e.getSource()=mutiply)/輸入乘號(hào) pointswitch = true; oprateswitch = false; siginswitch = true; disp = disp + "*" display.setText(disp); if(oprateswitch&&e.ge

30、tSource()=divide)/輸入除號(hào) pointswitch = true; oprateswitch = false; siginswitch = true; disp = disp + "/" display.setText(disp); if(oprateswitch&&pointswitch=true&&e.getSource()=point)/輸入小數(shù)點(diǎn)pointswitch = false;oprateswitch = false;siginswitch = false;di

31、sp = disp + "."display.setText(disp); 16 if(siginswitch&&e.getSource()=sign)/輸入負(fù)號(hào) disp = disp + "" display.setText(disp); if(e.getSource()=bs)/點(diǎn)擊backspace if(!disp.isEmpty() disp = disp.substring(0,disp.length()-1); if(disp.isEmpty() disp=&quot

32、; " display.setText(disp); if(e.getSource()=ce)/點(diǎn)擊ce disp = " " display.setText(disp); class HandleEqual implements ActionListener/ 等于號(hào)觸發(fā)的事件 Frame my_Equal; HandleEqual(JFrame f) my_Equal = f; public void actionPerformed(ActionEvent e) if(e.getSource()=equal) disp = disp+&

33、amp;quot;#" disp = String.valueOf(segmentation(disp); display.setText(disp); disp = "" pointswitch = true;/小數(shù)點(diǎn)開(kāi)關(guān) oprateswitch = false;/運(yùn)算符開(kāi)關(guān) siginswitch = true; /符號(hào)開(kāi)關(guān) public double segmentation(String myString) String reg = "(?d+.?d*)|(-+*/()#)" /分割表達(dá)Pattern p = Pattern pile(reg); Matcher m = p.matcher(myString); String find = "" double num = 0; 式.17 double op1,op2; char op3; while(m.find() find

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論