天天看點

結對程式設計1

小組成員、學号:楊立鑫 201421123100 楊愛清201421123099

  沒想到結對程式設計還是做個人作業的那個程式,正好對于上個作業有許多理想的目标并沒有實作,此次正好借助團隊的力量,共同來完善這個程式。

一、需求分析

  在原來的程式基礎上,我認為還需要以下幾個功能:

  1.能夠自由選擇題目個數,能夠生成加減乘除運算,包括分數運算。此外最好能實作階乘運算

  2.最好能給定時間記時,在完成答題時給出答題時間,有利于在答題效率上給出正确評估。

  3.能夠實作中英切換,增加适用人群

  4.能夠設計出美觀的圖形界面,更加親和使用者。

二、程式設計

  對上次程式分的四個類,我根據期望對其進行了優化:

上次:
1.Calculate
用于實作加減乘除運算,以及數字大小的比較
2.Dofrac
用于檢查答案,随機建立分數,求最大公約數,生成算式并求得計算結果
3.Fraction
用于生成分數與分數化簡
4.Generator
主類,生成主界面

優化:
1.Frame
經過實際變成優化,去掉不必要的代碼,将Calculate,Dofrac,Fraction合為一個大類
在該類中實作的圖形界面的設計,以及計時,出題,判斷對錯,以及異常處理(輸入異常)等函數。
不僅實作了加減乘除,又添加了階乘運算。
2.Generator
主類。生成主界面
           

三、代碼展示

package javaapplication8;


import javax.swing.*;

import java.awt.event.*;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

class Frame extends JFrame implements ActionListener
{
    int a, b, c, count, num;//a,b分别是第一個操作數,第二個操作數,c是存放使用者輸入的答案,count是題目總數,num是用于存放代表運算符的數
    int t=0,f=0,sum=0,s=1;//s表示階乘結果
    float d,d1;//d是用于存放除法結果,d1是用于處理除法結果中保留小數點後兩位
    int counter=0;//統計答題個數
    Timer time;
    int t1 = 0;
    JTextField T;//定義一個文本
    JLabel L1 = new JLabel("請輸入題目個數(1-5):");  
    JTextField T1 = new JTextField(5);   //放題目個數
    JButton B3 = new JButton("開始");
    JTextField T2 = new JTextField(10);  //設定運算式
    JTextField T3 = new JTextField(10);  //擷取輸入答案
    JTextField T4 = new JTextField(10);//存放答案提示
    JButton B1 = new JButton("确定");
    JButton B2 = new JButton("下一題");

    Frame() {
        T=new JTextField(10);//計時
        T.setEditable(false);
        time = new Timer(1000, this);
        time.start();
        T.setText(setTime(t1));
        this.setTitle("四則運算");
        this.setSize(280, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JPanel p2 = new JPanel();
        JPanel p1 = new JPanel();
        p2.add(L1);
        p2.add(T1);
        p2.add(B3);
        p2.add(T2);
        p2.add(T3);
        p2.add(T4);
        p2.add(T);
        p1.add(B1);
        p1.add(B2);
        add(p2, "Center");
        add(p1, "South");
        
        B3.addActionListener(new ActionListener() {           //按鈕B3表示開始
            public void actionPerformed(ActionEvent e) {
                boolean flag=false;
                Object bj = e.getSource(); // 獲得事件源
                if (bj == B3) {
                    try{  //如果輸入字元,抛出異常,提示錯誤
                    count = Integer.parseInt(T1.getText());  //将文本中擷取的字元串轉換為整型
                    }
                    catch(Exception f)
                    {
                        flag=true;
                    }
                    if(flag)
                    {
                        JOptionPane.showMessageDialog(null,"輸入有誤,請輸入數字!");
                    }
                    if(count>5)
                    {
                        JOptionPane.showMessageDialog(null, "題目個數不能超過五個!請重新輸入。");
                    }
                    if(count<=5)
                    {
                    num = (int) (Math.random() * 5);
                    a = (int) (Math.random() * 200) - 100;
                    b = (int) (Math.random() * 200) - 100;
                    if (num == 0)//num為0時,是加法運算
                    {
                        if (a < 0 && b < 0)       //判斷a,b的正負并給負數加括号
                        {
                            T2.setText("(" + a + ")" + "+(" + b + ")=");
                        } 
                        else if (a < 0 && b > 0)
                        {
                            T2.setText("(" + a + ")" + "+" + b + "=");
                        } 
                        else if (a > 0 && b < 0)
                        {
                            T2.setText(a + "+(" + b + ")=");
                        } 
                        else
                        {
                            T2.setText(a + "+" + b + "=");
                        }
                        c = a + b;
                                              //處理按鈕監聽事件
                        
                    } else if (num == 1)  //num為1表示減法運算
                    {
                        if (a < 0 && b < 0)
                        {
                            T2.setText("(" + a + ")" + "-(" + b + ")=");
                        } 
                        else if (a < 0 && b > 0)
                        {
                            T2.setText("(" + a + ")" + "-" + b + "=");
                        } 
                        else if (a > 0 && b < 0) 
                        {
                            T2.setText(a + "-(" + b + ")=");
                        }
                        else 
                        {
                            T2.setText(a + "-" + b + "=");
                        }
                        c = a - b;
                        
                    } else if (num == 2) {   //num為2表示乘法運算
                        if (a < 0 && b < 0) {
                            T2.setText("(" + a + ")" + "*(" + b + ")=");

                        } else if (a < 0 && b > 0) {
                            T2.setText("(" + a + ")" + "*" + b + "=");

                        } else if (a > 0 && b < 0) {
                            T2.setText(a + "*(" + b + ")=");

                        } else {
                            T2.setText(a + "*" + b + "=");

                        }
                        c = a * b;
                    }
                     else if (num == 3&&b!=0) {   //num為3表示除法運算,并且要考慮除數不能為0的情況,是以b!=0
                            if (a < 0 && b< 0) {
                                T2.setText("(" + a + ")" + "/(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "/" + b + "=");

                            } else if (a > 0 && b< 0) {
                                T2.setText(a + "/(" + b + ")=");

                            } else {
                                T2.setText(a + "/" + b + "=");

                            }
                            d= (float)a/(float)b;  //将整型a,b強制轉換為浮點型,保證結果正确
                            BigDecimal bg = new BigDecimal(d);   //将除法結果保留小數點後兩位
                            d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                        }
                     else
                     {
                         a=(int)(Math.random()*10);
                         T2.setText(a+"!=");
                         int i;
                         if(a==0||a==1)
                         {
                             s=1;
                         }
                         else
                         {
                         
                         for(i=1;i<=a;i++)//計算階乘
                         {
                             s=s*i;
                         }
                         }
                     }

                }
            }
            }
        });    
        B2.addActionListener(new ActionListener() {           //B2表示下一題
            public void actionPerformed(ActionEvent e) {
                Object bj = e.getSource(); // 獲得事件源
                if (bj == B2) {
                    int a, b, num, i = 1;
                    if (i < count) {   
                        T3.setText(null);//當按鈕按下一題時就将T3與T4的内容更新
                        T4.setText(null);
                        num = (int) (Math.random() * 5);
                        a = (int) (Math.random() * 200) - 100;
                        b = (int) (Math.random() * 200) - 100;
                        i++;
                        if (num == 0) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "+(" + b + ")=");
                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "+" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "+(" + b + ")=");
                            } else {
                                T2.setText(a + "+" + b + "=");
                            }
                            c = a + b;
                        } else if (num == 1) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "-(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "-" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "-(" + b + ")=");
                            } else {
                                T2.setText(a + "-" + b + "=");
                            }
                            c = a - b;

                        } else if (num == 2) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "*(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "*" + b + "=");

                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "*(" + b + ")=");

                            } else {
                                T2.setText(a + "*" + b + "=");

                            }
                            c = a * b;


                        }
                        else if (num == 3&&b!=0) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "/(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "/" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "/(" + b + ")=");
                            } else {
                                T2.setText(a + "/" + b + "=");
                            }
                            d= (float)a/(float)b;
                            BigDecimal bg = new BigDecimal(d);
                            d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                            

                        }
                        else
                         {
                             a=(int)(Math.random()*10);
                             T2.setText(a+"!=");
                             if(a==0||a==1)
                             {
                                 s=1;
                             }
                             else
                             {
                             
                             for(i=1;i<=a;i++)//計算階乘
                             {
                                 s=s*i;
                             }
                             }
                         }
                        
                        counter++;
                        if(counter>=count)//判斷題目是否答完,答完了就彈出一個提示題目答完并給出答題時間的對話框
                        {
                            JOptionPane.showMessageDialog(null, "題目已答完,答對了"+t+"道題,答錯了"+f+"道題\n\n總分是"+sum+"\n\n總用時為:"+t1+"秒");
                        }
                    }
                }
            }
        });
        B1.addActionListener(new ActionListener() {        //按鈕B1表示确定
            public void actionPerformed(ActionEvent e) {
                Object bj = e.getSource();     // 獲得事件源
                if (bj == B1) {
                    if (d1== Float.parseFloat(T3.getText()) || c == Float.parseFloat(T3.getText()) || s ==Float.parseFloat(T3.getText())) {
                        T4.setText("恭喜你,答對了");
                        t=t+1;
                        sum=sum+20;//每答對一題加20分
                    } else {
                        T4.setText("抱歉,你答錯了");
                        f=f+1;
                    }
                }
            }
        });

    }
    public void actionPerformed(ActionEvent e) {  
        t1= t1 + 1;            //累加時間
        T.setText(setTime(t1));
        
    }
    public String setTime(int t1) {//累加時間
        int hour, minute, second, a;
        String mytimer, strsec, strmin, strhour;
        t1=t1 % (60 * 60 * 24);
        second = t1 % 60;
        a = t1/ 60;
        minute = a % 60;

        hour = a / 60;
        if (second <= 9) {
            strsec = "0" + String.valueOf(second);
        } else {
            strsec = String.valueOf(second);
        }
        if (minute <= 9) {
            strmin = "0" + String.valueOf(minute);
        } else {
            strmin = String.valueOf(minute);
        }
        if (hour <= 9) {
            strhour = "0" + String.valueOf(hour);
        } else {
            strhour = String.valueOf(hour);
        }
        mytimer = "計時: " + strhour + ":" + strmin + ":" + strsec;
        return mytimer;
    }



}
           

四、程式運作

結對程式設計1
結對程式設計1
結對程式設計1
結對程式設計1

  優化添加功能:

結對程式設計1
結對程式設計1
結對程式設計1
結對程式設計1
結對程式設計1

五、PSP表格

PSP2.1 Personal Software Process Stages Time (%) Senior Student(/hour) Time (%)(/hour)
· Planning 計劃 2 1
· Estimate 估計這個任務需要多少時間 15 13
· Analysis 需求分析 (包括學習新技術) 1.5
· Coding Standard 代碼規範 0.5
· Design 具體設計
· Coding 具體編碼 10 7
· Test 測試(自我測試,修改代碼,送出修改)
Reporting 報告

六、小結感受

  我們兩個人經過反複商讨和修改,将之前的代碼進行了優化。在這個過程中,我們輪流扮演了領航員與駕駛員的角色。因為設計圖形界面,各個部分都要用圖形來展示,之前的拆分太細,并不利于界面展示,而且功能要與界面相聯系,是以我們對代碼進行了很大的改動。在這期間,我們都提出了很多想法,相當于又重新做了個四則運算生成器。雖然做的還算是比較基礎的圖形界面,但是我們都收獲很多,對以往并不熟練的圖形界面設計進行了鞏固,非常開心。

  由于時間的問題,暫時沒有實作英文切換,但是我們已經向别的組學習如何實作,我們會對我們的代碼持續的進行優化。

  (現在已經優化完畢,實作了中英切換功能,)

七、附錄

 附1.碼雲位址

 附2.小組程式設計過程的照片

結對程式設計1