-----------------------------------------------
题目要求02:
可以控制一下参数。。
1.是否有乘除法
2.是否有括号(最多可以支持10个数参与运算)
3.取值范围√
4.加减有无负数√
5.除法有无余数
-----------------------------------------------
目前只实现了3.4两个要求,还存在BUG,还需改进。
一、程序的设计思想
在主界面的设计上是按年级分的难度,二年级时,是两位数的四则运算,然后是因为是二年级,还未学习余数,所以是除法只能是整除,具体算法如下:
int ff=0; int x=(int)(Math.random()*M); int shuzu[]=new int[100];//存储因子的数组 for(int a=1;a<=x;a++){ if(x%a==0)//是因子 {shuzu[ff]=a;ff++;}//存储到数组里去 int y=(int)(Math.random()*ff);//随机产生数组的下标 suan[i]=x+"/"+shuzu[y]+"="; key[i]=x/shuzu[y]; }//for
在随机数产生这块算法如下:
int s=(int)(Math.random()*8)+2;//2~10个数字 String out[]=new String[2*s-1]; output=""; for(int j=0;j<s;j++){ if(j==0) {shu[j]=suiji(M);//生成s个随机数 } else{ shu[j]=suiji(shu[j-1]); } } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; }
然后是采用了一种计算字符串中的四则运算的结构:
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");//用于计算答案
具体运用如下:
key[i]=(jse.eval(output)).toString();
在整数运算时,如果出现了小数,可以取整:
if(IS(key[i])==1){//如果是小数 key[i]=QU(key[i]);
算法如下:
//小数四舍五入(用于整数运算) public static String QU(String s){//s是答案 double x=Double.parseDouble(s); int y=(int) Math.round(x);//四舍五入 String z=y+""; return z; }
二、源程序代码
import java.util.Scanner; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; //随机产生四则运算02题目 //李慧,2017.3.6 /*要求:01 1.支持真分数、整数的四则运算 √ 2.题目避免重复√ 3.可定制数量 √ 要求02: 可以控制一下参数。。 1.是否有乘除法 2.是否有括号(最多可以支持10个数参与运算) 3.取值范围√ 4.加减有无负数√ 5.除法有无余数 */ //刚开始的思想一定要考虑周到,别以至于到后面程序有一点麻烦 //答案无法变成真分数 public class SZYS { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");//用于计算答案 static Scanner scan=new Scanner(System.in); static String fuhao[]=new String[4]; public static void main(String[] args) throws ScriptException { // TODO Auto-generated method stub fuhao[0]="+"; fuhao[1]="-"; fuhao[2]="*"; fuhao[3]="/"; int M=0,N1=0;//题的难度 int cuo1,cuo2,cuo=0; int x=0; while(x==0){ System.out.print("******************四则运算题目设置***********************" + "\n\n1.二年级\t\t2.三年级\t\t3.四年级\t\t0.退出\n\n请选择四则运算题目难度: "); int chengdu=scan.nextInt(); if(chengdu==1) {M=100;} else if(chengdu==2) {M=1000;N1=100;} else if(chengdu==3) {M=1000;N1=100;} if(chengdu==0) {System.out.println("...退出答题!"); System.out.println("*******************************************************"); break;} else if(chengdu==1 || chengdu==2){ System.out.print("整数的四则运算题目数量:"); int N=scan.nextInt();//定题量 System.out.println("*******************************************************"); System.out.println("\n答题开始...\n"); switch(chengdu){ case 1: cuo1=Two(M,N); System.out.println(); System.out.println("共错了"+cuo1+"道题,继续努力!"); break; case 2: cuo1=Three(M,N); System.out.println(); System.out.println("共错了"+cuo1+"道题,继续努力!"); break; default:System.out.println("输入有误!请重新输入!");break; }//switch } else if(chengdu==3){ System.out.print("整数的四则运算题目数量:"); int N=scan.nextInt(); System.out.print("真分数的四则运算题目数量:"); int n=scan.nextInt();//定题量 System.out.println("*******************************************************"); System.out.println("\n答题开始...\n"); switch(chengdu){ case 3: cuo1=Four(M,N); System.out.println(); cuo2=FourZ(N1,n); cuo=cuo1+cuo2; System.out.println("共错了"+cuo+"道题,继续努力!"); break; default:System.out.println("输入有误!请重新输入!");break; }//switch }//else if else{ System.out.println("输入格式有误!请输入(0或1或2或3)"); } }//while }//main public static int Two(int M,int N) throws ScriptException{ int dui=0;//做对的题目 String zuocuo="";//做错的题目 String suan[]=new String[N];//算式 int key[]=new int[N];//答案 String K[]=new String[N]; System.out.println(); System.out.println("一、整数的四则运算。"); for(int i=0;i<N;i++){ int z=(int) (Math.random()*4); if(z==3){//z==3 int ff=0; int x=(int)(Math.random()*M); int shuzu[]=new int[100];//存储因子的数组 for(int a=1;a<=x;a++){ if(x%a==0)//是因子 {shuzu[ff]=a;ff++;}//存储到数组里去 int y=(int)(Math.random()*ff);//随机产生数组的下标 suan[i]=x+"/"+shuzu[y]+"="; key[i]=x/shuzu[y]; }//for }//if else{ int x=(int)(Math.random()*M); int y=(int)(Math.random()*M); suan[i]=x+fuhao[z]+y+"="; if(z==0){key[i]=x+y;} if(z==1){key[i]=x-y; if(key[i]<0) { suan[i]=y+fuhao[z]+x+"="; key[i]=y-x; } } if(z==2) {key[i]=x*y;} }//if z!=3 }//for //避免重复 for(int j=0;j<N;j++){ for(int k=j+1;k<N-1;k++){ int F=isF(suan[j]); int FF=isF(suan[k]); if(F==FF) { int we=panduan(suan[j]);int l=suan[j].length(); int h=panduan(suan[k]);int ll=suan[k].length(); /* //用于验证 System.out.println(suan[j]+"的符号位置:"+we+",a:"+suan[j].substring(0,we-1)+",b:"+suan[j].substring(we+2,l-1)); System.out.println(suan[k]+"的符号位置:"+h+",a2:"+suan[k].substring(0,h-1)+",b2:"+suan[k].substring(h+2,ll-1)); */ if(((suan[j].substring(0,we-1)).equals(suan[k].substring(0, h-1))&& (suan[j].substring(we+2,l-1)).equals(suan[k].substring(h+2,ll-1)))|| ((suan[j].substring(0,we-1)).equals(suan[k].substring(h+2, ll-1))&& (suan[j].substring(we+2,l-1)).equals(suan[k].substring(0, h-1)))) { int x2=(int)(Math.random()*M); int y2=(int)(Math.random()*M); int z2=(int)(Math.random()*4); if(z2!=3){ suan[k]=x2+fuhao[z2]+y2+"="; if(z2==0){key[k]=x2+y2;} else if(z2==1){ key[k]=x2-y2; if(key[k]<0) { suan[k]=y2+fuhao[k]+x2+"="; key[k]=y2-x2; } } else if(z2==2) {key[k]=x2*y2;} }//if z2!=3 else{ int ff=0; int xz2=(int)(Math.random()*M); int shuzu2[]=new int[10];//存储因子的数组 for(int a=1;a<xz2;a++){ if(xz2%a==0)//是因子 {shuzu2[ff]=a;ff++;}//存储到数组里去 int yz2=(int)(Math.random()*ff);//随机产生数组的下标 suan[k]=xz2+"/"+shuzu2[yz2]+"="; key[k]=xz2/shuzu2[yz2]; } }//else }//if2 }//if1 } }//for for(int m=0;m<N;m++){ System.out.print(m+1+". "+suan[m]); K[m]=scan.next(); if(yanzheng(K[m],key[m])==1){ System.out.println("Bingo!"); dui++; } else{ System.out.println("Wrong! THE KEY:"+key[m]); zuocuo+=" "+(m+1); } System.out.println(); } System.out.println("做对了"+dui+"道题,做错了"+(N-dui)+"道题,题号"+zuocuo+"的答案错误。"); return (N-dui); } /* public static int TwoZ(int N1,int n){ int dui2=0;//做对的题目 String zuocuo2="";//做错的题目 String suan2[]=new String[n];//算式 String key2[]=new String[n];//答案 String K2[]=new String[n]; System.out.println(); System.out.println("二、真分数的四则运算。"); for(int 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 y0=(int)(Math.random()*N1)+2; int yy=(int)(Math.random()*(y0-1)+1); int b=gongyue(y0,yy); int zz=(int)(Math.random()*4); int p=x0/a; int q=xx/a; int o=y0/b; int w=yy/b; String output=q+"/"+p+" "+fuhao[zz]+" "+w+"/"+o+" ="; suan2[i]=output; if(zz==0){ int KK1=p*o;int KK2=q*o+w*p; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[i]=KK22+"/"+K1; } else if(zz==1){ int KK1=p*o;int KK2=q*o-w*p; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[i]=KK22+"/"+K1; if(KK22<0 || K1<0){ KK22=w*p-q*o; key2[i]=KK22+"/"+K1; suan2[i]=w+"/"+o+" "+fuhao[zz]+" "+q+"/"+p+" ="; } } else if(zz==2) { int KK1=p*o;int KK2=q*w; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[i]=KK22+"/"+K1; } else{int KK1=p*w;int KK2=q*o; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[i]=KK22+"/"+K1;} }//for //避免重复 for(int j=0;j<n;j++){ for(int k=j+1;k<n-1;k++){ int F=isF(suan2[j]); int FF=isF(suan2[k]); if(F==FF) { int we=panduan2(suan2[j]);int l=suan2[j].length(); int h=panduan2(suan2[k]);int ll=suan2[k].length(); //用于验证 System.out.println(suan2[j]+"的符号位置:"+we+",a:"+suan2[j].substring(0,we-1)+",b:"+suan2[j].substring(we+2,l-1)); System.out.println(suan2[k]+"的符号位置:"+h+",a2:"+suan2[k].substring(0,h-1)+",b2:"+suan2[k].substring(h+2,ll-1)); if(((suan2[j].substring(0,we-1)).equals(suan2[k].substring(0, h-1))&& (suan2[j].substring(we+2,l-1)).equals(suan2[k].substring(h+2,ll-1)))|| ((suan2[j].substring(0,we-1)).equals(suan2[k].substring(h+2, ll-1))&& (suan2[j].substring(we+2,l-1)).equals(suan2[k].substring(0, h-1)))) { int x0=(int) ((Math.random()*N1)+2); int xx=(int) ((Math.random()*(x0-1))+1); int a=gongyue(x0,xx); int y0=(int)(Math.random()*N1)+2; int yy=(int)(Math.random()*(y0-1)+1); int b=gongyue(y0,yy); int zz=(int)(Math.random()*4); int p=x0/a; int q=xx/a; int o=y0/b; int w=yy/b; String output=q+"/"+p+" "+fuhao[zz]+" "+w+"/"+o+" ="; suan2[k]=output; if(zz==0){ int KK1=p*o;int KK2=q*o+w*p; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[k]=KK22+"/"+K1; } else if(zz==1){ int KK1=p*o;int KK2=q*o-w*p; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[k]=KK22+"/"+K1; } else if(zz==2) { int KK1=p*o;int KK2=q*w; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; key2[k]=KK22+"/"+K1; } else{ int KK1=p*w;int KK2=q*o; int G=gongyue(KK1,KK2); int K1=KK1/G; int KK22=KK2/G; if(K1==KK22){key2[k]="1";} else{key2[k]=KK22+"/"+K1;}//else }//else }//if }//if }//for }//for for(int m=0;m<n;m++){ System.out.print(m+1+". "+suan2[m]); K2[m]=scan.next(); if(key2[m].equals("1/1")) key2[m]="1"; if(K2[m].equals(key2[m])){ System.out.println("Bingo!"); dui2++; } else{ System.out.println("Wrong! THE KEY:"+key2[m]); zuocuo2+=" "+(m+1); } System.out.println(); }//for System.out.println("做对了"+dui2+"道题,做错了"+(n-dui2)+"道题,题号"+zuocuo2+"的答案错误。"); return (n-dui2); } */ public static int Three(int M,int N) throws ScriptException{ int dui=0;//做对的题目 String zuocuo="";//做错的题目 String suan[]=new String[N];//算式 String output; String yu=""; String shang=""; String key[]=new String[N];//答案 int shu[]=new int[M];//一个式子中产生的数字的个数 int fu[]=new int[shu.length-1];//一个式子中产生符号的个数(首先用符号表示) String K[]=new String[N]; System.out.println("一、整数的四则运算。(可四舍五入)"); for(int i=0;i<N;i++){ int s=(int)(Math.random()*8)+2;//2~10个数字 String out[]=new String[2*s-1]; output=""; for(int j=0;j<s;j++){ if(j==0) {shu[j]=suiji(M);//生成s个随机数 } else{ shu[j]=suiji(shu[j-1]); } } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key[i]=(jse.eval(output)).toString(); if(IS(key[i])==1){//如果是小数 key[i]=QU(key[i]); }//if suan[i]=output+"="; }//for //避免重复 for(int j=0;j<N;j++){ for(int k=j+1;k<N-1;k++){ if(suan[j].equals(suan[k])){ int s=(int)(Math.random()*3)+2;//2~5个数字 String out[]=new String[2*s-1]; output=""; for(int j2=0;j2<s;j2++){ if(j2==0) {shu[j2]=suiji(M);//生成s个随机数 } else{ shu[j2]=suiji(shu[j2-1]); } } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key[k]=(jse.eval(output)).toString(); if(IS(key[k])==1){//如果是小数 key[k]=QU(key[k]); }//if suan[k]=output+"="; } } } for(int i=0;i<N;i++){ System.out.print(i+1+". "+suan[i]); K[i]=scan.next(); if(K[i].equals(key[i])){ System.out.println("Bingo!"); dui++; } else{ System.out.println("Wrong! THE KEY:"+key[i]); zuocuo+=" "+(i+1); } System.out.println(); } System.out.println("做对了"+dui+"道题,做错了"+(N-dui)+"道题,题号"+zuocuo+"的答案错误。"); return (N-dui); } public static int Four(int M,int N) throws ScriptException{ int dui=0;//做对的题目 String zuocuo="";//做错的题目 String suan[]=new String[N];//算式 String output; String shang=""; String key[]=new String[N];//答案 int shu[]=new int[M];//一个式子中产生的数字的个数 int fu[]=new int[shu.length-1];//一个式子中产生符号的个数(首先用符号表示) String K[]=new String[N]; System.out.println("一、整数的四则运算。(答案四舍五入)"); for(int i=0;i<N;i++){ int s=(int)(Math.random()*3)+2;//2~5个数字 String out[]=new String[2*s-1]; output=""; for(int j=0;j<s;j++){ shu[j]=suiji(M);//生成s个随机数 } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key[i]=(jse.eval(output)).toString(); if(IS(key[i])==1){//如果是小数 key[i]=QU(key[i]); }//if suan[i]=output+"="; }//for //避免重复 for(int j=0;j<N;j++){ for(int k=j+1;k<N-1;k++){ if(suan[j].equals(suan[k])){ int s=(int)(Math.random()*3)+2;//2~5个数字 String out[]=new String[2*s-1]; output=""; for(int j2=0;j2<s;j++){ shu[j2]=suiji(M);//生成s个随机数 } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key[k]=(jse.eval(output)).toString(); if(IS(key[k])==1){//如果是小数 key[k]=QU(key[k]); }//if suan[k]=output+"="; } } } for(int i=0;i<N;i++){ System.out.print(i+1+". "+suan[i]); K[i]=scan.next(); if(K[i].equals(key[i])){ System.out.println("Bingo!"); dui++; } else{ System.out.println("Wrong! THE KEY:"+key[i]); zuocuo+=" "+(i+1); } System.out.println(); } System.out.println("做对了"+dui+"道题,做错了"+(N-dui)+"道题,题号"+zuocuo+"的答案错误。"); return (N-dui); } public static int FourZ(int N1,int n) throws ScriptException{ int dui2=0;//做对的题目 String zuocuo2="";//做错的题目 String suan2[]=new String[n];//算式 String key2[]=new String[n];//答案 String K2[]=new String[n];//屏幕上输入的题目 String output=""; String shu[]=new String[N1];//一个式子中产生的真分数的个数 int fu[]=new int[shu.length-1];//一个式子中产生符号的个数(首先用符号表示) System.out.println(); System.out.println("二、真分数的四则运算。"); for(int i=0;i<n;i++){ int s=(int)(Math.random()*3)+2;//2~5个数字 String out[]=new String[2*s-1]; output=""; for(int j=0;j<s;j++){ if(j==0) {shu[j]=suijiZ(N1);//生成s个随机数 } else{ shu[j]=suijiZ(N1-1); } } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key2[i]=(jse.eval(output)).toString(); suan2[i]=output+"="; }//for //避免重复 for(int j=0;j<n;j++){ for(int k=j+1;k<n-1;k++){ if(suan2[j].equals(suan2[k])){ int s=(int)(Math.random()*3)+2;//2~5个数字 String out[]=new String[2*s-1]; output=""; for(int j2=0;j2<s;j2++){ if(j==0) {shu[j]=suijiZ(N1);//生成s个随机数 } else{ shu[j]=suijiZ(N1-1); } } for(int j2=0;j2<s-1;j2++){ fu[j2]=suiji(4); } for(int i2=0;i2<2*s-1;i2++){//输出算式 if(i2%2==0){ out[i2]=String.valueOf(shu[i2/2]); } else{ out[i2]=fuhao[fu[(i2+1)/2]]; } output+=out[i2]; } key2[k]=(jse.eval(output)).toString(); suan2[k]=output+"="; } } } for(int m=0;m<n;m++){ System.out.print(m+1+". "+suan2[m]); K2[m]=scan.next(); if(key2[m].equals("1/1")) key2[m]="1"; if(K2[m].equals(key2[m])){ System.out.println("Bingo!"); dui2++; } else{ System.out.println("Wrong! THE KEY:"+key2[m]); zuocuo2+=" "+(m+1); } System.out.println(); }//for System.out.println("做对了"+dui2+"道题,做错了"+(n-dui2)+"道题,题号"+zuocuo2+"的答案错误。"); return (n-dui2); } /*//小数取余 public static String YU(String s){ System.out.println(s); int index=0;//小数中小数点的位置 //找到小数中小数点的位置 for(int i=0;i<s.length();i++){ if(s.charAt(i)=='.'){ index=i; } }//for System.out.println(index); //转化为余数 int mu=10*index; double zi=Double.parseDouble(s); int zii=(int)zi*10*(s.length()-index); int gongyue=gongyue(mu,zii); int fenmu=mu/gongyue; int fenzi=zii/gongyue; String z=fenzi/fenmu+""; return z; }*/ //小数四舍五入(用于整数运算) public static String QU(String s){//s是答案 double x=Double.parseDouble(s); int y=(int) Math.round(x);//四舍五入 String z=y+""; return z; } //判断计算出来的答案是否是小数 public static int IS(String s){ int bool=1; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='.'){ bool=1;//是小数 break; } else{ bool=0;//不是小数 } } return bool; } //随机数的产生 public static int suiji(int M){//M是随机数产生的范围,即0~M int suiji=0; suiji=(int)(Math.random()*M); return suiji; } //真分数中随机数的产生 public static int suiji2(int a,int b){ int suiji=0; suiji=(int)(Math.random()*a)+b; return suiji; } //产生随机的真分数 public static String suijiZ(int N1){ String suiji=""; int x0=suiji2(N1,2); int xx=suiji2(x0-1,1); int A=gongyue(x0,xx); int p=x0/A; int q=xx/A; suiji=q+"/"+p; return suiji; } //判断是哪种符号 public static int isF(String s){ int x=-1; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='+'){x=0;} if(s.charAt(i)=='-'){x=1;} if(s.charAt(i)=='*'){x=2;} if(s.charAt(i)=='/'){x=3;} }//for if(x==-1){System.out.println("出现错误!,没有符号!");} return x; } //分数的判断 public static int panduan2(String ss){ int x=0;int y=0; for(int i=0;i<ss.length();i++){ if(ss.charAt(i)=='+' ||ss.charAt(i)=='-' || ss.charAt(i)=='*' || ss.charAt(i)=='/'){ y++; if(y==2){x=i;break;} } }//for return x; } //判断符号的位置(下标) public static int panduan(String ss){ int x=0; for(int i=0;i<ss.length();i++){ if(ss.charAt(i)=='+' ||ss.charAt(i)=='-' || ss.charAt(i)=='*' || ss.charAt(i)=='/'){ x=i; } } return x; } //化简 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,int k){ int m=0; String n=k+""; if(x.equals(n)){ m=1;//1为相等 } else m=0; return m; } }//end
三、运行程序结果
二年级题目:
三年级题目:
四年级题目:
四、未完成的原因
有的还没想清楚,最近又去应聘了家教,有点忙了。去小括号如何加,还有真分数的结果是真分数,这个只能两个数来实现,多个数还未实现。两个整数的四则运算要不然是整除要不然是答案有余数,还得分年级出现,这些功能都还未实现。还需继续...