結對項目-增強型科學計算器


題目:增強型計算器

 

  •  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個人都學到了很東西,繼續努力吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM