1. 程式人生 > >軟件工程網絡15結對編程作業(201521123115)

軟件工程網絡15結對編程作業(201521123115)

logs git 應用 down 正確答案 alt 程序 img set

結對編程

改進現有代碼2

團隊成員:
梁林 201521123119 碼雲地址:https://gitee.com/ll119
龔廈彬 201521123115 碼雲地址:https://gitee.com/handsomecat/events

clone項目,在開發環境中運行該應用程序,修改完畢最後上傳至碼雲,並在博客中給出鏈接

技術分享圖片

檢查大部分主要類之間的關系,畫出類圖

技術分享圖片

核心代碼展示

private static int GCD(int m, int n) {//最大公約數
        // TODO Auto-generated method stub
        while (true) {
            if ((m = m % n) == 0)
            return n;
            if ((n = n % m) == 0)
            return m;
            }
    }
    
    public static int LCM(int m, int n) {  //求最小公倍數
        return m*n/GCD(m,n);
        }
    
    public static int[] createFraction(){  //隨機組成真分母
        int[] fraction=new int[2];
        int fraction1 = (int)(Math.random()*10+1);//避免分子出現零
        int fraction2 = (int)(Math.random()*10+1);//避免分母出現零
        if(fraction1!=fraction2){            //避免出現分子分母相同
            if(fraction1<fraction2){        //避免出現假分數
                fraction[0]=fraction1;
                fraction[1]=fraction2;  
                return fraction;
            }else{
                fraction[0]=fraction2; 
                fraction[1]=fraction1;  
                return fraction;
            }
        }else  
            createFraction(); 
        return fraction;
        
    }
    
    public main()//計算四則運算並輸出
    {
        new Thread(myTimeRunable).start();
        int n = 0;
        MainFrame ma= new MainFrame();
        int m = (int)(Math.random()*n+1);//隨機整數題目和分數題目的題量
        
        try{
            //調用初始化方法
            jbInit();
        }
        catch(Exception exception){
            exception.printStackTrace();
        }
    
        try{
            
            n= Integer.parseInt(ma.number);
            }catch(NumberFormatException e){
                //利用消息對話框提示輸入失敗
                JOptionPane.showMessageDialog(this,"輸入錯誤!請重新輸入");
                }

        for(int j=0;j<(n-m);j++){//整數題目
           String ans;
           int op=(int)(Math.random()*5+1);//隨機選擇計算符
           int num1=(int)(Math.random()*10+1);//隨機兩個整數
           int num2=(int)(Math.random()*10+1);
               if(op==1){//加法
                 Question.add(num1+"+"+num2+"="); 
                 Answer.add(num1+num2+"");
              }
               if(op==2){//減法,防止出現負數
                   if(num1>num2){
                     Question.add(num1+"-"+num2+"="); 
                     Answer.add(num1-num2+"");
                  }
               else{
                  Question.add(num2+"-"+num1+"="); 
                 Answer.add(num2-num1+"");
               }
               }
               if(op==3){//乘法
                 Question.add(num1+"*"+num2+"="); 
                 Answer.add(num1*num2+"");
        }
               if(op==4){//除法
                 Question.add(num1+"÷"+num2+"=");
                 if(num1%num2==0){ 
                    Answer.add(num1/num2+"");
                
                 }else{
                     int num3=GCD(num1,num2);
                     num1=num1/num3;
                     num2=num2/num3;
                     String a = num1+"/"+num2;
                     Answer.add(a+"");
                 }
               }
              if(op==5) {//乘方
                 Question.add(num1+"^"+num2+"=");
                 Answer.add(Math.pow(num1,num2)+"");

               
        }
        }
        
        for(int j=0;j<m;j++){//分數題目
               Scanner in = new Scanner(System.in);//真分數的計算
               int op=(int)(Math.random()*4+1);
               int[] f1 =createFraction();
               int[] f2 =createFraction();
               int j1=GCD(f1[0],f1[1]);
               f1[0]=f1[0]/j1;//化簡分數
               f1[1]=f1[1]/j1;
               j1=GCD(f2[0],f2[1]);
               f2[0]=f2[0]/j1;
               f2[1]=f2[1]/j1;
               int gbs = LCM(f1[1],f2[1]);
                  
             if(op==1){//加法
                  Question.add("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")="); 
                  int num1=f1[0]*f2[1]+f2[0]*f1[1];
                  int num2=f1[1]*f2[1];
                  int num3=GCD(num1,num2);
                  num1=num1/num3;
                  num2=num2/num3;
                  String a=new String();
                  if(num1==num2)
                    {
                        a="1";
                    }
                    else
                    {
                        a=num1+"/"+num2;
                    }
                  Answer.add(a+"");
                   
              }
               if(op==2){//減法
                   int num1=f1[0]*f2[1]-f2[0]*f1[1];
                   if(num1>0){  //防止出現負數 
                     Question.add("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")="); 
                     int num2=f1[1]*f2[1];
                     String a=new String();
                     if(num1==0)
                        {
                            a="0";
                        }
                        else
                        {
                        int num3=Math.abs(GCD(num1,num2));
                        num1=num1/num3;
                        num2=num2/num3;
                        if(num1==num2)
                        {
                            a="1";
                        }
                        else
                        {
                            a=num1+"/"+num2;
                        }
                        }
                     Answer.add(a+"");
               }else{
                   Question.add("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")="); 
                     int num11=f2[0]*f1[1]-f1[0]*f2[1];
                     int num2=f1[1]*f2[1];
                     String a=new String();
                     if(num11==0)
                        {
                            a="0";
                        }
                        else
                        {
                        int num3=Math.abs(GCD(num11,num2));
                        num11=num11/num3;
                        num2=num2/num3;
                        if(num11==num2)
                        {
                            a="1";
                        }
                        else
                        {
                            a=num11+"/"+num2;
                        }
                        }
                      Answer.add(a+"");
               }
                  }
              if(op==3){//乘法
                     Question.add("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")="); 
                     int num1= f1[0]*f2[0]; 
                     int num2 = f1[1]*f2[1];
                     int num3=GCD(num1,num2);
                     String a=new String();
                     num1= num1/num3; 
                     num2 = num2/num3;
                  if(num1==num2)
                        {
                            a="1";
                        }
                        else
                        {
                            a=num1+"/"+num2;
                        }
                     Answer.add(a+"");  
                  }
              if(op==4){//除法
                     Question.add("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")="); 
                     int num1= f1[0]*f2[1]; 
                     int num2 = f1[1]*f2[0];
                     int num3=GCD(num1,num2);
                     String a=new String();
                     num1= num1/num3; 
                     num2 = num2/num3;
                     if(num1==num2)
                        {
                            a="1";
                        }
                        else
                        {
                            a=num1+"/"+num2;
                        }
                     Answer.add(a+"");  
              }
        }
        
        //輸出題目
        JTextArea0.setText("");
        for(String string : Question){
            num ++;
            JTextArea0.append("("+num+")、"+string+"\n");
        }
    }

    //計時器
     private class MyRunable implements Runnable{
            private int hour = 0;
            private int min = 0;
            private int sec = 0;
            private NumberFormat format = NumberFormat.getInstance();
            private String nextSecond(){
                ++sec;
                if(sec == 60) {
                    ++min;
                    sec = 0;
                }
                 
                if(min == 60) {
                    ++hour;
                    min = 0;
                }
                return currentTime();
            }
             
            private String currentTime(){
                return format.format(hour)+":"+format.format(min)+":"+format.format(sec);
            }
             
            @Override
            public void run() {
                format.setMinimumIntegerDigits(2);
                format.setGroupingUsed(false);
                while(true) {
                    if(rootPaneCheckingEnabled) {
                        if(isRun) {
                            nextSecond();
                            jLabel4.setText(currentTime());
                        }
                    }
                    try {
                        Thread.sleep(1000);
                    }catch (InterruptedException e) {
                    }
                }
            }
             
        }
    @Override
    //菜單項事件對應的處理方法
    public void actionPerformed(ActionEvent e) {
                 // TODO Auto-generated method stub
                //點擊“系統”菜單下的“退出”菜單項
                if(e.getSource()==jButton0)
                {
                    int num1=0;
                    JTextArea2.setText("");
                    for(String string : Answer){//輸出正確答案
                        num1 ++;
                        JTextArea2.append("("+num1+")、"+string+"\n");
                    }
                    
                    //獲取答案並對比得正確率
                         String[] ans =  JTextArea1.getText().split("\n");
                            for(int i = 0;i < ans.length;i++){
                                answer.add(ans[i]+"");
                            }
                             for(String str:answer)  
                             {  
                                 if(Answer.contains(str))  
                                 {  
                                    right++;
                                 }  
                             }
                        
                    int sum;
                    sum=right*100/num1;
                    JTextArea3.append(sum+"%");
                    isRun = false;
                }
                //計時開始
                if(e.getSource()==jButton2)
                {
                     isRun = true;
                }
                //繼續做題
                if(e.getSource()==jButton1)
                {
                    MainFrame MF=new MainFrame();
                    //移除主框架上原有的內容
                    this.remove(this.getRootPane());
                    this.dispose();
                    MF.setVisible(true);
                }
    }

需求分析:針對現有代碼的改進分析,新開發功能的分析。

針對現有代碼出現的種種bug進行改進,例如正確率不會重新清零,且有時比對答案不正確正確率錯誤,所有文本框中內容均可自己修改,開始界面捕捉異常失敗。

代碼規範

代碼風格的原則是:簡明,易讀,無二義性。
縮進用四個空格
行寬100字符
在復雜的條件表達式中,用括號清楚地表示邏輯優先級。
斷行時每個“{”和“}”都獨占一行。
分行不把多行語句放在一行上。
命名采用“匈牙利命名法”。
下劃線用來分隔變量名字中的作用域標註和變量的語義。
所有的類型/類/函數名都用Pascal形式,所有的變量都用Camel形式。
復雜的註釋應該放在函數頭,註釋(包括所有源代碼)只用ASCII字符,不用中文或其他特殊字符。

團隊討論照片

技術分享圖片

瀏覽所有代碼考慮代碼質量和測試覆蓋率

技術分享圖片

運行測試

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

PSP表格

技術分享圖片

小結感受:這次結對編程比較趕,兩個人的基礎不行,代碼都不能完完全全的看懂,只能是在其上面稍作修改,還要繼續自學java下去才能慢慢跟上來。

軟件工程網絡15結對編程作業(201521123115)