像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、题目避免重复、可定制出题的数量。(有能力者改编成网页版)
一、程序设计思想:
整数式:
利用Random类的nextInt()方法随机生成0-99之间的两个整数作为运算数,再利用nextInt()生成一个0-3的整数作为运算符(0代表加、1代表减、2代表乘、3代表除);生成的运算式存储在一个字符串中。
因为得数不能为负数和浮点数,所以要增加条件限制:
当运算符是减法(即z == 1)时,x 不能小于 y
当运算符是除法(即z == 3)时,除数y不能是0,而且x 必须是y的倍数,
条件限制代码:
if(z == 0) { t = "" + x + " + " + y + "=" + (x + y); }else if(z == 1 && x >= y) {//减法 t = "" + x + " - " + y + "=" + (x - y); }else if(z == 2) { t = "" + x + " * " + y + "=" + (x * y); }else{//除法 if(y != 0){//除数不能是0 if(x % y == 0)//必须能整除 t = "" + x + " / " + y + "=" + (x / y); } }
因为不能出现重复的题目,所以要对生成的题目跟已生成的题目进行比较,如果重复则丢弃该题目,继续生成题目:
检验是否重复的代码:
if(buChong(jss,t,i)){ jss[i++] = t; } 响应的buChong函数定义 //检测是否重复(检测j是否与jss数组的前n个重复)重复返回FALSE 不重复返回TRUE public static boolean buChong(String[] jss,String j,int n) { for(int i = 0;i < n;i++) { if(jss[i].equals(j)){ return false; } } return true; }
然后循环n次(n为出题数目)
真分数式:
真分数式与整数式设计思想相同,所不同的是限制条件多,随机生成真分数时,先生成两个整数a,b作为分母,
然后再生成两个整数作为分子,但是第一个整数要小于a,第二个整数要小于b,这样生成的四个整数组合起来就是两个真分数
条件限制:分母都不能为0,相加、相乘、相除的结果要小于1,相减不能出现负数。
并且每个分数都要进行约简
约简函数:
先找出分子和分母的最大公约数,然后分子和分母分别除以最大公约数
二、源程序代码:
package sizeyunsuan2; import java.util.*; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class sizeyunsuan { public static int gongyue(int x,int y){ int gongyue=1; int min=Math.min(x, y); for(int i=min;i>0;i--){ if((x%i==0) && (y%i==0)) { gongyue=i; break; } }//for return gongyue; } //判断输入的与答案是否相等 public static int yanzheng(String x,double k){ int m=0; String n=String.valueOf(k); if(x.equals(n)){ m=1;//1为相等 } else m=0; return m; } public static void main(String[] args) throws ScriptException { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); String fuhao[]=new String[4]; fuhao[0]="+"; fuhao[1]="-"; fuhao[2]="*"; fuhao[3]="/"; int i,j,k,m=0; int M=0;int N1=0; System.out.print("请选择题目的难易程度:(请输入“较简单” or “较困难”) "); String chengdu=scan.next(); if(chengdu.equals("较简单")) {M=100;N1=10;} else if(chengdu.equals("较困难")) {M=1000;N1=100;} else{ System.out.println("输入有误!"); } System.out.println(); System.out.print("整数的四则运算题目的数量定量:"); int N=scan.nextInt(); System.out.print("真分数的四则运算题目的数量定量:"); int n=scan.nextInt(); //Part01 ScriptEngine se=new ScriptEngineManager().getEngineByName("JavaScript"); int dui=0;//做对的题目 String zuocuo="";//做错的题目 String suan[]=new String[N];//算式 double key[]=new double[N];//答案 String K[]=new String[N]; System.out.println(); System.out.println("题目打印如下: "); System.out.println("一、整数的四则运算。"); for(i=0;i<N;i++){ int x=(int)(Math.random()*M); int x2=(int)(Math.random()*M); int y=(int)(Math.random()*M); int y2=(int)(Math.random()*M); int z=(int)(Math.random()*4); int zz=(int)(Math.random()*4); int zzz=(int)(Math.random()*4); String output=x+fuhao[z]+y+fuhao[zz]+x2+fuhao[zzz]+ y2; suan[i]=output+" ="; //key[i]=(double) se.eval(output); } //避免重复 for(j=0;j<N;j++){ for(k=j+1;k<N-1;k++){ if(suan[j].equals(suan[k])) { int x2=(int)(Math.random()*M); int x22=(int)(Math.random()*M); int y2=(int)(Math.random()*M); int y22=(int)(Math.random()*M); int z2=(int)(Math.random()*4); int zz2=(int)(Math.random()*4); int zzz2=(int)(Math.random()*4); String output= suan[k]=x2+" "+fuhao[z2]+" "+y2+" "+fuhao[zz2]+" "+x22+" "+fuhao[zzz2]+" "+ y22; suan[k]=output+" ="; key[i]=(int)se.eval(output); } } } for(m=0;m<N;m++){ System.out.print(m+1+". "+suan[m]); K[m]=scan.next(); if(yanzheng(K[m],key[m])==1){ dui++; } else{ zuocuo+=" "+(m+1); } System.out.println(); } System.out.println("做对了"+dui+"道题,题号"+zuocuo+"的答案错误。"); //Part02 随机产生真分数的四则运算 int dui2=0;//做对的题目 String zuocuo2="";//做错的题目 String suan2[]=new String[n];//算式 int key2[]=new int[n];//答案 String K2[]=new String[n]; System.out.println(); System.out.println("二、真分数的四则运算。"); for(i=0;i<n;i++){ int x0=(int) ((Math.random()*N1)+2); int xx=(int) ((Math.random()*(x0-1))+1); int a=gongyue(x0,xx); int x00=(int)(Math.random()*N1)+2; int xx0=(int)(Math.random()*(x00-1))+1; int b=gongyue(x00,xx0); int y0=(int)(Math.random()*N1)+2; int yy=(int)(Math.random()*(y0-1)+1); int c=gongyue(y0,yy); int y00=(int)(Math.random()*N1)+2; int yy0=(int)(Math.random()*(y00-1)+1); int d=gongyue(y00,yy0); int z=(int)(Math.random()*4); int z0=(int)(Math.random()*4); int z00=(int)(Math.random()*4); int p=x0/a; int q=xx/a; int o=x00/b; int w=xx0/b; int ii=y0/c; int e=yy/c; int u=y00/d; int r=yy0/d; String output=q+"/"+p+" "+fuhao[z]+" "+w+"/"+o+" "+fuhao[z0]+" "+e+"/" +ii+" "+fuhao[z00]+" "+r+"/"+u; suan2[i]=output+" ="; }//for //避免重复 for(j=0;j<n;j++){ for(k=j+1;k<n-1;k++){ if(suan2[j].equals(suan2[k])) { int x0=(int)(Math.random()*N1)+2; int xx=(int)(Math.random()*(x0-1))+1; int a=gongyue(xx,x0); int x00=(int)(Math.random()*N1)+2; int xx0=(int)(Math.random()*(x00-1))+1; int b=gongyue(xx0,x00); int y0=(int)(Math.random()*N1)+2; int yy=(int)(Math.random()*(y0-1)+1); int c=gongyue(y0,yy); int y00=(int)(Math.random()*N1)+2; int yy0=(int)(Math.random()*(y00-1)+1); int d=gongyue(y00,yy0); int z=(int)(Math.random()*4); int z0=(int)(Math.random()*4); int z00=(int)(Math.random()*4); int p=x0/a; int q=xx/a; int o=x00/b; int w=xx0/b; int ii=y0/c; int e=yy/c; int u=y00/d; int r=yy0/d; String output=q+"/"+p+" "+fuhao[z]+" "+w+"/"+o+" "+fuhao[z0]+" "+e+"/" +ii+" "+fuhao[z00]+" "+r+"/"+u; suan2[k]=output+" ="; } } } for(m=0;m<n;m++){ System.out.print(m+1+". "+suan2[m]); K2[m]=scan.next(); if(yanzheng(K2[m],key2[m])==1){ dui2++; } else{ zuocuo2+=" "+(m+1); } System.out.println(); } System.out.println("做对了"+dui2+"道题,题号"+zuocuo2+"的答案错误。"); } }
三、运行结果截图
四、课上未完成的原因:
理解题目不太准确,练习编程的时间还是少,习惯请教别人!!要学会自己解决问题和bug。