ztz1998

导航

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. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+×左右的算术表达式变换为同一道题目。例如,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文件中(我们尝试了,能写入其他的但是题目和结果写不进去),第三是理解题目出了点偏差,没有自己提供答案再纠错的功能,只能提供答案。这几点都需要再做改进。结对编程对我们的帮助还是挺大的,每个人不同的思路,看法,也能互相促进编程水平。总的来说受益匪浅。

 

posted on 2018-09-30 22:58  ztz1998  阅读(581)  评论(1编辑  收藏  举报