因为“软件工程作业01”的理解有误,即“软件工程作业01”中,四则运算是按照4个数字去运算,最后计算它的答案有点困难,但随机生成任意数量的题目是没有问题的。
所以,我又重新改了一下程序,改成两个数的四则运算,这样答案可以较轻松的计算出来。以下是此程序的相关内容:
一、程序的设计思想
在原来的多个数进行四则运算的基础上,更改为两个数的四则运算,并成功的实现答案验算、定量出题、整数和真分数的四则运算的功能。思想还是和原来的思想差不多:用伪随机数产生随机数,用数字表示加减乘除符号;并定义两种做题难度,计算四则运算答案后,与输入的字符相比较,并记录作对题的个数和做错题的题号。
二、源程序代码
import java.util.Scanner; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; //随机产生四则运算题目 //李慧,2017.3.5 //梦断代码 /*要求: 1.支持真分数、整数的四则运算 2.题目避免重复 3.可定制数量 */ //无法避免一个类型的题重复出现 //无法避免负数(负数可以出现么?) public class SZYS { 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,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 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("题目打印如下: "); System.out.println("一、整数的四则运算。"); for(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(z==2) {key[i]=x*y;} }//if z!=3 }//for //避免重复 for(j=0;j<N;j++){ for(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[i]=x2+y2;} else if(z2==1){key[i]=x2-y2;} else if(z2==2) {key[i]=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(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+"的答案错误。"); //Part02 随机产生真分数的四则运算 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(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; } 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(j=0;j<n;j++){ for(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(m=0;m<n;m++){ System.out.print(m+1+". "+suan2[m]); K2[m]=scan.next(); 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+"的答案错误。"); System.out.println(" 共有"+(N+n-dui-dui2)+"道错题!下次继续努力!"); }//main //判断是哪种符号 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=String.valueOf(k); if(x.equals(n)){ m=1;//1为相等 } else m=0; return m; } }//end
三、运行结果截图
题目简单时:
题目困难时:
四、未完成的部分
我的程序还需要更加人性化的设计,不会重复出现同一类型的题目;题目数量虽然可以任意的设置,但是无法生成很大的数量。还需更正代码。查了资料,小学是没有学习负数的,所以,还得避免出现负数。