题目:自动生成小学算数题,且有要求。(是否有乘除法,减法是否有负数,除法是否有余数等)
设计思想:写一个定制生成数量的函数num(); 写一个生成整数算术题的函数function();function函数中可以直接生成随机数,用if语句进行分母为0或者减法过后结果为负数的情况的排除,运算符号也用随机数0到3来表示,返回值为String的式子即为算数题式子。写一个生成整数算术题的函数fun();fun函数中可以直接生成随机数,用if语句进行分母为0或者减法过后结果为负数的情况的排除,运算符号也用随机数0到3来表示,返回值为String的式子即为分数算数题式子。在生成算术式子的函数中用if语句进行判断生成哪种要求的算术式子。主函数中用一个String类型的数组保存算数题,用类似查询的方法来查重题目,不重复后输出题目。
源代码:
package suanshuti; import java.util.Scanner; public class Timu2 { //最大公约 static double getGcd(double m,double n){ while(n > 0){ double temp = m % n; m = n; n = temp; } return m; } //最小公倍数 static double getLcm(double m,double n){ double gcd = getGcd(m,n); double result = m*n / gcd; return result; } //生成题目数量的函数************* static int num() { int num; @SuppressWarnings("resource") Scanner in = new Scanner(System.in); System.out.print("请输入题目的数量:"); num = in.nextInt(); return num; } //产生分数式子的函数************* static String fun(int r ,int fun)//int fun为功能选项 { //1有乘除法2减法无负数 String fu =""; String shizi=""; int a=(int)(Math.random()*(r+1)); int b=(int)(Math.random()*(r+1)); int c=(int)(Math.random()*(r+1)); int d=(int)(Math.random()*(r+1)); int e=(int)(Math.random()*4); //1有乘除法2减法无负数***12 if(fun==12) { if(e==0) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==1) { fu="-"; double y=getLcm(b,d); double a1=y/b; double c1=y/d; double a2=a*a1; double c2=c*c1; while(a>=b||c>=d||b==0||d==0||a2<c2) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); y=getLcm(b,d); a1=y/b; c1=y/d; a2=a*a1; c2=c*c1; } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==2) { fu="*"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==3) { fu="/"; while(a>=b||c>=d||b==0||d==0||c==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } } //1有乘除法2减法无负数***1 if(fun==1) { if(e==0) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==1) { fu="-"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==2) { fu="*"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==3) { fu="/"; while(a>=b||c>=d||b==0||d==0||c==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } } //1有乘除法2减法无负数***2 if(fun==2) { if(e==0) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==1) { fu="-"; double y=getLcm(b,d); double a1=y/b; double c1=y/d; double a2=a*a1; double c2=c*c1; while(a>=b||c>=d||b==0||d==0||a2<c2) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); y=getLcm(b,d); a1=y/b; c1=y/d; a2=a*a1; c2=c*c1; } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==2) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==3) { fu="-"; double y=getLcm(b,d); double a1=y/b; double c1=y/d; double a2=a*a1; double c2=c*c1; while(a>=b||c>=d||b==0||d==0||a2<c2) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); y=getLcm(b,d); a1=y/b; c1=y/d; a2=a*a1; c2=c*c1; } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } } //1有乘除法2减法无负数***0 if(fun==0) { if(e==0) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==1) { fu="-"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==2) { fu="+"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } if(e==3) { fu="-"; while(a>=b||c>=d||b==0||d==0) { a=(int)(Math.random()*(r+1)); b=(int)(Math.random()*(r+1)); c=(int)(Math.random()*(r+1)); d=(int)(Math.random()*(r+1)); } int aa=(int) getGcd(a,b); int cc=(int) getGcd(c,d); a=a/aa; b=b/aa; c=c/cc; d=d/cc; shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?"; } } return shizi; } //生成整数式子的函数******************************
static String function(int r ,int q, int fun)//int fun为功能选项 { //1有乘除法 2加减无负数 3除法无余数(123,12,1,13, 2,0) String fu =""; String shizi=""; int a=(int)(Math.random()*(r)%(r-q+1)+q); int b=(int)(Math.random()*(r)%(r-q+1)+q); int c=(int)(Math.random()*4); //1乘除法 2加减无负数 3除法无余数****123 if(fun==123) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0||a%b!=0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****12 if(fun==12) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0) { b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****13 if(fun==13) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0和余数的可能性 while(b==0||a%b!=0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****1 if(fun==1) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0) { b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****2 if(fun==2) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****0 if(fun==0) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } } return shizi; } @SuppressWarnings("resource") public static void main(String[] args) { int num1,r = 0,q = 0,r1,m=0,fun ; while(m==0) { int flag=0; System.out.print("1:真分数 2:数整 3:退出 请输入:"); Scanner in2 = new Scanner(System.in); r1 = in2.nextInt(); if(r1==1) { num1=num(); String Array1[]=new String[num1]; System.out.print("请输入算数题中出现的数的最大值:"); Scanner in1 = new Scanner(System.in); r = in1.nextInt(); System.out.println("请输入算数题的控制项(1有乘除法 2加减无负数 0都未选择)"); System.out.println("例如:12是有乘除法,加减法无负数"); System.out.print("请输入控制项:"); Scanner in21 = new Scanner(System.in); fun = in21.nextInt(); while(flag==0) { if(fun==12||fun==1||fun==2||fun==0) { for(int i=0;i<num1;i++) { Array1[i]=fun(r,fun); //查重 for(int z=0;z<i;z++) { if(Array1[z].equals(Array1[i])) { Array1[i]=fun(r,fun); z=0; } } flag=1; if(i%3==0) System.out.println(); System.out.print(Array1[i]+" "); } } else { System.out.println("输入错误,请重新输入!"); flag=1; } } } if(r1==2) { num1=num(); String Array[]=new String[num1]; //进行最大值最小值的顺序判断*** int w1=0;; while(w1==0) { System.out.print("请输入算数题中出现的数的最大值和最小值:"); Scanner in1 = new Scanner(System.in); r = in1.nextInt(); q = in1.nextInt(); if(r>=q) w1=1; else { w1=0; System.out.println("输入错误!"); } } System.out.println("请输入算数题的控制项(1有乘除法 2加减无负数 3除法无余数 0都未选择)"); System.out.println("例如:123是有乘除法,加减法无负数,除法无余数"); System.out.print("请输入控制项:"); Scanner in211 = new Scanner(System.in); fun = in211.nextInt(); while(flag==0) { if(fun==123||fun==12||fun==1||fun==13||fun==2||fun==0) { for(int i=0;i<num1;i++) { Array[i]=function(r,q,fun); //查重 for(int z=0;z<i;z++) { if(Array[z].equals(Array[i])) { Array[i]=function(r,q,fun); z=0; } } flag=1; if(i%3==0) System.out.println(); System.out.print(Array[i]+" "); } } if(fun!=123&&fun!=12&&fun!=1&&fun!=13&&fun!=2&&fun!=0) { System.out.println("输入错误,请重新输入!"); flag=1; } } } if(r1==3) { m=1; System.out.print("谢谢使用!"); } System.out.println(); } } }
结果截图:
过程中产生的错误和不足:分数的除法只想到了每一个分数的分母不能等于0,没想到被除数也不能等于0,开始会生成1/2 / 0/1=?这样的式子,其实这样的式子是不正确的。后来在while语句中加了一个c==0的情况排除上面的情况。还有分数开始时候没有约分,之后运用最大公约数最小公倍数进行约分。