题目:自动生成小学算数题,且有要求。(是否有乘除法,减法是否有负数,除法是否有余数等)
设计思想:写一个定制生成数量的函数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减法无负数***12if(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减法无负数***1if(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减法无负数***2if(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减法无负数***0if(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除法无余数****123if(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除法无余数****12if(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除法无余数****13if(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除法无余数****1if(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除法无余数****2if(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除法无余数****0if(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的情况排除上面的情况。还有分数开始时候没有约分,之后运用最大公约数最小公倍数进行约分。