1. 程式人生 > >java實現自動生成小學四則運算——朱庭震,詹祺豪

java實現自動生成小學四則運算——朱庭震,詹祺豪

output random 隨機生成 編程 ali 需求 寫入 等號 報錯

組員:朱庭震,詹祺豪

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. 程序一次運行生成的題目不能重復,即任何兩道題目不能通過有限次交換

+×左右的算術表達式變換為同一道題目。例如,23 + 45 = 和45 + 23 = 是重復的題目,6 × 8 = 和8 × 6 = 也是重復的題目。3+(2+1)1+2+3這兩個題目是重復的,由於+是左結合的,1+2+3等價於(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+33+2+1是不重復的兩道題,因為1+2+3等價於(1+2)+3,而3+2+1等價於(3+2)+1,它們之間不能通過有限次交換變成同一個題目。

生成的題目存入執行程序的當前目錄下的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實現自動生成小學四則運算——朱庭震,詹祺豪