java實現自動生成小學四則運算——朱庭震,詹祺豪
組員:朱庭震,詹祺豪
Github地址:https://github.com/ztz1998/second/tree/master
1題目:實現一個自動生成小學四則運算題目的命令行程序。
2說明:
自然數:0, 1, 2, …。
- 真分數:1/2, 1/3, 2/3, 1/4, 1’1/2, …。
- 運算符:+, ?, ×, ÷。
- 括號:(, )。
- 等號:=。
- 分隔符:空格(用於四則運算符和等號前後)。
- 算術表達式:e = n | e1 + e2 | e1 ? e2 | e1 × e2 | e1 ÷ e2 | (e),其中e, e1和e2為表達式,n為自然數或真分數。
- 四則運算題目:e = ,其中e為算術表達式。
3需求:
1. 使用 -n 參數控制生成題目的個數,例如
Myapp.exe -n 10
將生成10個題目。
2. 使用 -r 參數控制題目中數值(自然數、真分數和真分數分母)的範圍,例如
Myapp.exe -r 10
將生成10以內(不包括10)的四則運算題目。該參數可以設置為1或其他自然數。該參數必須給定,否則程序報錯並給出幫助信息。
3. 生成的題目中計算過程不能產生負數,也就是說算術表達式中如果存在形如e1 ? e2的子表達式,那麽e1 ≥ e2。
4. 生成的題目中如果存在形如e1 ÷ e2的子表達式,那麽其結果應是真分數。
5. 每道題目中出現的運算符個數不超過3個。
6. 程序一次運行生成的題目不能重復,即任何兩道題目不能通過有限次交換
生成的題目存入執行程序的當前目錄下的Exercises.txt文件,格式如下:
1. 四則運算題目1
2. 四則運算題目2
……
其中真分數在輸入輸出時采用如下格式,真分數五分之三表示為3/5,真分數二又八分之三表示為2’3/8。
7. 在生成題目的同時,計算出所有題目的答案,並存入執行程序的當前目錄下的Answers.txt文件,格式如下:
1. 答案1
2. 答案2
特別的,真分數的運算如下例所示:1/6 + 1/8 = 7/24。
8. 程序應能支持一萬道題目的生成。
9. 程序支持對給定的題目文件和答案文件,判定答案中的對錯並進行數量統計,輸入參數如下:
Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt
統計結果輸出到文件Grade.txt,格式如下:
Correct: 5 (1, 3, 5, 7, 9)
Wrong: 5 (2, 4, 6, 8, 10)
PSP2.1表格
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鐘) |
實際耗時(分鐘) |
Planning |
計劃 |
60 | 80 |
· Estimate |
· 估計這個任務需要多少時間 |
60 | 80 |
Development |
開發 |
1000 | 1200 |
· Analysis |
· 需求分析 (包括學習新技術) |
40 | 60 |
· Design Spec |
· 生成設計文檔 |
30 | 60 |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
60 | 80 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
30 | 50 |
· Design |
· 具體設計 |
30 | 50 |
· Coding |
· 具體編碼 |
60 | 60 |
· Code Review |
· 代碼復審 |
30 | 30 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
30 | 50 |
Reporting |
報告 |
60 | 80 |
· Test Report |
· 測試報告 |
30 | 50 |
· Size Measurement |
· 計算工作量 |
30 | 40 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
30 | 50 |
合計 |
1580 | 2020 |
設計:
功能分為兩個部分,1部分是給出整數的四則運算,2部分是分數的四則運算,通過算法設定了為兩個運算符號。
主要代碼
package homework; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.*; public class a{ public static String counter(int a,int b){ int y = 1;//初始值取1 for(int i=a;i>=1;i--){ if(a%i==0&&b%i==0){ y = i; break; } } int z = a/y; int m = b/y; if(z==0) { return "0"; } return ""+z+"/"+m; } public static void main(String[] args) { // TODO Auto-generated method stub int x,y,i,a1; int d1=0; String d = null; Scanner scan1=new Scanner(System.in); a1=scan1.nextInt(); if(a1==1){ //4則運算 System.out.println("請輸入題目的數量"); Scanner scan2=new Scanner(System.in); x=scan2.nextInt(); int daan[]=new int [x]; System.out.println("請輸入數值的範圍"); y=scan2.nextInt();//y取10 for(i=0;i<x;i++){ int a=(int)(Math.random()*y);//隨機生成一個1-10的整數 int b=(int)(Math.random()*y);//隨機生成一個1-10的整數 int e=(int)(Math.random()*y);//隨機生成一個1-10的整數 int c=(int)(Math.random()*3);//隨機生成一個1-4的整數,0表示加法,1表示減法,2表示乘法,3表示除法 int f=(int)(Math.random()*3);//隨機生成一個1-4的整數,0表示加法,1表示減法,2表示乘法,3表示除法 if(c==0&&f==0) { d1=a+b+e; System.out.print(a+"+"+b+"+"+e+"= "); } if(c==0&&f==1) { d1=a+b-e; System.out.print(a+"+"+b+"-"+e+"= "); } if(c==0&&f==2) { d1=a+b*e; System.out.print(a+"+"+b+"*"+e+"= "); } if(c==0&&f==3) { d1=a+b/e; System.out.print(a+"+"+b+"/"+e+"= "); } if(c==1&&f==0) { d1=a-b+e; System.out.print(a+"-"+b+"+"+e+"= "); } if(c==1&&f==1) { d1=a-b-e; System.out.print(a+"-"+b+"-"+e+"= "); } if(c==1&&f==2) { d1=a-b*e; System.out.print(a+"-"+b+"*"+e+"= "); } if(c==1&&f==3) { d1=a-b/e; System.out.print(a+"-"+b+"/"+e+"= "); } if(c==2&&f==0) { d1=a*b+e; System.out.print(a+"*"+b+"+"+e+"= "); } if(c==2&&f==1) { d1=a*b-e; System.out.print(a+"*"+b+"-"+e+"= "); } if(c==2&&f==2) { d1=a*b*e; System.out.print(a+"*"+b+"*"+e+"= "); } if(c==2&&f==3) { d1=a*b/e; System.out.print(a+"*"+b+"/"+e+"= "); } if(c==3&&f==0) { d1=a/b+e; System.out.print(a+"/"+b+"+"+e+"= "); } if(c==3&&f==1) { d1=a/b-e; System.out.print(a+"/"+b+"-"+e+"= "); } if(c==3&&f==2) { d1=a/b*e; System.out.print(a+"/"+b+"*"+e+"= "); } if(c==3&&f==3) { d1=a/b/e; System.out.print(a+"/"+b+"/"+e+"= "); } if((i+1)%10==0){//每三條作為一行 System.out.println(); } daan[i]=d1; //這次隨機的結果 } System.out.println("是否顯示答案(顯示請輸入1)"); if(scan2.nextInt()==1){ for(i=0;i<x;i++){ if((i+1)%10==0){//每三條作為一行 System.out.println();} System.out.print(daan[i]+" "); } } } if(a1==2){ int M,Z; System.out.println("請輸入題目的數量"); Scanner scan2=new Scanner(System.in); x=scan2.nextInt(); String daan[]=new String [x]; int x1,x2,B,m1,m2,x3,m3; System.out.println("請輸入分母數值的範圍"); B=scan2.nextInt(); for(i=0;i<x;i++){ m1=1+(int)(Math.random()*B);//隨機生成一個小於B的分母 x1=1+(int)(Math.random()*m1);//生成一個比分母小的分子,實現真分數 m2=1+(int)(Math.random()*B);//隨機生成一個小於B的分母 x2=1+(int)(Math.random()*m2);//生成一個比分母小的分子,實現真分數 m3=1+(int)(Math.random()*B);//隨機生成一個小於B的分母 x3=1+(int)(Math.random()*m3);//生成一個比分母小的分子,實現真分數 int c=(int)(Math.random()*3);//生成運算符 int f=(int)(Math.random()*3);//生成運算符 if(c==0&&f==0){ Z=x1*m2*m3+x2*m1*m3+x3*m1*m2; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"+"+x2+"/"+m2+"+"+x3+"/"+m3+"= "); } if(c==0&&f==1){ Z=x1*m2*m3+x2*m1*m3-x3*m1*m2; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"+"+x2+"/"+m2+"-"+x3+"/"+m3+"= "); } if(c==0&&f==2){ Z=x1*m2*m3+x2*x3*m1; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"+"+x2+"/"+m2+"*"+x3+"/"+m3+"= "); } if(c==0&&f==3){ Z=x1*m2*x3+x2*m1*m3; M=m1*m2*x3; d=counter(Z,M); System.out.print(x1+"/"+m1+"+"+x2+"/"+m2+"/"+x3+"/"+m3+"= "); } if(c==1&&f==0){ Z=x1*m2*m3-x2*m1*m3+x3*m1*m2; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"-"+x2+"/"+m2+"+"+x3+"/"+m3+"= "); } if(c==1&&f==1){ Z=x1*m2*m3-x2*m1*m3-x3*m1*m2; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"-"+x2+"/"+m2+"-"+x3+"/"+m3+"= "); } if(c==1&&f==2){ Z=x1*m2*m3-m1*x2*x3; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"-"+x2+"/"+m2+"*"+x3+"/"+m3+"= "); } if(c==1&&f==3){ Z=x1*m2*x3-m1*x2*m3; M=m1*m2*x3; d=counter(Z,M); System.out.print(x1+"/"+m1+"-"+x2+"/"+m2+"/"+x3+"/"+m3+"= "); } if(c==2&&f==0){ Z=x1*x2*m3+m1*m2*x3; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"*"+x2+"/"+m2+"+"+x3+"/"+m3+"= "); } if(c==2&&f==1){ Z=x1*x2*m3-m1*m2*x3; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"*"+x2+"/"+m2+"-"+x3+"/"+m3+"= "); } if(c==2&&f==2){ Z=x1*x2*x3; M=m1*m2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"*"+x2+"/"+m2+"*"+x3+"/"+m3+"= "); } if(c==2&&f==3){ Z=x1*x2*m3; M=m1*m2*x3; d=counter(Z,M); System.out.print(x1+"/"+m1+"*"+x2+"/"+m2+"/"+x3+"/"+m3+"= "); } if(c==3&&f==0){ Z=m1*x2*x3+x1*m2*m3; M=m1*x2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"/"+x2+"/"+m2+"+"+x3+"/"+m3+"= "); } if(c==3&&f==1){ Z=x1*m2*m3-m1*x2*x3; M=m1*x2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"/"+x2+"/"+m2+"-"+x3+"/"+m3+"= "); } if(c==3&&f==2){ Z=x1*m2*x3; M=m1*x2*m3; d=counter(Z,M); System.out.print(x1+"/"+m1+"/"+x2+"/"+m2+"*"+x3+"/"+m3+"= "); } if(c==3&&f==3){ Z=x1*m2*m3; M=m1*x2*x3; d=counter(Z,M); System.out.print(x1+"/"+m1+"/"+x2+"/"+m2+"/"+x3+"/"+m3+"= "); } if(c==2){ Z=x1*x2; M=m1*m2; d=d=counter(Z,M); System.out.print(x1+"/"+m1+"*"+x2+"/"+m2+"= "); } if(c==3){ Z=m1*x2; M=m2*x1; d=d=counter(Z,M); System.out.print(x1+"/"+m1+"/"+x2+"/"+m2+"= "); } if((i+1)%3==0){ System.out.println(); } daan[i]=d; } System.out.println("是否顯示答案(顯示請輸入1)"); if(scan2.nextInt()==1){ for(i=0;i<x;i++){ System.out.print(daan[i]+" "); } } } } }
測試運行
10000道題
總結
這次的結對實驗總的來說比上次的要難,思考、查找資料等等都花費了很多時間。而且也有不少問題沒有解決的。第一是結果會有負數,第二是結果寫不進txt文件中(我們嘗試了,能寫入其他的但是題目和結果寫不進去),第三是理解題目出了點偏差,沒有自己提供答案再糾錯的功能,只能提供答案。這幾點都需要再做改進。結對編程對我們的幫助還是挺大的,每個人不同的思路,看法,也能互相促進編程水平。總的來說受益匪淺。
java實現自動生成小學四則運算——朱庭震,詹祺豪