一.设计思想
(1)总共创建3个类,主类YunSuan,其他Operation(包含四则运算的方法)、From(包含获得随机数的方法)和Result(属性有必须的一个,方法是为了使主函数减少代码量而写的)三个类。
1.1 num输入出题数量
1.2 min,max进行运算的最低和最高数值范围
1.3(0)无乘除法 (1)只有乘法 (2)只有除法(无余数) (3)只有除法(有余数) (4)混合运算
(2)四则运算主要实现方法放在Operation类中。
2.1 String addition(int min,int max,Result r)//加法
2.2String subtraction(int min,int max,Result r)//减法无负数
2.3String multiplication(int min,int max,Result r)//乘法
2.4String division(int min,int max,Result r)//除法无余数
2.5String division1(int min,int max,Result r)//除法有余数
2.6 String mixop(int min,int max,Result r)//混合运算
(3)Operation类中的方法调用From类中的方法,产生随机数进行运算,Operation类中的方法参数的数据类型包含Result类型,以便结果的使用。
2.源代码
1、四则运算主要实现方法放在Operation类中。
import java.util.*; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class YunSuan { void result() { Scanner sca=new Scanner(System.in); Operation op=new Operation(); Result r=new Result(); //确定出题数量 System.out.println("输入出题数量 "); int num=sca.nextInt(); r.init(num); //确定数值范围 System.out.println("输入进行运算的最低和最高数值范围:"); int min,max; min=sca.nextInt(); max=sca.nextInt(); //确定是否有乘除法 int select; System.out.println("请按要求输入 (0)无乘除法 (1)有乘法 (2)有除法(无余数) (3)有除法(有余数) (4)混合运算"); select=sca.nextInt(); if(select==0) { r.first(min, max, num, r); System.out.println("总共算对 "+r.right+" 道题"); } else if(select==1) { r.first(min, max, 2*(num/3), r); r.second(min, max, num, r); System.out.println("总共算对 "+r.right+" 道题"); } else if(select==2) { r.first(min, max, 2*(num/3), r); r.third(min, max, num, r); System.out.println("总共算对 "+r.right+" 道题"); } else if(select==3) { r.first(min, max, 2*(num/3), r); r.third1(min, max, num, r); System.out.println("总共算对 "+r.right+" 道题"); } else if(select==4) { r.fourth(min, max, num, r); System.out.println("总共算对 "+r.right+" 道题"); } else { System.out.println("输入错误"); } } public static void main(String[] args){ try { YunSuan s=new YunSuan(); s.result(); } catch(Exception e) { System.out.println("输入不合法,请重新执行,按照要求输入"); } } } class Result { static int right; int i,j; String r1,a,b,s[]; Scanner sca=new Scanner(System.in); Operation op=new Operation(); Result() { right=0; } void init(int num)//初始化数组 { s=new String[num]; } void first(int min,int max,int num,Result r) { for(i=0;i<(num/2);i++)//加法 { j=0; boolean bool=true; s[i]=op.addition(min, max,r); //判断是否重复 while(bool&&(i!=0)) { while(s[i].equals(s[j])) { s[i]=op.addition(min, max,r); j=0; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } for(i=(num/2);i<num;i++)//减法 { j=num/2; boolean bool=true; s[i]=op.subtraction(min, max, r); //判断是否重复 while(bool&&(i!=num/2)) { while(s[i].equals(s[j])) { s[i]=op.subtraction(min, max,r); j=num/2; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } } void second(int min,int max,int num,Result r) { for(i=2*(num/3);i<num;i++)//乘法 { j=2*(num/3); boolean bool=true; s[i]=op.multiplication(min, max, r); //判断是否重复 while(bool&&(i!=2*(num/3))) { while(s[i].equals(s[j])) { s[i]=op.multiplication(min, max, r); j=2*num/3; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } } void third(int min,int max,int num,Result r)//除法无余数 { for(i=2*(num/3);i<num;i++)//除法 { j=2*(num/3); boolean bool=true; s[i]=op.division(min, max, r); //判断是否重复 while(bool&&(i!=2*(num/3))) { while(s[i].equals(s[j])) { s[i]=op.division(min, max, r); j=2*num/3; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } } void third1(int min,int max,int num,Result r)//除法有余数 { for(i=2*(num/3);i<num;i++)//除法 { j=2*(num/3); boolean bool=true; s[i]=op.division1(min, max, r); //判断是否重复 while(bool&&(i!=2*(num/3))) { while(s[i].equals(s[j])) { s[i]=op.division1(min, max, r); j=2*num/3; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } } void fourth(int min,int max,int num,Result r) { for(i=0;i<num;i++) { j=0; boolean bool=true; s[i]=op.mixop(min, max, r); //判断是否重复 while(bool&&(i!=0)) { while(s[i].equals(s[j])) { s[i]=op.addition(min, max,r); j=0; } j++; if(j==i) { bool=false; } } a=r.r1; System.out.println("("+(i+1)+") "+s[i]); b=sca.nextLine(); if(a.equals(b)) { right++; } else { System.out.println("第 "+(i+1)+" 道题算错,正确答案为 "+a); } } } }
2、 Operation类中的方法调用From类中的方法,产生随机数进行运算,Operation类中的方法参数的数据类型包含Result类型,以便结果的使用。
class From { Random1 ran1=new Random1(); String addition(int min,int max,Result r)//加法 { String str=""; int a[],c,i,re=0; c=ran1.setRandom(2, 4);//加法运算的个数,最少2个,最多4个 a=new int[c]; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); if(i<(c-1)) { str+=a[i]+" + "; } else { str+=a[i]+" ="; } re+=a[i];//结果 } r.r1=""+re; return str; } String subtraction(int min,int max,Result r)//减法无负数 { String str=""; int a[],c,i,re=0;//a[]随机数存放的数组 c=ran1.setRandom(2, 4);//减法运算的个数,最少2个,最多4个 a=new int[c]; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); } Arrays.sort(a);//随机出来的数从小到大排序 for(i=0;i<c-1;i++)//除最大值外的其他值相加 { re+=a[i]; } while(a[c-1]<re)//当最大值比其他值的和小时,重新随机c个数 { re=0; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); } Arrays.sort(a);//随机出来的数从小到大排序 for(i=0;i<c-1;i++)//除最大值外的其他值相加 { re+=a[i]; } } for(i=c-1;i>=0;i--) { if(i>0) { str+=a[i]+" - "; } else { str+=a[i]+" ="; } } r.r1=""+(a[c-1]-re); return str; } String multiplication(int min,int max,Result r)//乘法 { String str=""; int a[],c,i,re=1; c=ran1.setRandom(2, 4);//乘法运算的个数,最少2个,最多4个 a=new int[c]; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); if(i<(c-1)) { str+=a[i]+" x "; } else { str+=a[i]+" ="; } re*=a[i]; } r.r1=""+re; return str; } String division(int min,int max,Result r)//除法无余数 { String str=""; int a[],c,i,re=1; c=ran1.setRandom(2, 4);//除法运算的个数,最少2个,最多4个 a=new int[c]; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); } Arrays.sort(a); for(i=0;i<c-1;i++) { re*=a[i]; } while((re==0)||(a[c-1]%re!=0)) { re=1; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); } Arrays.sort(a); for(i=0;i<c-1;i++) { re*=a[i]; } } for(i=c-1;i>=0;i--) { if(i>0) { str+=a[i]+" ÷ "; } else { str+=a[i]+" ="; } } r.r1=""+(a[c-1]/re); return str; } String division1(int min,int max,Result r)//除法有余数 { String str=""; int a[],c,i,re=1; c=ran1.setRandom(2, 4);//除法运算的个数,最少2个,最多4个 a=new int[c]; for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); if(a[i]==0) { a[i]=ran1.setRandom(min,max); } } for(i=1;i<c;i++) { re*=a[i]; } for(i=0;i<c;i++) { if(i<(c-1)) { str+=a[i]+" ÷ "; } else { str+=a[i]+" ="; } } int m;//最大公约数 if(a[0]<re) { m=a[0]; } else { m=re; } for(i=m;i>0;i--) { if((a[0]%i==0)&&(re%i==0)) { m=i; break; } } r.r1=(a[0]/m)+"/"+(re/m); if((a[0]/m)%(re/m)==0) { r.r1=""+((a[0]/m)/(re/m)); } return str; } String mixop(int min,int max,Result r)//混合运算 { String str=""; int a[],c,i,re=0; c=ran1.setRandom(4,5);//混合运算的个数,最少4个,最多5个 a=new int[c]; int b=ran1.setRandom0(4); for(i=0;i<c;i++) { a[i]=ran1.setRandom(min,max); } if(c==4&&b==0) { re=a[0]+a[1]-a[2]*a[3]; if(re>=0) { str+=a[0]+" + "+a[1]+" - "+a[2]+" x "+a[3]+" = "; } else { str+=a[2]+" x "+a[3]+"-"+a[0]+" - "+a[1]+" = "; re=-re; } } if(c==4&&b==1) { re=a[0]-a[1]+a[2]*a[3]; if(re>=0) { str+=a[0]+" - "+a[1]+" + "+a[2]+" x "+a[3]+" = "; } else { str+=a[1]+" - "+a[0]+" - "+a[2]+" x "+a[3]+" = "; re=-re; } } if(c==4&&b==2) { while((a[3]==0)||(a[2]%a[3]!=0)) { a[2]=ran1.setRandom(min,max); a[3]=ran1.setRandom(min,max); } re=a[0]+a[1]-a[2]/a[3]; if(re>=0) { str+=a[0]+" + "+a[1]+" - "+a[2]+" ÷ "+a[3]+" = "; } else { str+=a[2]+" ÷ "+a[3]+"-"+a[0]+" - "+a[1]+" = "; re=-re; } } if(c==4&&b==3) { while((a[3]==0)||(a[2]%a[3]!=0)) { a[2]=ran1.setRandom(min,max); a[3]=ran1.setRandom(min,max); } re=a[0]-a[1]+a[2]/a[3]; if(re>=0) { str+=a[0]+" - "+a[1]+" + "+a[2]+" ÷ "+a[3]+" = "; } else { str+=a[1]+" - "+a[0]+" - "+a[2]+" ÷ "+a[3]+" = "; re=-re; } } if(c==5) { while((a[4]==0)||((a[2]*a[3])%a[4]!=0)) { a[2]=ran1.setRandom(min,max); a[3]=ran1.setRandom(min,max); a[4]=ran1.setRandom(min,max); } re=a[0]+a[1]-a[2]*a[3]/a[4]; if(re>=0) { str+=a[0]+" + "+a[1]+" - "+a[2]+" x "+a[3]+" ÷ "+a[4]+" = "; } else { str+=a[2]+" x "+a[3]+" ÷ "+a[4]+"-"+a[0]+" - "+a[1]+" = "; re=-re; } } r.r1=""+re; return str; } }
3、
class Random1 { int setRandom(int min,int max){ Random ran=new Random(); int r=ran.nextInt(max-min+1)+min; return r; } int setRandom0(int num){ Random ran=new Random(); int r=ran.nextInt(num); return r; } }
3、实验截图
1、
2、
4、程序总结分析:有了清晰的需求分析,还要有注释。借鉴了队友的前一个程序的基础上。注释也很重要,特别是写过之后重用和测试代码时,都必须得看。否则就不得不将已写好的封装函数从头到尾再看一遍,再理解,这样很浪费时间。有了注释,就可以省去这些重新理解函数的时间,可以提高效率。
5、工作照