四则运算03

一.设计思想

(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);
            }
        }
    }
}
View Code

 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;
    }
}
View Code

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;
    }
}
View Code

  3、实验截图

1、

2、

4、程序总结分析:有了清晰的需求分析,还要有注释。借鉴了队友的前一个程序的基础上。注释也很重要,特别是写过之后重用和测试代码时,都必须得看。否则就不得不将已写好的封装函数从头到尾再看一遍,再理解,这样很浪费时间。有了注释,就可以省去这些重新理解函数的时间,可以提高效率。

5、工作照

原文地址:https://www.cnblogs.com/hanzhu/p/5323382.html