20175212童皓楨 結對編程項目-四則運算 第二週

20175212童皓楨 結對編程項目-四則運算 第二週

需求分析

  • 實現一個命令行程序,要求自動生成小學四則運算題目(加減乘除)
  • 支持多運算符
  • 測試結果的正確性,用戶輸入錯誤時給出正解
  • 實現真分數運算
  • 在不須要真分數運算時,將結果整除
  • 統計題目正確率
  • 生成題目輸出到文件javascript

  • 從文件寫入html

設計思路

  • 首先要可以按照按人的通常習慣,生成自左向右計算的加減乘除算式。
  • 隨機生成多運算符,並隨機生成相對應個數的整數
  • 利用eval方法直接計算隨機生成的算式的值,並和用戶的輸入做比較
  • 將人計算真分數時的通分,約分方法描述成機器語言
  • 在不須要真分數運算時,將結果整除
  • 判斷正確率
  • 生成題目至文件
  • 設計測試類,利用JUnit測試各狀況下的的四則運算

UML類圖

輸入圖片說明

關鍵代碼

  • 如何生成符合要求格式的運算式
for (i = 0; i < n; i++) {
            int a = random.nextInt(5) + 1;//1-5個運算符
            int[] number = new int[a + 1];//建立一個number數組
            String ex = new String();
            for (int j = 0; j <= a; j++) {//生產a+1個數字,即2-6個數字
                number[j] = random.nextInt(100) + 1;//生成1-100的整數
            }
            for (int j = 0; j < a; j++) {
                int s = random.nextInt(4);//隨機生成運算符下標
                ex += String.valueOf(number[j]) + String.valueOf(op[s]);//添加一對數字和運算符

            }
            ex += String.valueOf(number[a]);//在尾端補上一個數字
            System.out.println(ex + "=");
  • 如何驗證用戶輸入答案的正誤
int ua = reader.nextInt();//用戶輸入答案

            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine se1 = manager.getEngineByName("js");
            ScriptEngine se2 = manager.getEngineByName("js");
            String str=ex+"="+"="+ua;//將用戶答案邏輯式放在字符串str中
            Boolean result =(Boolean)se1.eval(str);//用eval方法計算用戶答案邏輯式
            String ca="="+se2.eval(ex);//生成correct_answer字符串存正確答案
            jud.judgeFormula(result,ca);
  • 如何進行真分數的加減乘運算
if(s==2){//計算真分數乘法運算
                int nu[]=new int[2];
                nu[0]=num[0]*num[2];
                nu[1]=num[1]*num[3];
                ca=ex+f.yuefen(nu[0],nu[1]);//將計算結果約分
            }
            else if(s==0){//計算真分數加法運算
                int nu_1[]=new int[2];
                nu_1[0]= num[0]*num[3]+num[1]*num[2];
                nu_1[1]= num[1]*num[3];
                ca=ex+f.yuefen(nu_1[0],nu_1[1]);
            }
            else {//計算真分數減法運算
                int nu_2[]=new int[2];
                nu_2[0]= num[0]*num[3]-num[1]*num[2];
                nu_2[1]= num[1]*num[3];
                if(nu_2[0]<0){//分子爲負數時
                    nu_2[0]=-nu_2[0];//取反
                    ca=ex+"-"+f.yuefen(nu_2[0],nu_2[1]);//加上負號
                }
                else
                    ca=ex+f.yuefen(nu_2[0],nu_2[1]);
            }
  • 如何對分數計算結果進行約分
public String yuefen(int m,int n){//分數約分
        FundCalculate f=new FundCalculate();
        int temp=f.gcd(m,n);
        m/=temp;
        n/=temp;
        String ca=String.valueOf(m)+"/"+String.valueOf(n);
        return ca;
    }
  • 如何在非真分數狀況下構造算式整除
public int decide(int x,int y){//判斷是否整除
        Random random=new Random();
        if(x%y!=0){
            y=random.nextInt(100)+1;
            return decide(x,y);
        }
        else{
            return y;
        }
    }
for (int j = 0; j < a; j++) {
                    switch(flag){
                        case 0:
                            s[0]= random.nextInt(4);//隨機生成運算符下標
                            ex += String.valueOf(number[j]) + String.valueOf(op[s[0]]);//添加一對數字和運算符
                            if(s[0]==3){number[j+1]=f.decide(number[j],number[j+1]);}
                            break;
                        case 1:
                            s[1]= random.nextInt(4);//隨機生成運算符下標
                            ex+="("+String.valueOf(number[j]) + String.valueOf(op[s[1]]);//添加左括號和數字和運算符
                            if(s[1]==3){number[j+1]=f.decide(number[j],number[j+1]);}
                            flag++;
                            break;
                        case 2:
                            s[2]=random.nextInt(4);
                            ex+=String.valueOf(number[j]) + ")"+String.valueOf(op[s[2]]);//添加右括號和數字和運算符
                            if(s[2]==3){
                                switch(s[1]){//區分以前括號裏運算結果對後面數取整
                                    case 0:
                                        number[j+1]=f.decide(number[j]+number[j-1],number[j+1]);
                                        break;
                                    case 1:
                                        number[j+1]=f.decide(number[j]-number[j-1],number[j+1]);
                                        break;
                                    case 2:
                                        number[j+1]=f.decide(number[j]*number[j-1],number[j+1]);
                                        break;
                                    case 3:
                                        number[j+1]=f.decide(number[j]/number[j-1],number[j+1]);
                                        break;
                                    default:;
                                }
                            }
  • 如何在文件中輸入輸出
import java.io.*;

public class WAndRFile {
    String ua=new String();//用戶答案
    public void writeToFile(String str){
        File fw=new File("practice.txt");//寫入的文件
        try{
            Writer out=new FileWriter(fw);//指向目的地輸出流
            BufferedWriter bw=new BufferedWriter(out);
            bw.write(str);//寫入字符串str
            bw.newLine();//換行
            bw.close();//高級流關閉
            out.close();//關閉底層流
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
    public String readFromFile(){
        File fr=new File("practice.txt");//讀取的文件
        try{
            Reader in=new FileReader(fr);//指向源的輸入流
            BufferedReader br=new BufferedReader(in);
            while (br.readLine()!=null)
                ua=br.readLine();
            br.close();
            in.close();;
        }
        catch (IOException e){
            e.printStackTrace();
        }
        return ua;
    }
}

Junit測試

輸入圖片說明

輸入圖片說明

運行結果截圖

  • 含真分數
    輸入圖片說明java

  • 不含真分數git

輸入圖片說明

  • 輸出到文件

輸入圖片說明

代碼託管地址

https://gitee.com/thz666/20175212_tong_haozhen/tree/master/src/四則運算編程

遇到的困難及解決辦法

  • 問題一:真分數計算時,當結果爲負數,輸入的答案和「正確答案」時常不符,如輸入-4/3,「正確答案」爲4/-3.
  • 解決方法一:
if(nu_2[0]<0){//分子爲負數時
                    nu_2[0]=-nu_2[0];//取反
                    ca=ex+"-"+f.yuefen(nu_2[0],nu_2[1]);//加上負號
                }

從新構造答案結構,使其符合數學標準數組

  • 問題二:真分數答案沒有約分
  • 解決辦法:
Boolean result=ua.equals(ca);
            jud.judgeFormula(result,ca);

將上述代碼放在循環體中微信

  • 問題三:非真分數計算時會出現8位及以上小數
  • 解決辦法三:事先判斷是否整除,如
public int decide(int x,int y){//判斷是否整除
        Random random=new Random();
        if(x%y!=0){
            y=random.nextInt(100)+1;
            return decide(x,y);
        }
        else{
            return y;
        }
    }

結對總評及評價

  • 結對學習對於編而言的確是一個很好的方法。因特殊方法的緣由,咱們的程序編寫過程當中遇到了許多各式各樣的問題,大部分仍是超出了知識能力範圍,須要咱們摸索研究。很難想象沒有這樣一個好的結對夥伴,這個程序的實現將會有多大的難度!
  • 最後,我但願而且有信心,經過兩我的的結對將Java學習的熱情和儲備提高一個新的臺階。

結對照片

輸入圖片說明

PSP

PSP Personal Software Process Stages 預估耗時 實際耗時
Planning 計劃 30min 20min
Estimate 估計這個任務須要多少時間 10min 10min
Development 開發 10min 10min
Analysis 需求分析 (包括學習新技術) 40min 30min
Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 5min 10min
Design 具體設計 1h 1h
Coding 具體編碼 3h 4h
· Code Review 代碼複審 30min 30min
Test · 測試(自我測試,修改代碼,提交修改) 1h 1h
Test Report 測試報告 30min 30min
Size Measurement 計算工做量 10min 10min
Postmortem & Process Improvement Plan 過後總結, 並提出過程改進計劃 30min 30min
合計 7h35min 8h50min

參考和引用

相關文章
相關標籤/搜索