题目:

 

 

 

 

 

 

 

程序设计思想:

用随机数实现随机出题,随机决定运算数和运算符。

分析真分数运算需要注意的小细节。

需要用数组记录随机出的题目,用于比较新题目与已出题目从而避免重复出题。

 

 

 

 

 

源程序代码:

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");
                }
            }
        }
        
    }
    

}

 

 

 

 

运行结果截图:

 

 

 

 

 

课上未按时完成原因:

对分数运算的掌握不熟练,细节处理不够娴熟都要花一定的时间来缓冲