題目:增強型計算器
- 1、 題目簡介:
專案採用結對程式設計方式編寫,完成一個圖形介面的計算器,可以在標準計算器和科學計算器之間切換,標準計算器的基本功能有:加、減、乘、除基本算術運算;科學計算器的基本功能有:三角函式、進位制轉換、對數、階乘;在普通科學計算器基礎上新增加:求解一元二次方程,求解勾股定理。
- 2、基本功能與要求:
1).標準計算器:加、減、乘、除、求平方根;
2).科學計算器:進位制轉換、求解三角函式、對數運算、階乘;
3).一元二次方程:求一元二次方程的解;
4).勾股定理:求直角三角邊長。
- 3、設計思路及分工:
對於此計算器程式,首先要設計其GUI介面,總體介面有一個文字框,18個按鈕,總體介面用BorderLayout佈局。
文字框放置在最NORTH,然後0到9以及+,-,*,/的按鈕放置到一個皮膚Panel中,新增到整體佈局的CENTER,介面設計完成。
佈局設計好後再新增按鈕事件。對於此程式要考慮到點選加、減、乘、除按鈕時是否有點選數字按鈕,如果是第一次點選數字按鈕或者是點選數字按鈕前點選了加、減、乘、除按鈕則直接把數字按鈕的數值設定到文字框中,否則則應把文字框中的內容加上你所點選按鈕的數值設定到文字框中。
這是計算器中的一種:簡單計算器,本專案用到了Java中的GUI介面和swing元件以及awt佈局,所以簡單易用,它能完成如下的幾個小功能:
點選按鈕中的數字鍵和運算子鍵就能進行簡單的加、乘、乘、除求模四則運算 。
王倩倩負責GUI介面的具體實現,這裡不再列述請移至王倩倩部落格看具體實現過程。
我負責各個計算功能的具體實現,在此列舉一些關鍵程式碼,具體內容請到我的GitHub(http://github.com/bbker/Counter)裡看看。
- 3.1功能圖:
- 3.2流程圖:
- 4、結對實踐過程(個人部分核心程式碼)
1)開根號運算,定義jButton2 = new JButton("sqrt");對其設定監控,呼叫Math.sqrt()方法來實現開根號運算,並在文字框中輸出結果:
1 jButton2.addActionListener(new ActionListener() { 2 public void actionPerformed(ActionEvent e) { 3 double a=Double.parseDouble(jTextField.getText());//獲取文字框內容 4 double b; 5 if(a<0){jTextField.setText("負數不能開平方");} 6 else{b=Math.sqrt(a);jTextField.setText(Double.toString(b));}//執行開平方操作 7 }});
2)實現求階乘方法:
1 jButton42.addActionListener(new ActionListener() { 2 public void actionPerformed(ActionEvent e) { 3 double i=Double.parseDouble(jTextField.getText()); 4 if((i%2==0)||(i%2==1)){//判斷為整數進行階乘操作 5 int j=(int)i;//強制型別轉換 6 int result=1; for(int k=1;k<=j;k++) result *=k; 7 jTextField.setText(String.valueOf(result));}}});
3)MS是將當前視窗資料寫入“寄數器”,M+是將當前視窗資料與“寄數器”內的資料相加後再存入“寄數器”,MR是讀出“寄數器”內的資料到視窗,MC是清除“寄數器”內的資料,使其為0。按鈕實現方法:
1 public void actionPerformed 2 (ActionEvent e)中實現, 3 public void actionPerformed(ActionEvent e) { 4 Object temp = e.getSource(); 5 if (temp == jButton20) { 6 memoryd = memoryi = 0; 7 textMemory.setText("ZY "); 8 textMemory.setFont(new Font("華文行楷", Font.BOLD, 30));} 9 //'MS'的操作,將當前文字框內容儲存入記憶體,顯示'M' 10 if (temp == jButton22) { //textMemory顯示m的文字框 11 boolean isDot = false; 12 textMemory.setText(" M "); 13 textMemory.setFont(new Font("楷體", Font.BOLD, 30)); 14 for (int i = 0; i < jTextField.getText().length(); i++) 15 if ('.' == jTextField.getText().charAt(i)) { 16 isDot = true; 17 break; } 18 //如果是double,則存入memoryd(double儲存器) 19 if (isDot == true) { 20 memoryd = Double.parseDouble(jTextField.getText()); 21 memoryi = 0; //保證儲存器中存放最新的值 } 22 //如果是int,則存入memoryi(int儲存器) 23 else { 24 memoryi = Integer.parseInt(jTextField.getText()); 25 memoryd = 0; //保證儲存器中存放最新的值 }} 26 //'MR'的操作,將儲存器中的資訊輸出 27 if (temp == jButton21) { if (memoryd != 0) 28 jTextField.setText(Double.toString(memoryd)); 29 if (memoryi != 0) 30 jTextField.setText(Integer.toString(memoryi)); } 31 //'M+'的功能,將當前文字框裡的資料和儲存器中資料相加後,再存入儲存器 32 if (temp == jButton23) { 33 textMemory.setText(" M "); 34 textMemory.setFont(new Font("楷體", Font.BOLD, 30)); 35 boolean isDot = false; 36 for (int i = 0; i < jTextField.getText().length(); i++) 37 if ('.' == jTextField.getText().charAt(i)) { 38 isDot = true; break; } 39 if (memoryi != 0) { //儲存中是一個int型數 40 if (isDot == false) //被加數是一個int型數 41 memoryi += Integer.parseInt(jTextField.getText()); 42 else { 43 //被加數是一個double型數,則將int儲存器中數傳入double儲存器與當前數相加,int儲存器清零 44 memoryd = memoryi + Double.parseDouble(jTextField.getText()); 45 memoryi = 0; } } 46 else 47 memoryd += Double.parseDouble(jTextField.getText()); }
4)用來求log以10為底的對數值,當對數值i大於0時就呼叫Math.log10(i)來輸出結果,當i小於0時就在文字框中顯示負數不能求對數!。
1 jButton45.addActionListener(new ActionListener() {//求負數 2 public void actionPerformed(ActionEvent e) { 3 double i=Double.parseDouble(jTextField.getText()); 4 if(i>0){
5 jTextField.setText(String.valueOf(df.format(Math.log10(i)))); 6 }else
7 { jTextField.setText("負數不能求對數!");}}});
5)定義三角函式sin、cos、tan但是在使用需要先呼叫弧度按鈕,將相應的角度轉換成弧度以後在使用三角函式對應的按鈕才可以實現求三角函式的值。求弧度方法在定義弧度按鈕時實現,string.valueOf(i/180*Math.PI)求對應的弧度sin、cos、tan使用math中的方法。
6)一元二次方程的求解
1 public void actionPerformed(ActionEvent e) { 2 double a=Double.parseDouble(jtf1.getText()); 3 double b=Double.parseDouble(jtf2.getText()); 4 double c=Double.parseDouble(jtf3.getText()); 5 double d,x1,x2; 6 d=b*b-4*a*c; 7 x1=(-1*b+Math.sqrt(d))/(2*a);//計算x1的值 8 x2=(-1*b-Math.sqrt(d))/(2*a); 9 if(e.getSource()==jb1&&d<0){ 10 jtf4.setText("d小於0無解"); 11 jtf5.setText("d小於0無解"); 12 } 13 else if(e.getSource()==jb1&&d>=0){ 14 jtf4.setText(Double.toString(x1));//返回結果 15 jtf5.setText(Double.toString(x2)); 16 } 17 else if(e.getSource()==jb3){ 18 jtf1.setText(""); 19 jtf2.setText(""); 20 jtf3.setText(""); 21 jtf4.setText(""); 22 jtf5.setText(""); 23 } 24 }
7)勾股定理實現過程
1 public void actionPerformed(ActionEvent e) { 2 if (e.getSource()==jb13){ 3 double a=Double.parseDouble(jtf11.getText());//獲取文字框內容 4 double b=Double.parseDouble(jtf12.getText()); 5 double d,d2; 6 d=a*a+b*b; 7 d2=Math.sqrt(d);//開方 8 jtf13.setText(String.valueOf(df.format(d2)));}//返回結果 9 if (e.getSource()==jb12){ 10 double a=Double.parseDouble(jtf11.getText()); 11 double b=Double.parseDouble(jtf13.getText()); 12 double d,d2; 13 d=b*b-a*a; 14 d2=Math.sqrt(d); 15 jtf12.setText(String.valueOf(df.format(d2)));} 16 if (e.getSource()==jb11){ 17 double a=Double.parseDouble(jtf12.getText()); 18 double b=Double.parseDouble(jtf13.getText()); 19 double d,d2; 20 d=b*b-a*a; 21 d2=Math.sqrt(d); 22 jtf11.setText(String.valueOf(df.format(d2)));}}}
- 5、測試情況
程式使用的是fest-swing測試工具,進行GUI的測試,具體測試程式碼請到我的github中下載檢視,測試及程式執行結果如下:
執行結果:
測試結果:使用fest-swing測試會出現動畫效果強烈建議大家到我的github內下載程式碼執行看看
- 6、問題及心得
1).設定計算器MR、MC、MS、M+時遇到問題,開始不知道怎麼去實現,後來通過上網查詢相關程式碼得以解決,設定double memoryd和int memoryi來使用記憶體中的資料。
2)進位制轉換的實現, 通過呼叫 Integer.toHexString(n)十六進位制、Integer.toOctalString(n)八進位制、Integer.toBinaryString(n),二進位制可以將數字轉換成對應的進位制型別。
本次專案幾乎遇到的所有問題,全部通過谷歌(www.gfsoso.net)找到的,國內搜尋網站的資訊不是非常多,尤其是在關於GUI測試方面,自己搜尋了大量的資訊,進行學習雖然掌握的不是很多,但也讓我學會了對GUI程式的測試,這是非常不錯的一點,在於王倩倩同學合作程式設計的過程中,我們兩個人相互查漏補缺,相互進步,彼此學到了很多關於結對程式設計方面的經驗,並且王倩倩同學特別仔細認真,在我編寫的過程中出現的一些問題都能及時的發現,這讓我知道有一個好程式設計的夥伴是非常重要的,總之2個人都學到了很東西,繼續努力吧!