题目:自动生成小学算数题,且有要求。(是否有乘除法,减法是否有负数,除法是否有余数等)
设计思想:写一个定制生成数量的函数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=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 =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 =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 =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
结果截图:
过程中产生的错误和不足:分数的除法只想到了每一个分数的分母不能等于0,没想到被除数也不能等于0,开始会生成1/2 / 0/1=?这样的式子,其实这样的式子是不正确的。后来在while语句中加了一个c==0的情况排除上面的情况。还有分数开始时候没有约分,之后运用最大公约数最小公倍数进行约分。