阿超超的四则运算 想啊想啊
之前的代码修改:
package 阿超超; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; import java.util.Random; import java.util.Scanner; import java.util.Vector; public class Achao { static Scanner sc=new Scanner(System.in); static Random ne=new Random(); static Vector<String> vet=new Vector<String>(); static int zfnnNum = 0; //记录含真分数的题目数 static String jg; static String str1,str2; int cho; /** * 求两个数之间的最大公约数 */ public static int getGCD(int max, int min) { int gcd = 1; if(min >= max) { int temp = max; max = min; min = temp; } for(int i = min;i>=1;i--) { if(max % i == 0 && min % i == 0) { gcd = i; break; } } return gcd; } public static void main(String[] args) throws Exception { try{ System.out.println("用户您好,请对该次出题做出要求"); System.out.print("出题数目N(正整数):"); int N=sc.nextInt(); System.out.print("输入运算范围fw?(1~fw,正整数?):"); int fw=sc.nextInt(); System.out.print("是否有乘除cc(有1,无0):"); int cc=sc.nextInt(); System.out.print("是否有真分数zf(有1,无0):"); int zf=sc.nextInt(); //只有加减无真分数 if(cc==0&&zf==0) cc0(N,fw); //有乘除,无真分数 else if(cc==1&&zf==0) zf0(N,fw); //无乘除有真分数 else if(cc==0&&zf==1) { System.out.print("含有真分数的题目数量zfn(0<zfn<=N):"); int zfn=sc.nextInt(); cc1(N,fw,zfn); } //有乘除,有真分数 else if(cc==1&&zf==1) { System.out.print("含有真分数的题目数量zfn(0<zfn<=N):"); int zfn=sc.nextInt(); zf1(N,fw,zfn); } //System.out.println("是否有括号(有1,无0)"); //有无负数 //打印选择 }//try catch(Exception e) { System.out.println("输入格式有误!"); } }//main //只有加减无真分数 public static void cc0(int NN,int fww) throws Exception { for(int i=0;i<NN;i++) { // i 从0开始,循环NN次,出题NN道 char[] fh={'+','-'};//符号数组 int ysfh=ne.nextInt(fh.length); char h=fh[ysfh]; int a=ne.nextInt(fww+1); int b=ne.nextInt(fww+1); jg=a+" "+h+" "+b+" "+"="; //----------查重操作--------- if(i ==0) //如果 i=0,只有一个数,不会重,则 vet 中增加一个 vet.add(jg); else{ //如果 i 不等于 0,则有可能出题重复 for(int j = 0; j <i; j++) { /* j从0开始,循环 i 次,将vet 中的元素依次与 jg 比较,如果有相同的,则说明有重复,此时i--,取消该次出题, 结束本次循环;如果没有相同的元素,则执行 vet.add(jg); 并退出(break)查重的循环 */ if(vet.get(j).equals(jg)){ i--; continue; } else{ vet.add(jg);//在末尾加入字符串?而不是对象? break; } }//查重完毕 } }//for 出题 System.out.print("出题完成,请选择 1打印 0预览:"); int cho=sc.nextInt(); if (cho==1) { for(int pt=0; pt<vet.size();pt++) { System.out.print(vet.get(pt)+" "); if((pt+1)%5==0)System.out.println(" "); } }//打印 else if(cho==0) { System.out.println("默认地址 E://阿超//a.txt"); FileOutputStream fl=new FileOutputStream(new File("E://阿超//a.txt")); PrintStream p= new PrintStream(fl); for(int pt=0;pt<vet.size();pt++) { p.print(vet.get(pt)+" "); if((pt+1)%5==0) p.println(" "); } p.close(); }//预览 } //有加减乘除,无真分数 public static void zf0(int NN,int fww) throws Exception { for(int i=0;i<NN;i++) { char[] fh={'+','-','×','÷'};//符号数组 int ysfh=ne.nextInt(fh.length); char h=fh[ysfh]; int a=ne.nextInt(fww+1); int b=ne.nextInt(fww+1); String jg=a+" "+h+" "+b+" "+"="; if(i ==0) vet.add(jg); else{ for(int j = 0; j <i; j++) { if(vet.get(j).equals(jg)) i--; else{ vet.add(jg);//在末尾加入字符串?而不是对象? break; } }//查重完毕 } }//for 出题 System.out.print("出题完成,请选择 1打印 0预览:"); int cho=sc.nextInt(); if (cho==1) { for(int pt=0;pt<vet.size();pt++) { System.out.print(vet.get(pt)+" "); if((pt+1)%5==0)System.out.println(" "); } }//打印 else if(cho==0) { System.out.println("默认地址 E://阿超//a.txt"); FileOutputStream fl=new FileOutputStream(new File("E://阿超//a.txt")); PrintStream p= new PrintStream(fl); for(int pt=0; pt<vet.size();pt++) { p.print(vet.get(pt)+" "); if((pt+1)%5==0) p.println(" "); } p.close(); }//预览 } //有加减,无乘除,有真分数/ public static void cc1(int NN,int fww ,int zfnn) throws Exception { for( int i=0;i< NN;i++) { char[] fh={'+','-'};//符号数组 int ysfh=ne.nextInt(fh.length); char h=fh[ysfh]; int a=ne.nextInt(fww+1); int b=ne.nextInt(fww+1); int c=ne.nextInt(fww+1); int d=ne.nextInt(fww+1); int e=ne.nextInt(fww+1); int f=ne.nextInt(fww+1); Object[] obj = new Object[4];//混合数组 {整数,整数,真分数,真分数} //先把两个整数存到混合数组中 obj[0]=e; obj[1]=f; /* 如果 a b c d 或者 a = b , c = d 其中任何一个为 0 则 i--,取消该次出题,并退出该次循环。 这是为了保证 a / b, c /d 一定是分数,不会出现等于0 或者 等于1的情况 */ if(a == 0 || b == 0 || c == 0 || d == 0 || a == b || c == d) { i--;continue; }else{ //满足条件后保证分子(a 和 c )小于分母( b 和 d) if(b < a ) //保证b的值大于a的值 { int temp=a; a=b; b=temp; } if(d < c ) //保证d的值大于c的值 { int temp=c; c=d; d=temp; } int gcd1 = getGCD(b,a); //求a b 的最大公约数 a = a / gcd1; b = b / gcd1; int gcd2 = getGCD(d,c);//求c d 的最大公约数 d = d / gcd2; c = c / gcd2; obj[2]=a+"/"+b; obj[3]=c+"/"+d; int objcd1=ne.nextInt(obj.length); int objcd2=ne.nextInt(obj.length);//获取混合数组的一个元素 //如果出现分数,则统计含真分数题目的值加一 if(objcd1 == 3 || objcd2 == 3 || objcd1 == 2 || objcd2 == 2){ zfnnNum++; } if(zfnnNum > zfnn) { //如果出现分数次数大于要求值,则不在让分数参与出题 objcd1=(int) (Math.random()*1); //而是在两个整数之间取值 //取另外一个整数 if(objcd1 == 1) { objcd2 = 0;} else if(objcd1 == 0){objcd2 =1;} } Object m=obj[objcd1]; str1=m.toString(); Object n=obj[objcd2]; str2=n.toString(); String jg=str2+" "+h+" "+str1+" "+"="; if(i ==0) vet.add(jg); else{ for(int j = 0; j <i; j++) { if(vet.get(j).equals(jg)) i--; else{ vet.add(jg);//在末尾加入字符串?而不是对象? break; } }//查重完毕 } }//for 出题 } System.out.print("出题完成,请选择 1打印 0预览:"); int cho=sc.nextInt(); if (cho==1) { for(int pt=0;pt<vet.size();pt++) { System.out.print(vet.get(pt)+" "); if((pt+1)%5==0)System.out.println(" "); } }//打印 else if(cho==0) { System.out.println("默认地址 E://阿超//a.txt"); FileOutputStream fl=new FileOutputStream(new File("E://阿超//a.txt")); PrintStream p= new PrintStream(fl); for(int pt=0;pt<vet.size();pt++) { p.print(vet.get(pt)+" "); if((pt+1)%5==0) p.println(" "); } p.close(); }//预览 }//cc1 ~A.1 //有乘除,有真分数 public static void zf1(int NN,int fww ,int zfnn) throws Exception { for( int i=0;i< NN;i++) { char[] fh={'+','-','×','÷'};//符号数组 int ysfh=ne.nextInt(fh.length); char h=fh[ysfh]; int a=ne.nextInt(fww+1); int b=ne.nextInt(fww+1); int c=ne.nextInt(fww+1); int d=ne.nextInt(fww+1); int e=ne.nextInt(fww+1); int f=ne.nextInt(fww+1); Object[] obj = new Object[4];//混合数组 {整数,整数,真分数,真分数} obj[0]=e; obj[1]=f; if(a == 0 || b == 0 || c == 0 || d == 0 || a == b || c == d) { i--;continue; }else{ if(b < a ) //保证b的值大于a的值 { int temp=a; a=b; b=temp; } if(d < c ) //保证d的值大于c的值 { int temp=c; c=d; d=temp; } int gcd1 = getGCD(b,a); a = a / gcd1; b = b / gcd1; int gcd2 = getGCD(d,c); d = d / gcd2; c = c / gcd2; obj[2]=a+"/"+b; obj[3]=c+"/"+d; int objcd1=ne.nextInt(obj.length); int objcd2=ne.nextInt(obj.length);//获取混合数组的一个元素 if(objcd1 == 3 || objcd2 == 3 || objcd1 == 2 || objcd2 == 2){ zfnnNum++; } if(zfnnNum > zfnn) { objcd1=(int) (Math.random()*1); if(objcd1 == 1) { objcd2 = 0;} else if(objcd1 == 0){objcd2 =1;} } Object m=obj[objcd1]; str1=m.toString(); Object n=obj[objcd2]; str2=n.toString(); String jg=str2+" "+h+" "+str1+" "+"="; if(i ==0) vet.add(jg); else{ for(int j = 0; j <i; j++) { if(vet.get(j).equals(jg)) i--; else{ vet.add(jg);//在末尾加入字符串?而不是对象? break; } }//查重完毕 } }//for 出题 } System.out.print("出题完成,请选择 1打印 0预览:"); int cho=sc.nextInt(); if (cho==1) { for(int pt=0;pt<vet.size();pt++) { System.out.print(vet.get(pt)+" "); if((pt+1)%5==0)System.out.println(" "); } }//打印 else if(cho==0) { System.out.println("默认地址 E://阿超//a.txt"); FileOutputStream fl=new FileOutputStream(new File("E://阿超//a.txt")); PrintStream p= new PrintStream(fl); for(int pt=0;pt<vet.size();pt++) { p.print(vet.get(pt)+" "); if((pt+1)%5==0) p.println(" "); } p.close(); }//预览 }//zf1 ~A.1 }//class
运行结果:
可实现,数目要求,范围要求,对乘除真分数的要求,查重,打印方式的实现。
学到的东西:
1.之前的思想是,随机产生真分数的分子(c,d)分母(e,f),如果不符合分子小于分母,重新产生并用while来控制。
经过别人帮助之后,发现其实可以通过简单的大小比较交换再来确定分子分母,避免了不断重复的过程。
2.之前在真分数产生时候没有想过分母为0的情况,大谬!
3.之前在查重时,如果重复知道用while重新随机出,但我想正是while用太多,出现了死循环。究竟是while里面哪里出现的错误,我,不,知,道。
现在经过别人帮助之后,,原来可以在if里面套上 i--;哇,多机灵啊!
目前想解决的问题是 负数/余数的处理方法;
前提是,随机数+随机符号,每道题是以String(int+char+int)类型构成的字符串形式加入vector数组,加入之前已经进行了查重。
此时希望能够满足:可选择减有无负数+可选择除法有无余数。
打算将用户选择放入实参,根据实参来对每一道题做判断。
1.再加入 是否可负数 , 是否可余数两个参数
2.在每一道题出题完成之后,通过if 参数表示不可出现,进行String截取运算字符,算出减法/除法的每一道答案,如果有负数/余数,i--;
if 参数表可出现,源程序不必改变。
思考之后觉得这样代码量会增加 减法(A 无负数 B有负数) 除法(C除法无余数 D除法有余数)1.A C 2.A D 3.B C 4.B D
嗯·····是个问题
考虑一下是每个if检验内包括2种且包含查重,还是每个if检验包括一种且不包含查重,每次出现不符合要求时i--;continue;
你看,
continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。
另外如果接下来要进行判断答案的话,是否需要vector二维数组(一个是String题目,一个是答案)了呢?
诶,要进行答案正误判断的话,小数分数的怎么办?还要通分,oh dear
不慌,,,,