题目:


程序设计思想:
用随机数实现随机出题,随机决定运算数和运算符。
分析真分数运算需要注意的小细节。
需要用数组记录随机出的题目,用于比较新题目与已出题目从而避免重复出题。
源程序代码:
package 四则运算; 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; } } /************************************类结束********************************************/ public class FourOperation { 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 choice; int total; String str1="请选择:" +"\n1:简单四则运算(无真分数)" +"\n2:真分数四则运算"; System.out.println(str1); choice=sc.nextInt(); System.out.println("请输入所需题量:"); total=sc.nextInt(); if(choice==1) easyFourOperation(total); if(choice==2) properFractionOperation(total); } public static void easyFourOperation(int n)//简单四则运算 { str=new String[n]; int ch; char char_='+'; int i,j; int a,b; int answer=0; double answer_=0;//用于处理除法。避免结果取整而给出错误答案。 boolean flag=false; for(i=0;i<n;i++) { a=(int)(Math.random()*100); b=(int)(Math.random()*100); ch=(int)(Math.random()*4+1); switch(ch) { case 1:char_='+';answer=a+b;break; case 2:char_='-';answer=a-b;break; case 3:char_='×';answer=a*b;break; case 4:char_='÷';answer_=(double)(a)/(double)(b);break; } str[i]=new String(); str[i]=""+a+char_+b; //避免重复 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)//真分数运算 { 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"); } } } } }
运行结果截图:


课上未按时完成原因:
对分数运算的掌握不熟练,细节处理不够娴熟都要花一定的时间来缓冲
浙公网安备 33010602011771号