20175217 結對編程項目-四則運算 總體總結

1、需求分析

1.基本需求

  • 隨機生成n道題目
  • 支持整數、分數,支持多運算符
  • 能判斷正誤,錯誤時給出正確答案
  • 能計算出正確率

2.擴展需求

  • 處理生成題目並輸出到文件
  • 完成題目後從文件讀入並判題
  • 支持多語言:簡體中文繁體中文English

2、設計思路

因爲上週已經把大的框架設計好了、也實現了整數運算。故本週的主要任務爲真分數的添加輸出題目到文件從文件讀取題目並判題多語言的實現Junit測試html

1.真分數的添加

  • 在生成題目時添加一種狀況:隨機插入真分數
  • 設計RandomFenshu類返回形式正確的真分數
  • 設計getRational類用於後綴轉結果計算時使用
  • 修改ZhongzhuiToHouzhuigetResult類,使其適配分數的計算

2.輸出題目到文件

  • 添加主類ShuChuTimu將隨機生成的題目輸出到文件

3.從文件讀取題目並判題

  • 修改主類sizeyunsuan使其能從文件中讀題、判題、並將結果輸出到另外一個文件

4.多語言的實現

  • 添加抽象類Language實現多語言

5.Junit測試

6.類圖

3、修改完善代碼的過程

1.題目輸出到文件階段

  • 由於上週剛學到文件這一塊,掌握還不是很熟練,嘗試了不少次都失敗後,上網查閱,使用PrintStream成功將題目寫入文件,但出現了以下的問題:

  • 仔細閱讀了程序,發現個人i是從0開始的,而字符串數組是從1開始的,又上網查閱了資料,換行符應表示爲\r\n,成功解決了問題。

2.從文件讀題並判題階段

  • 考慮使用FileInputStream輸入流指向最開始生成題目的文件,而後用InputStreamReader將字節流轉爲字符流,再用BufferReader添加輔助功能。
  • 使用StringTokenizer將公式以「:」和「=」分割,從而計算出結果。

3.添加真分數階段

  • 隨機生成公式中添加:用字符串的形式,添加不可約的真分數
    真分數的計算
  • 中綴轉後綴:因真分數的字符串長度爲3,故不能再用字符串名.split(" ")的方法,故考慮使用StringTokenizer將公式以空格分割開。

  • 後綴出結果:一樣使用StringTokenizer將公式以空格分開,帶真分數的計算考慮將全部的數都化爲分數進行計算,即計算時將出棧的兩元素都轉化爲getRational型,再進行計算,最後返回字符串型結果。java

  • 遇到的問題:沒有考慮分母爲1的狀況,後來修改程序得以解決。git

4.多語言實現階段

  • 考慮使用Language抽象類,用幾種語言繼承該抽象類實現多態
  • 添加ChooseLanguage類,進行語言的選擇與識別
  • 在讀題、判題過程當中考慮直接識別文件中的語言進行語言肯定,但進行語言對比調用equals時發現比較產生異常,所以將字符串轉爲字符數組,進行比較,解決了問題~

5.Junit測試階段

  • 剛開始這裏選錯了,一直顯示錯誤

  • 後來修正了錯誤後,測試成功

4、核心代碼解釋

  • 生成隨機數代碼:
import java.util.*;
import java.lang.*;
public class getRandom {
String s;
String str[]=new String[100];
char a,b; //a:插入的數字,b:插入的符號
int x; //x:插入符號的個數
char flag1,flag3;   //flag1:左括號,flag3:右括號
int flag2=0,flag4=0; //flag2:插入左括號的個數,flag4:控制不連續插入左右括號
public void storeRandom(int n) {
    for(int i=1;i<=n;i++) {     //存儲隨機生成的的每一個公式
        s="";
        x=(int)(Math.random()*6)+3;
        Random r3=new RandomFuhao();
        flag1=r3.getRandom();
        for(int j=1;j<=x;j++) {    //依次插入數字、公式
            Random r1=new RandomNum();
            a=r1.getRandom();
            s=s+(int)a+" ";
            if(flag2>0&&flag4==0) {
                Random r6=new RandomFuhao();
                flag3=r6.getRandom();
                if(flag3=='#') {
                    s=s+')'+" ";
                    flag2--;
                }
            }
            flag4=0;
            Random r2=new RandomChar();
            b=r2.getRandom();
            s=s+b+" ";
            Random r4=new RandomFuhao();
            flag1=r4.getRandom();
            if(flag1=='#'&&j<x-1) {
                s=s+'('+" ";
                flag2++;
                flag4=1;
            }
        }
        RandomFuhao r7=new RandomFuhao();
        if (r7.getRandom()=='#') {                //控制隨機插入分數
            Random r5 = new RandomNum();
            s = s + (int) r5.getRandom() + " ";
        }
        else {
            RandomFenshu f=new RandomFenshu();
            s=s+f.getFenshu()+" ";
        }
        while(flag2!=0) {
            s=s+")"+" ";
            flag2--;
        }
        str[i]=s;
    }
}
public String[] retRandom() {
    return str;
}   //返回隨機生成的公式
}
  • 輸出題目到文件:
import javax.imageio.IIOException;
import java.io.*;
import java.util.*;
public class ShuchuTimu {
    public static void main(String[] args) throws FileNotFoundException{
        getRandom g=new getRandom();
        String string[];
        ChooseLanguage c=new ChooseLanguage();
        Language l;
        l=c.choose();
        System.out.println(l.getGeshu());
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        g.storeRandom(n);
        string=g.retRandom();
        PrintStream ps = new PrintStream("Exercises.txt");
        for (int i=0;i<n;i++){
            String s = l.getTimi() + (i+1) + ":" + string[i+1] + "\r\n";
            System.out.println(s);
            ps.append(s);
        }
        ps.close();
        ps.flush();
    }
}
  • 後綴出結果
import java.util.*;
import java.lang.*;
public class getResult {
public String getResult(String s){
    Stack<String> stack=new Stack<String>();   //新建棧
    String a,b;
    StringTokenizer t=new StringTokenizer(s);
    while (t.hasMoreTokens()){     //依次遍歷元素,計算結果
        String c=t.nextToken();
        if (c.equals("+") || c.equals("-") || c.equals("*") || c.equals("÷")){    //遇到符號,彈出棧頂兩個元素,並計算結果
            a=stack.pop();
            b=stack.pop();
            getRational g1=rational(a);
            getRational g2=rational(b);
            stack.push(jisuan(g2,g1,c));      //將計算後的結果從新壓入棧中
        }
        else {       //遇到數字,直接入棧
            stack.push(c);
        }
    }
    String p=stack.pop();
    StringTokenizer t2=new StringTokenizer(p,"/");
    String token1=t2.nextToken();
    String token2=t2.nextToken();
    if (token2.equals("1"))
        return token1;
    else
        return p;
}
public getRational rational(String a){
    int i1,i2;
    StringTokenizer t1=new StringTokenizer(a,"/");
    String s1=t1.nextToken();
    String s2;
    if (t1.hasMoreTokens()){
        s2=t1.nextToken();
        i1=Integer.parseInt(s1);
        i2=Integer.parseInt(s2);
        getRational g1=new getRational(i1,i2);
        return g1;
    }
    else {
        i1=Integer.parseInt(s1);
        i2=1;
        getRational g2=new getRational(i1,i2);
        return g2;
    }
}
public String jisuan(getRational r1,getRational r2,String c){    //計算結果
    getRational g=new getRational(0,1);
    if (c.equals("+"))
        g=r1.add(r2);
    else if (c.equals("-"))
        g=r1.sub(r2);
    else if (c.equals("*"))
        g=r1.muti(r2);
    else
        g=r1.div(r2);
    return g.getNumerator()+"/"+g.getDenominator();
}
}
  • 從文件讀題、判題
import java.io.*;
import java.util.*;
public class sizeyunsuan {
    public static void main(String args[]) throws IOException{
        ZhongzhuiToHouzhui z=new ZhongzhuiToHouzhui();
        getResult r=new getResult();
        FileInputStream fis = new FileInputStream("Exercises.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader in = new BufferedReader(isr);
        Language l;
        ChooseLanguage recognizeLanguage=new ChooseLanguage();
        String s1,s2,s3,s4;
        String str,str1,str2;
        String s;
        String result=null;
        int count=0,n=0;
        PrintStream ps=new PrintStream("Result.txt");
        while ((str=in.readLine())!=null){
            StringTokenizer t1=new StringTokenizer(str,":");
            s1=t1.nextToken();
            l=recognizeLanguage.recognize(s1,n+1);
            s2=t1.nextToken();
            StringTokenizer t2=new StringTokenizer(s2,"=");
            s3=t2.nextToken();
            s4=t2.nextToken();
            s=z.result(s3);
            result=r.getResult(s);
            if (s4.equals(result)){
                str1=l.right();
                count++;
            }
            else
                str1=l.wrong()+result;
            n++;
            str2=str+"\r\n"+str1+"\r\n";
            ps.append(str2);
        }
        FileInputStream fis0 = new FileInputStream("Result.txt");
        InputStreamReader isr0 = new InputStreamReader(fis0);
        BufferedReader in0 = new BufferedReader(isr0);
        str=in0.readLine();
        StringTokenizer t3=new StringTokenizer(str,":");
        s1=t3.nextToken();
        l=recognizeLanguage.recognize(s1,1);
        str2=l.wancheng1()+n+l.wancheng2()+((double)count/n)*100+"%";
        ps.append(str2);
        System.out.println(str2);
    }
}

5、運行結果

6、碼雲託管地址

7、對結對的小夥伴進行評價

  • 我在本週的結對中繼續扮演領航員的角色,負責編寫代碼。小夥伴扮演領航員的角色,在我遇到問題時給我提供解決思路。我以爲本身編程老是很自閉,而又小夥伴就不同了,會給你帶來思路,就算也許一時半會也解決不了問題,但也會給你精神上的幫助,最少不會讓你那麼自閉。

8、總結

  • 在本次的結對過程當中,我不只學到了不少東西、提升了編程水平,還提升了合做能力,收穫滿滿~

9、預估與實際

Planning 計劃 預估耗時(分鐘) 實際耗時
Estimate 預估這個任務須要多長時間 1110 1580
Development 開發
Analysis 需求分析(包括學習新技術) 40 90
Design Spec 生成設計文檔 30 30
Design Review 設計複審 60 60
Coding Standard 代碼規範(爲目前的開發制定合適的規範) 40 40
Design 具體設計 70 70
Coding 具體編碼 700 1100
Code Review 代碼複審 60 60
Test 測試(自我測試、修改代碼、提交修改) 40 60
Reporting 報告
Test Report 測試報告 20 20
Size Measurement 計算工做量 10 10
Postmortem&Process Improvement Plan 過後總結並提出改進計劃 40 40
合計 1110 1580

10、參考

相關文章
相關標籤/搜索