题目:

新增要求:

程序设计思想:
对于新添要求,可以新增一个类(OperationType类:用于控制参数,从而确定运算题目的类型),将新添的要求中需要控制的那些参数:有无括号、加减有无负数、除法有没有余数等等作为这个类的属性,然后通过用户的选择:例如要有括号、加减无负数、除法没有余数等作为值赋给类的一个对象来实例化一个类,然后将这个类的信息传递给进行四则运算的函数(有整数运算和真分数运算俩个函数)。
再对之前的程序中的进行四则运算的函数进行具体修改:
1:对于是否有乘法:可以通过在随机决定运算符的语句稍加修改,使得只产生加减俩种运算符。
2:对于是否有括号(诶暂时没想好)
3:对于数值范围:此处数值范围,我理解为题目中出现的一个数字的范围。可以在新增的OperationType类里定义startNumber(范围小值)和endNumber(范围大值)两个变量用于记录出题的数值范围。
4:对于加减有无负数:对随机出的题目先计算得出答案,若答案符合要求,则打印题目,如果答案不符合要求,则pass掉重新出题。
5:对于除法有无余数:除法有无余数这个参数只作用于整数运算(此处真分数运算我们不谈论取余),淘汰运算过程中出现余数的题目,重新出题。对结果进行取余即可。
源程序代码:
//信1505-1班20153319,李翠云,2017/3/9 //四则运算 /*要求:01 1.支持真分数、整数的四则运算 √ 2.题目避免重复√ 3.可定制数量 √ 追加要求(要求2):(可控制如下参数) 1。是否有乘除法 2.是否有括号(最多可以支持十个数参与计算) 3.数值范围 4.加减有无负数 5.除法有无余数 */ package easyFourOperation02; import java.util.Random; import java.util.Scanner; /************************************为真分数运算而构造一个类,将分数的分子、分母作为类的数据成员。 ********************************************/ class Calculator { int numerator; // 分子 int denominator; // 分母 Calculator(){ } Calculator(int a,int b){ if(a == 0){ numerator = 0; denominator = 1; } else{ setNumeratorAndDenominator(a,b); } } void setNumeratorAndDenominator(int a, int b){ // 设置分子和分母 int c = f(Math.abs(a),Math.abs(b)); // 计算最大公约数 numerator = a / c; denominator = b / c; if(numerator<0 && denominator<0){ numerator = - numerator; denominator = - denominator; } } int getNumerator(){ return numerator; } int getDenominator(){ return denominator; } int f(int a,int b){ // 求a和b的最大公约数 if(a<b){int c=a;a=b;b=c;} int i; for(i=b;b>1;i--) { if(a%i==0&&b%i==0) return i; } return 1; } Calculator add(Calculator r){ // 加法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b + denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator sub(Calculator r){ // 减法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b - denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator muti(Calculator r){ // 乘法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator div(Calculator r){ // 除法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b; int newDenominator = denominator * a; Calculator result = new Calculator(newNumerator,newDenominator); return result; } } /************************************类结束******************************************************************************/ /****************************************OperationType类:用于控制参数***************************************/ class OperationType{ boolean mul_Div;//1。是否有乘除法 boolean parenthesis;//2.是否有括号(最多可以支持十个数参与计算) int startNumber,endNumber;//3.数值范围 boolean negativeNumberOfAdd_Sub;//4.加减有无负数 boolean remainderOfDiv;//5.除法有无余数 public OperationType() { mul_Div=true; parenthesis=false; startNumber=1; endNumber=100; negativeNumberOfAdd_Sub=true; remainderOfDiv=false; } public OperationType(boolean mul_Div,boolean parenthesis,int startNumber,int endNumber,boolean negativeNumberOfAdd_Sub,boolean remainderOfDiv){ this.mul_Div=mul_Div; this.parenthesis=parenthesis; this.startNumber=startNumber; this.endNumber=endNumber; this.negativeNumberOfAdd_Sub=negativeNumberOfAdd_Sub; this.remainderOfDiv=remainderOfDiv; } } /****************************************OperationType类结束:用于控制参数***************************************/ //public类FourOperation2 public class FourOperation2{ static String str[]; static Scanner sc=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub form(); } public static void form() { int choice1,choice2,choice3,choice4; int total; OperationType OT=new OperationType(); String str1="请选择(输入1或者2来进行选择):" +"\n1:简单四则运算(无真分数)" +"\n2:真分数四则运算"; System.out.println(str1); choice1=sc.nextInt(); if(choice1!=1&&choice1!=2) { System.out.println("输入错误,请重新选择:");form(); } System.out.println("\n\n"); String str2="请选择(输入1或者2来进行选择):" +"\n1:按照不同年级出题" +"\n2:按照自己的喜欢需要来出题(例如:可以自己决定要不要乘除法、要不要带括号、要不要自己决定数值范围等等)"; System.out.println(str2); choice2=sc.nextInt(); if(choice2!=1&&choice2!=2) { System.out.println("输入错误,请重新选择:");form(); } System.out.println("\n\n"); //处理choice2 if(choice2==1)//*************************************************待处理!!!!!!!!!!!!!!!!次要 { String str3="请选择年级:" +"\n1:二年级" +"\n2:三年级" +"\n3:四年级" +"\n4:五、六年级"; System.out.println(str3); choice3=sc.nextInt(); } else if(choice2==2) { System.out.println("是否需要乘除法(输入1或者2来进行选择):"+"\n1:需要"+"\n2:不需要"); choice4=sc.nextInt(); if(choice4==1) OT.mul_Div=true; else OT.mul_Div=false; System.out.println("是否需要括号(输入1或者2来进行选择):"+"\n1:需要"+"\n2:不需要"); choice4=sc.nextInt(); if(choice4==1) OT.parenthesis=true; else OT.parenthesis=false; System.out.println("是否需要控制数值范围(输入1或者2来进行选择):"+"\n1:需要"+"\n2:不需要"); choice4=sc.nextInt(); if(choice4==1) { System.out.println("请输入最小数值(请输入一个整数):"); OT.startNumber=sc.nextInt(); System.out.println("请输入最大数值(请输入一个整数):"); OT.endNumber=sc.nextInt(); int t; if(OT.startNumber>OT.endNumber)//进行两数比较,避免用户输入顺序相反造成错误 { t=OT.startNumber; OT.startNumber=OT.endNumber; OT.endNumber=t; } } System.out.println("加减法运算结果是否允许出现负数(输入1或者2来进行选择):"+"\n1:允许"+"\n2:不允许"); choice4=sc.nextInt(); if(choice4==1) OT.negativeNumberOfAdd_Sub=true; else OT.negativeNumberOfAdd_Sub=false; System.out.println("除法运算是否取余数(输入1或者2来进行选择):"+"\n1:取余数"+"\n2:不取余数"); choice4=sc.nextInt(); if(choice4==1) OT.remainderOfDiv=true; else OT.remainderOfDiv=false; } //控制出题数量 System.out.println("请输入所需题量(请输入一个数):"); total=sc.nextInt(); System.out.println("\n\n"); //处理choice1*************************************待处理!!!!!!!!!!!!!1主要 if(choice1==1) easyFourOperation(total,OT); else if(choice1==2) properFractionOperation(total,OT); } public static void easyFourOperation(int n,OperationType OT)//简单四则运算 { str=new String[n]; int ch; char char_='+'; int i,j,k; int num; int answer=0; double answer_=0;//用于处理除法。避免结果取整而给出错误答案。 boolean flag=false; int range;//用于控制是否有乘除法 if(OT.mul_Div=true) range=4; else range=2; int length;//用于随机确定运算式操作数的个数。 int[] brackets = null;//存储括号个数 for(i=0;i<n;i++) { /*******生成运算式****/ length=(int)(Math.random()*9+2); k=0; while(k<length) { num=(int)(Math.random()*(OT.endNumber-OT.startNumber)+OT.startNumber); ch=(int)(Math.random()*range+1); str[i]+=num; switch(ch) { case 1:char_='+';break; case 2:char_='-';break; case 3:char_='×';break; case 4:char_='÷';break; } if(k!=length-1) str[i]+=ch; } /********处理是否有括号:对上述运算式进行再加工********/ if(OT.parenthesis) { brackets=randomAddBracket(length); for(k=0;k<length;k++) { if() } } //避免重复 for(j=0;j<i;j++) if(str[i].equals(str[j])) {flag=true;break;} if(flag) {i--;flag=false;} else { System.out.println("题目"+(i+1)+":"+str[i]); System.out.println("是否查看答案?请选择:1:查看 2:不查看"); int choice; choice=sc.nextInt(); if(choice==1) System.out.println("答案:"+answer+"\n"); } } } public static void properFractionOperation(int n,OperationType O)//真分数运算 { str=new String[n]; int ch; char char_='+'; int s,t,u,v; int i,j; int k,q;//用做两数交换的容器 boolean flag=false; for(i=0;i<n;i++) { s=(int)(Math.random()*20); t=(int)(Math.random()*20); u=(int)(Math.random()*20); v=(int)(Math.random()*20); ch=(int)(Math.random()*4+1); if((s==0&&t==0)||(u==0&&v==0)) { i--;continue; } if(s>t){k=s;s=t;t=k;} if(u>v){q=u;u=v;v=q;} Calculator C1=new Calculator(s,t); Calculator C2=new Calculator(u,v); Calculator answer=new Calculator(); switch(ch) { case 1:char_='+';answer=C1.add(C2);break; case 2:char_='-';answer=C1.sub(C2);break; case 3:char_='×';answer=C1.muti(C2);break; case 4:char_='÷';if(u==0) {i--;continue;} answer=C1.div(C2);break; } str[i]=new String(); str[i]=""+s+"/"+t+char_+u+"/"+v; //避免重复 for(j=0;j<i;j++) if(str[i].equals(str[j])) {flag=true;break;} if(flag) {i--;flag=false;} else { System.out.println("题目"+(i+1)+":"+str[i]); System.out.println("是否查看答案?请选择:1:查看 2:不查看"); int choice; choice=sc.nextInt(); if(choice==1) { if(answer.denominator==1) System.out.println("答案:"+answer.numerator+"\n"); else System.out.println("答案:"+answer.numerator+"/"+answer.denominator+"\n"); } } } } //随机生成括号,参数为运算式的运算数的个数 public static int[] randomAddBracket(int length){ int[] brackets = new int[length]; for(int i = 0;i < brackets.length;i++) brackets[i] = 0; Random rd = new Random(); for(int i = 2;i < length;i++){//添加的括号长度(括号包围的运算数的个数) for(int j = 0;j < length - i + 1;j++){ int t = rd.nextInt(2);//随机生成0或1,0代表不加括号,1代表加括号 if(t == 1){ if(brackets[j] >= 0 && brackets[j + i - 1] <= 0){//要加的括号的第一个运算数周围没有右括号,且 最后一个运算数周围没有左括号 int counteract = 0; for(int k = j;k < j + i;k++){//将要加的括号之间的所有运算数对应的brackets相加, //如果和为0说明这个括号之间的括号是匹配的,不会出现括号交叉现象 counteract += brackets[k]; } if(counteract == 0){ brackets[j]++; brackets[j + i - 1]--; } } } } } return brackets; } }
运行结果截图:
整数运算:

分数运算:

浙公网安备 33010602011771号