第一次编程自己用的是分年级来判断程度,所以先加了数值范围和加减有无复数的判断,没有加入别的判断,由于个人原因括号没有加。
设计思想:根据年级判断难易程度,通过函数封装(但是发现自己对函数不敏感,没有养成封装函数的习惯)来产生随机数产生和验证等
源程序代码:
package sizeyunsuan2; import java.util.*; import javax.script.*; public class sizeyunsuan { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");//用于计算答案 static Scanner scan=new Scanner(System.in); static String fuhao[]={"+","-","*","/"};//运算符数组; public static void main(String[] args) throws ScriptException { // TODO Auto-generated method stub int M=0,N1=0;//题的难度 int cuo1,cuo2,cuo=0; int x=0; while(x==0){ System.out.print("1.二年级 2.三年级 3.四年级 0.退出 请选择四则运算题目难度: "); int chengdu=scan.nextInt(); if(chengdu==1) {M=50;} else if(chengdu==2) {M=100;} else if(chengdu==3) {M=100;N1=100;} if(chengdu==0) {System.out.println("...退出答题!"); break;} else if(chengdu==1 || chengdu==2){ System.out.print("整数的四则运算题目数量:"); int N=scan.nextInt();//定题量 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; } } else if(chengdu==3){ System.out.print("整数的四则运算题目数量:"); int N=scan.nextInt(); System.out.print("真分数的四则运算题目数量:"); int n=scan.nextInt();//定题量 System.out.println("*******************************************************"); System.out.println(" 答题开始... "); 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; } } else{ System.out.println("输入格式有误!请输入(0或1或2或3)"); } } } 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]; } } 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;} } } //避免重复 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(); //用于验证 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;} } 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]; } } } } } } 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("答题正确!"); dui++; } else{ System.out.println("答案错误,正确答案为:"+key[m]); zuocuo+=" "+(m+1); } System.out.println(); } System.out.println("做对了"+dui+"道题,做错了"+(N-dui)+"道题,题号"+zuocuo+"的答案错误。"); return (N-dui); } 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];//答案 for(int i=0;i<N;i++){ key[i]="0"; } 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=""; int kkk=Integer.parseInt(key[i]);//用于防止出现负数 while(kkk<=0){ for(int j=0;j<s;j++){ if(j==0) {shu[j]=suiji(M);//生成s个随机数 } else{ shu[j]=suiji(M); } } 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]); } suan[i]=output+"="; } } //避免重复 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(M); } } 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; int shang=0; int f=0; int yu=0; 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("一、整数的四则运算。(有余数时格式:3余1)"); for(int i=0;i<N;i++){ int s=(int)(Math.random()*8)+2;//2~10个数字 if(s==2){//如果产生两个数字 f=suiji(4);//产生符号 output=""; shu[0]=suiji(M);//生成2个随机数 shu[1]=suiji(shu[0]); if(f==3){ output=shu[0]+"/"+shu[1]; suan[i]=output+"="; shang=shu[0]/shu[1]; yu=shu[0]%shu[1]; key[i]=shang+"余"+yu; }//if else{ output=shu[0]+fuhao[f]+shu[1]; if(f==0){key[i]=shu[0]+shu[1]+"";} if(f==1){ key[i]=shu[0]-shu[1]+""; int ke=Integer.parseInt(key[i]); if(ke < 0) { suan[i]=shu[1]+fuhao[f]+shu[0]+"="; key[i]=shu[1]-shu[0]+""; } } if(f==2) {key[i]=shu[0]*shu[1]+"";} } }//if else{ 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(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()*8)+2;//2~10个数字 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 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; } }
运行结果截图:
开发过程中的项目计划日志
时间记录日志
缺陷记录日志