四则运算 2
与四则运算1相比的较大改进地方:
1)使用了多层嵌套,完善了定制题目的要求。
2)由于使用多层嵌套,加减乘除部分代码要多次利用,所以将加减乘除以方法函数进行封装。
3)利用InputException 进行了错误输入判断
编程思路:与四则运算一相比,多了嵌套判断条件的使用。
第一步:用函数封装 判断最大公约数、加减乘除法。
第二步:输入定制题目的条件:1.是否有乘除法 2.取值范围 3.减法有无负数 4.除法有无余数
分别从屏幕中读取,用(1.是 2.否)等方法进行条件限制。并利用InputException 判断用户输入是否符合要求。
第三步:进行嵌套处理,首先判断是否有乘除法、确定取值范围 、减法有无负数,如果有乘除法,判断除法有无余数。
第四步:利用随机数,随机产生两个数及加减乘除法,调用相应的方法函数,并利用数组F[i]进行答案的存储。
第五步:输出答案。
import java.util.Scanner; import javax.swing.*; //输入错误 class InputException extends Exception{ InputException(String smg){ super(smg); } } public class SZYS { public static void main(String[] args){ Scanner in=new Scanner(System.in); int a[]=new int[30];//第一个数的分子 int b[]=new int[30];//第一个数的分母 int c[]=new int[30];//用于判断加减乘除号 int d[]=new int[30];//第二个数的分子 int e[]=new int[30];//第二个数的分母 String f[]=new String[30];//答案 System.out.println("请选择是否有乘除法(1.是 2.否)"); int x; x=in.nextInt(); //输入错误处理 try{ if(x<1||x>2) throw new InputException("输入错误!"); }catch(InputException y){ System.out.println(y.getMessage()); System.exit(0);} System.out.println("请选择是否有括号(1.是 2.否)"); int x1; x1=in.nextInt(); //输入错误处理 try{ if(x1<1||x1>2) throw new InputException("输入错误!"); }catch(InputException y){ System.out.println(y.getMessage()); System.exit(0);} System.out.println("请选择取值范围的上限(整数)"); int x2; x2=in.nextInt(); //输入错误处理 try{ if(x2<=0) throw new InputException("输入错误!"); }catch(InputException y){ System.out.println(y.getMessage()); System.exit(0);} System.out.println("请选择加减法是否有负数(1.是 2.否)"); int x3; x3=in.nextInt(); //输入错误处理 try{ if(x3<1||x3>2) throw new InputException("输入错误!"); }catch(InputException y){ System.out.println(y.getMessage()); System.exit(0);} int x4 = 0; if(x==1){ System.out.println("除法有无余数(1.是 2.否)"); x4=in.nextInt(); //输入错误处理 try{ if(x4<1||x4>2) throw new InputException("输入错误!"); }catch(InputException y){ System.out.println(y.getMessage()); System.exit(0);} }in.close(); //嵌套1:是否有乘除法 switch(x){ case 1:{//有乘除法 for(int i=0;i<30;i++) { a[i]=(int)(Math.random()*x2+1); b[i]=(int)(Math.random()*x2+1);//分母不能为0 c[i]=(int)(Math.random()*100); d[i]=(int)(Math.random()*x2+1); e[i]=(int)(Math.random()*x2+1);//分母不能为0 int n=MaxCommonDivisor(a[i],b[i]); int m=MaxCommonDivisor(d[i],e[i]); //加法运算 if(c[i]>=0&&c[i]<25) { if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Jiafa(n,m,a[i],b[i],d[i],e[i])); } else{ f[i]=new String(Jiafa(1,1,a[i],1,d[i],1)); } } //减法运算 else if(c[i]>=25&&c[i]<50) { //嵌套3:减法有无负数 switch(x3){ case 1:{//有负数 if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i])); } else{ f[i]=new String(Jianfa(1,1,a[i],1,d[i],1)); } break; } case 2:{//无负数 if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} if(a[i]*e[i]>d[i]*b[i]) {f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));} if(a[i]*e[i]<=d[i]*b[i]) {f[i]=new String(Jianfa(n,m,d[i],e[i],a[i],b[i]));} } else{ if(a[i]>=d[i])f[i]=new String(Jianfa(1,1,a[i],1,d[i],1)); else f[i]=new String(Jianfa(1,1,d[i],1,a[i],1)); } break; } } } //乘法运算 else if(c[i]>=50&&c[i]<75) { if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Chengfa(n,m,a[i],b[i],d[i],e[i])); } else{ f[i]=new String(Chengfa(1,1,a[i],1,d[i],1)); } } //除法运算 else if(c[i]>=75&&c[i]<100) { if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Chufa(n,m,a[i],b[i],d[i],e[i])); } else{ if(x4==1)//嵌套4:除法有无余数 {f[i]=new String(Chufa(a[i],d[i]));} if(x4==2) {int l=(int)(Math.random()*20+1); a[i]=d[i]*l; System.out.println(a[i]+" ÷ "+d[i]+" ="); f[i]=l+""; } } } } System.out.println("答案:"); for(int i=0;i<30;i++) System.out.println(f[i]); break; } case 2:{//无乘除法 for(int i=0;i<30;i++) {a[i]=(int)(Math.random()*x2+1); b[i]=(int)(Math.random()*x2+1);//分母不能为0 c[i]=(int)(Math.random()*100); d[i]=(int)(Math.random()*x2+1); e[i]=(int)(Math.random()*x2+1);//分母不能为0 int n=MaxCommonDivisor(a[i],b[i]); int m=MaxCommonDivisor(d[i],e[i]); //加法运算 if(c[i]>=0&&c[i]<25) { if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Jiafa(n,m,a[i],b[i],d[i],e[i])); } else{ f[i]=new String(Jiafa(1,1,a[i],1,d[i],1)); } } //减法运算 else if(c[i]>=25&&c[i]<50) { //嵌套3:减法有无负数 switch(x3){ case 1:{//有负数 if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i])); } else{ f[i]=new String(Jianfa(1,1,a[i],1,d[i],1)); } break; } case 2:{//无负数 if(c[i]%2==0){ if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;} if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;} if(a[i]*e[i]>d[i]*b[i]) {f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));} if(a[i]*e[i]<=d[i]*b[i]) {f[i]=new String(Jianfa(n,m,d[i],e[i],a[i],b[i]));} } else{ if(a[i]>=d[i])f[i]=new String(Jianfa(1,1,a[i],1,d[i],1)); else f[i]=new String(Jianfa(1,1,d[i],1,a[i],1)); } break; } } } } System.out.println("答案:"); for(int i=0;i<30;i++) System.out.println(f[i]); } } } //求两个数的最大公约数 public static int MaxCommonDivisor(int m,int n){ if(m<n){int temp=m;m=n;n=temp;} while(m%n!=0){ int t=m%n; m=n; n=t; } return n; } //用函数封装加减乘除法 public static String Jiafa(int n,int m,int a,int b,int d,int e){ String f =""; if(n==b&&m==e) {System.out.println(a/b+" + "+d/e+" =");f=(a/b)+(d/e)+"";} else if(n==b&&m!=e) {System.out.println(a/b+" + "+d/m+"/"+e/m+" ="); f=(a/b)*(e/m)+d/m+"/"+e/m;} else if(n!=b&&m==e) {System.out.println(a/n+"/"+b/n+" + "+d/e+" ="); f=a/n+(d/e)*(b/n)+"/"+b/n;} else if(n!=b&&m!=e) {System.out.println(a/n+"/"+b/n+" + "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a*e+b*d,b*e); if(k==b*e) f=(a*e+b*d)/k+""; else if(k!=b*e) f=(a*e+b*d)/k+"/"+b*e/k; } return f; } public static String Jianfa(int n,int m,int a,int b,int d,int e){ String f = ""; if(n==b&&m==e) {System.out.println(a/b+" - "+d/e+" =");f=(a/b)-(d/e)+"";} else if(n==b&&m!=e) {System.out.println(a/b+" - "+d/m+"/"+e/m+" ="); f=(a/b)*(e/m)-d/m+"/"+e/m;} else if(n!=b&&m==e) {System.out.println(a/n+"/"+b/n+" - "+d/e+" ="); f=a/n-(d/e)*(b/n)+"/"+b/n;} else if(n!=b&&m!=e) {System.out.println(a/n+"/"+b/n+" - "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a*e+b*d,b*e); if(k==b*e) f=(a*e-b*d)/k+""; else if(k!=b*e) f=(a*e-b*d)/k+"/"+b*e/k; } return f; } public static String Chengfa(int n,int m,int a,int b,int d,int e){ String f = ""; if(n==b&&m==e) {System.out.println(a/b+" X "+d/e+" =");f=(a/b)*(d/e)+"";} else if(n==b&&m!=e) {System.out.println(a/b+" X "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a/n*d,e); if(k==e) f=a*d/n/e+""; else if(k!=e) f=a*d/n/k+"/"+e/k; } else if(n!=b&&m==e) {System.out.println(a/n+"/"+b/n+" X "+d/e+" ="); int k=MaxCommonDivisor(a*d/m,b); if(k==b) f=a*d/m/b+""; else if(k!=b) f=a*d/m/k+"/"+b/k;} else if(n!=b&&m!=e) {System.out.println(a/n+"/"+b/n+" X "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a*d/m/n,b*e/m/n); if(k==b*e/m/n) f=a*d/b/e+""; else if(k!=b*e/m/n) f=a*d/k/m/n+"/"+b*e/k/m/n; } return f; } public static String Chufa(int n,int m,int a,int b,int d,int e){ String f=""; if(n==b&&m==e) {System.out.println(a/b+" ÷ "+d/e+" =");f=(a/b)/(d/e)+"";} else if(n==b&&m!=e) {System.out.println(a/b+" ÷ "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a/n*e,d); if(k==d) f=a*e/n/d+""; else if(k!=d) f=a*e/n/k+"/"+d/k; } else if(n!=b&&m==e) {System.out.println(a/n+"/"+b/n+" ÷ "+d/e+" ="); int k=MaxCommonDivisor(a*m,b*d); if(k==b*d) f=a*m/b/d+""; else if(k!=b*d) f=a*m/k+"/"+b*d/k;} else if(n!=b&&m!=e) {System.out.println(a/n+"/"+b/n+" ÷ "+d/m+"/"+e/m+" ="); int k=MaxCommonDivisor(a*e,b*d); if(k==b*d) f=a*e/b/d+""; else if(k!=b*d) f=a*e/k+"/"+b*d/k; } return f; } public static String Chufa(int a,int b){ String f=""; if(a%b==0){a++;} System.out.println(a+" ÷ "+b+" ="); f=a/b+"......"+a%b; return f; } }
运行结果截图:
(除法有余数仅在随机产生的整数除法中出现,真分数除法结果仍可以为分数)
一些错误bug的处理:
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3/7 | 19:00 | 21:00 | 30分钟 | 1小时30分钟 | 主要对源程序进行了改进,将加减乘除用函数封装 | 完成了基本的框架 |
3/8 | 15:00 | 16:00 | 0 | 1小时 | 添加了嵌套条件,并对条件进行判断,用try和catch判断输入错误 | 开始时嵌套用switch,却忘记加入break(和break位置加入错误),致使思路混乱 |
18:40 | 20:40 | 0 | 2小时 | 由于switch大量括号混乱,将整体框架删除重新写入。 | switch与if结合,进行嵌套。 | |
3/10 | 16:20 | 17:00 | 0 | 40分钟 | 对代码进行了改进,进一步完善了代码,增加了错误判断 | 基本完成前四层条件的嵌套 |
随机产生括号尚未完成,未完待续……