1. 程式人生 > >四則運算結對作業

四則運算結對作業

pub 人的 身體 cloc hang 數組 == new void

一、Coding.Net項目地址:

 https://git.coding.net/qiuyuwutong/Operation2.git

二、PSP表格

PSP2.1

任務內容

計劃共完成需要的時間(min)

實際完成需要的時間(min)

Planning

計劃

30

20

· Estimate

· 估計這個任務需要多少時間,並規劃大致工作步驟

30

20

Development

開發

960

940

· Analysis

· 需求分析 (包括學習新技術)

30

120

· Design Spec

· 生成設計文檔

30

50

· Design Review

· 設計復審 (和同事審核設計文檔)

30

20

· Coding Standard

· 代碼規範 (為目前的開發制定合適的規範)

10

10

· Design

· 具體設計

60

60

· Coding

· 具體編碼

600

500

· Code Review

· 代碼復審

100

60

· Test

· 測試(自我測試,修改代碼,提交修改)

100

120

Reporting

報告

100

190

· Test Report

· 測試報告

60

150

· Size Measurement

· 計算工作量

30

10

· Postmortem & Process Improvement Plan

· 事後總結, 並提出過程改進計劃

10

30

三、接口設計

  信息隱藏(Information Hiding)指在設計和確定模塊時,使得一個模塊內包含的特定信息(過程或數據),對於不需要這些信息的其他模塊來說,是不可訪問的。

   接口設計( Interface Design

  耦合性是指模塊間互相依賴的程度。松耦合(loose coupling)降低了不同模塊間的依賴程度

四、計算模塊接口的設計與實現過程

  (一)設計Create類

    通過調用Create類裏面的createExpression方法可以產生滿足條件的運算式

  (二)設計Calculate類

     用來計算運算式的值,其中JS裏面的eval()函數

五、計算模塊接口部分的性能改進

  Create.java

    問題一:是否產生括號

    設計思路:設計運算優先級,加減運算優先級小於乘除運算優先級,如果相鄰兩個運算符前面運算符優先級小於後面運算符的優先級,則在前面的運算式加上括號。代碼如下:

for(int j=1;j<=sumOfOperation-1;j++){
                //System.out.println(bracketExist);
                if(bracketExist&&priority(operatorCreate[j-1])<priority(operatorCreate[j])){
                    ex="("+ex+")"+operatorCreate[j]+String.valueOf(number[j+1]);
                }
                else{
                    ex+=operatorCreate[j]+String.valueOf(number[j+1]);
                }
                if(fractionExist(ex)){
                    break;
                }
            }

問題二:實現至少生成兩種運算符

        設計思路:要滿足生成兩種不同的運算符,只要讓後一個產生的運算符不等於前一個產生的運算符即可。代碼如下:

number[0] = random.nextInt(scope_Upper-scope_Lower+1)+scope_Lower;
            for (int j = 1; j <= sumOfOperation; j++) {
                number[j] = random.nextInt(scope_Upper-scope_Lower+1)+scope_Lower;
                while(number[j]==number[j-1])
                    number[j] = random.nextInt(scope_Upper-scope_Lower+1)+scope_Lower;
//                System.out.println(number[j]);
            }

     問題三:是否產生乘除

設計思路:運算符存放在一個數組char[] operator= new char[]{ ‘+‘ , ‘-‘ , ‘*‘ ,‘/‘ }裏,如果不產生乘除,隨機產生的運算符範圍在數組的前兩個元素;如果產生運算符,就讓隨機產生的運算符 範圍在整個數組。代碼如下:

for (int j = 0; j < sumOfOperation; j++) {
                int op=0;
                if(mul_Div)
                    op = random.nextInt(4);//是否有乘除法
                else
                    op = random.nextInt(2);
                operatorCreate[j]=operator[op];
            }

        問題四:是否在運算過程中產生分數

設計思路:在運算過程中判斷是否產生分數,如果產生分數,就讓其重新生成運算式。代碼如下:

public static boolean fractionExist(String ex)
    { 
        double answer = Double.parseDouble(Calculate.calculateExpression(ex));
        if(Math.floor(answer)!=answer||answer<0||answer>9999){
            return true;
        }else{
            return false;
        }
    }

   Command.java

      問題一:怎麽一次輸入多個命令行參數,而且參數的前後順序並非是固定的

        例如 java Command -m 1 50 -n 20 -c

        設計思路:通過for循環來遍歷命令行參數,通過switch語句來處理每次循環輸入的命令行參數。代碼如下:

for (int i = 0; i < args.length; i++) {
            switch(args[i]){
                case "-n"://題目的數量
                case "-N":

     這裏設置兩個case "-n",case "-N",來解決大小寫不區分這個問題。

 性能分析圖:

技術分享圖片

技術分享圖片

技術分享圖片

六、計算模塊部分單元測試展示

    測試輸入的參數是否合法時,預期值先給了一個合法值,再給一個非法值,分別進行測試。

  Command.Java

//測試輸入的參數是否合法
@Test()
public void testParameter1Error1(){
String ex ="-n";
assertEquals(true,new Command().parameter1Error(ex));
}
@Test()
public void testParameter1Error2(){
String ex ="-z";
assertEquals(false,new Command().parameter1Error(ex));
} 
//測試輸入的參數n是否合法
@Test
public void testScopeOfSumError1(){
int num=-1;
assertEquals(false, new Command().scopeOfSumError(num));
}
@Test
public void testScopeOfSumError2(){
int num=10;
assertEquals(true, new Command().scopeOfSumError(num));
}

    (一)parameter1Error函數

      作用:判斷輸入的參數是否是-n,-m等

public static boolean parameter1Error(String ex){
ArrayList<String> args = new ArrayList<String>(); 
args.add("-n");args.add("-N");
args.add("-m");args.add("-M");
args.add("-o");args.add("-O");
args.add("-c");args.add("-C");
args.add("-b");args.add("-B");
if(args.contains(ex)){
return true;
}
else{
return false;
}
} 

     (二)scopeOfSumError函數

            作用:測試輸入的參數-n是否合法。

public static boolean scopeOfSumError(int num){
if(num<=0||num>10000)
return false;
else{
return true;
}
}

  CalculateJava

    (一)calculateExpression函數

      作用:接收的是一個表達式,返回的是表達式的結果,以下是calculateExpression函數:

public static String calculateExpression(String ex){
try { 
return String.valueOf(engine.eval(ex));
} catch (ScriptException e) { 
e.printStackTrace();
return null; 
} 
}

            以下是calculateExpression函數的單元測試:

@Test
public void test() { 
String ex ="3*4-6/2"; 
assertEquals("9",new Calculate().calculateExpression(ex));
}

  測試覆蓋率截圖:

技術分享圖片

七、計算模塊部分異常處理說明

  (一) 判斷輸入的參數的格式是否正確

    比如,用戶輸入-z,-t等參數,就會提示用戶錯誤。

    如下圖所示:

技術分享圖片

    測試樣例:

技術分享圖片

  (二)判斷輸入的參數-n、-m的格式是否正確

    例如,輸入-n t就會報錯

    如下圖所示:

技術分享圖片

    測試樣例:

技術分享圖片

   (三)判斷參數n、m、o的參數範圍是否正確

    如下圖所示:

技術分享圖片

技術分享圖片

技術分享圖片

      測試樣例:

技術分享圖片

技術分享圖片

技術分享圖片

八、界面模塊的詳細設計過程

    界面分三個版塊,第一個版塊為出題,第二個版塊為答題,第三個版塊為答題結果。支持兩種語言,中文與English。用到的前端技術有HTML、CSS、JavaScript、bootstrap。

  (一)出題版塊:選用bootstrap框架

      點擊打印題目就跳轉到答題板塊

      

技術分享圖片

    

    (二)答題界面

      用js寫了計時器計時,答題結束後不歸0,便可方便的得知答題所用最終時間。界面如下圖所示:

技術分享圖片

    (三)答題結果

      顯示答對多少題和共答題多少

技術分享圖片

    代碼展示:

      1.中英文切換:

<select class="selectLanguage" class="form-control"   language=javascript onchange= " location.href=this.value">
 <option  value ="中文">中文</option>
 <option value="CalEnglish.html">English</option>
            </select>

技術分享圖片

      2.計時器:

        HTML代碼:

<ul style="position: absolute;bottom: 380px; left: 160px; list-style-type: none">            
                    
                            <input type="button" name="btn" class="btn-lg btn-info" onclick="startclock() "  value="開始答題">
                            <input type="button" name="btn" class="btn-lg btn-info" value="暫停答題" onclick="pauseclock()">
                            <input type="button" name="btn" class="btn-lg btn-info" onclick="stopclock()" value="停止答題">
                            <input class="btn"  name="showtime" style="color:#ff0000;width:200px;height: 48px;font-size: 20px;" id="showtime" type="text" value="0時0分0秒">
                    </ul>

        JS代碼:

<script language="javascript">
    var se,m=0,h=0,s=0,ss=1;
    function second(){
    if((ss%100)==0){s+=1;ss=1;}
    if(s>0 && (s%60)==0){m+=1;s=0;}
    if(m>0 && (m%60)==0){h+=1;m=0;}
    t=h+"時"+m+"分"+s+"秒"+ss+"毫秒";
    document.getElementById("showtime").value=t;
    ss+=1;
    document.getElementById("one").value=h;
    document.getElementById("two").value=m;
    document.getElementById("three").value=s;
}
function startclock(){se=setInterval("second()",10);}
function pauseclock(){clearInterval(se);}
function stopclock(){clearInterval(se);ss=1;m=h=s=0;}
</script>

九、界面模塊與計算模塊的對接

  在界面模塊我們用Form表單進行提交,將前臺接受到的參數傳到了Cal2.jsp,在這一界面我們調用在計算模塊的接口,循環生成給定數目的表達式,並讓用戶輸入自己計算的結果,然後當用戶點擊提交後,會在跳轉到realAnswer.jsp頁面,在這頁面會計算用戶答對的題數。 技術分享圖片 技術分享圖片

十、描述結對的過程

  我們兩個剛開始著手做項目的那個下午一起初步完成了計算模塊,之前兩個人的項目均沒有加上括號,一起通過學習加上了括號,但是當時沒有解決兩個問題。第一:不知如何設定是否有乘除法;第二、不知如何確保一次輸入多個參數,而且參數可以任意順序。最後解決了這個問題。具體解決方案前面有詳細說明,這裏不再贅述。第一天非常順利。

  第二天計劃完成異常處理模塊,但是卻花費了很長時間完善第一個計算模塊,之前大概實現了,但是有一些細節沒有考慮到(如參數的大小寫問題)。完善計算模塊後開始著手做異常模塊,但因為兩個人對異常都掌握的不太好,花費了很長時間學習自定義異常等等,最終完成了異常模塊。整體還算順利,耗費的時間主要是因為對異常的掌握程度不夠。

  第三天嘗試做單元測試,也比較順利,但是那時不明白對異常進行單元測試,請教了學姐之後解決了問題。當天,我們完成了前端界面的設計圖。

  完成了設計圖後,敲出了前臺界面,本以為一切很順利了,但是沒想到是更難的階段,前後端交互的時候遇到了很多問題。項目在兩個人的電腦上導過來導過去,就報了很多莫名其妙的錯誤,兩個人都重新配了好幾次環境。之後花了很多的時間調代碼,在完成後兩個人一起寫了博客,對這次的作業進行了總結。

十一、結對編程優缺點及個人優缺點

  (一)結對編程優點

    結對編程是兩個人的智慧,兩個人的思考,看待問題肯定會更全面一些。就例如我們,兩個人都沒有完成括號,兩個人在一起很容易就加上了括號。遇到Bug也沒有那麽恐懼,自己思考過後總習慣問一句:“**你怎麽看呢?”一般這種時候,我們總會想出一個比較完美的解決方案,然後非常非常開心,感覺解決一個Bug比自己純敲一段代碼都要快樂得多。

      兩個人在一起編程時有時候會避免一些低級錯誤,有時候可能只是因為字母打錯了,就導致工程止步不前,兩個人編程,加上眼鏡八只眼睛在盯著,避免犯一些低級錯誤。

    我們兩個每次一起編程最少在五個小時,一個人的精力是有限的,有時候編著編著就會特別累,這個時候就會換一下位置,讓自己的身體和大腦都有個緩沖。

  (二)結對編程缺點

      有時候對於同一個問題,我們有不同的思考,有時候就會有些分歧。編程習慣也有些不同,可能一個人習慣的編程方式恰好是另一個人最討厭的方式,不過總歸是要磨合的。

  (三)個人優缺點

    1、顏超一

        優點:認真,嚴謹,考慮全面,耐心,邏輯能力強

        缺點:太過於追求細節

       2、丁小帥

        優點:能吃苦、耐心、熱情、思考能力不錯

        缺點:不註重細節

     技術分享圖片

四則運算結對作業