四则运算 2

与四则运算1相比的较大改进地方:

1)使用了多层嵌套,完善了定制题目的要求。

2)由于使用多层嵌套,加减乘除部分代码要多次利用,所以将加减乘除以方法函数进行封装。

3)利用InputException 进行了错误输入判断

 

编程思路:与四则运算一相比,多了嵌套判断条件的使用。

第一步:用函数封装 判断最大公约数、加减乘除法。

第二步:输入定制题目的条件:1.是否有乘除法 2.取值范围 3.减法有无负数 4.除法有无余数

分别从屏幕中读取,用(1.是 2.否)等方法进行条件限制。并利用InputException 判断用户输入是否符合要求。

第三步:进行嵌套处理,首先判断是否有乘除法、确定取值范围 、减法有无负数,如果有乘除法,判断除法有无余数。

第四步:利用随机数,随机产生两个数及加减乘除法,调用相应的方法函数,并利用数组F[i]进行答案的存储。

第五步:输出答案。

import java.util.Scanner;

import javax.swing.*;
//输入错误

class InputException extends Exception{
    InputException(String smg){
        super(smg);
    }
}
public class SZYS {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int a[]=new int[30];//第一个数的分子
        int b[]=new int[30];//第一个数的分母
        int c[]=new int[30];//用于判断加减乘除号
        int d[]=new int[30];//第二个数的分子
        int e[]=new int[30];//第二个数的分母
        String f[]=new String[30];//答案
        
        System.out.println("请选择是否有乘除法(1.是  2.否)");
        int x;
        x=in.nextInt();
        //输入错误处理
        try{
            if(x<1||x>2) throw new InputException("输入错误!");
            
        }catch(InputException y){
            System.out.println(y.getMessage());
            System.exit(0);}
        
        
        
        System.out.println("请选择是否有括号(1.是  2.否)");
        int x1;
        x1=in.nextInt();
        //输入错误处理
        try{
            if(x1<1||x1>2) throw new InputException("输入错误!");
            
        }catch(InputException y){
            System.out.println(y.getMessage());
            System.exit(0);}
        
        System.out.println("请选择取值范围的上限(整数)");
        int x2;
        x2=in.nextInt();
        //输入错误处理
        try{
            if(x2<=0) throw new InputException("输入错误!");
            
        }catch(InputException y){
            System.out.println(y.getMessage());
            System.exit(0);}
        
        
        System.out.println("请选择加减法是否有负数(1.是  2.否)");
        int x3;
        x3=in.nextInt();
        //输入错误处理
        try{
            if(x3<1||x3>2) throw new InputException("输入错误!");
            
        }catch(InputException y){
            System.out.println(y.getMessage());
            System.exit(0);}
    
        int x4 = 0;
        if(x==1){
        System.out.println("除法有无余数(1.是  2.否)");
        x4=in.nextInt();
        //输入错误处理
        try{
            if(x4<1||x4>2) throw new InputException("输入错误!");
            
        }catch(InputException y){
            System.out.println(y.getMessage());
            System.exit(0);}
        }in.close();
        //嵌套1:是否有乘除法
        switch(x){
        case 1:{//有乘除法
            for(int i=0;i<30;i++)
            {
                a[i]=(int)(Math.random()*x2+1);
                b[i]=(int)(Math.random()*x2+1);//分母不能为0
                
                c[i]=(int)(Math.random()*100);
                
                d[i]=(int)(Math.random()*x2+1);
                e[i]=(int)(Math.random()*x2+1);//分母不能为0
                int n=MaxCommonDivisor(a[i],b[i]);
                int m=MaxCommonDivisor(d[i],e[i]);
                //加法运算
               if(c[i]>=0&&c[i]<25) {
                   if(c[i]%2==0){
                       if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                       if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                       f[i]=new String(Jiafa(n,m,a[i],b[i],d[i],e[i]));
                   }
                   else{
                       f[i]=new String(Jiafa(1,1,a[i],1,d[i],1));
                   }
                }
                //减法运算
                else if(c[i]>=25&&c[i]<50) {
                    //嵌套3:减法有无负数
                    switch(x3){
                    case 1:{//有负数
                        if(c[i]%2==0){
                            if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                              if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                            f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));
                        }
                        else{
                              f[i]=new String(Jianfa(1,1,a[i],1,d[i],1));
                        }
                    break;
                    }
                    case 2:{//无负数
                    if(c[i]%2==0){
                         if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                         if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                    if(a[i]*e[i]>d[i]*b[i])
                        {f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));}
                    if(a[i]*e[i]<=d[i]*b[i])
                        {f[i]=new String(Jianfa(n,m,d[i],e[i],a[i],b[i]));}
                    }
                    else{
                        if(a[i]>=d[i])f[i]=new String(Jianfa(1,1,a[i],1,d[i],1));
                        else f[i]=new String(Jianfa(1,1,d[i],1,a[i],1));
                    }
                    break;
                    }
                    }
                }
                //乘法运算
                else if(c[i]>=50&&c[i]<75)  {
                    if(c[i]%2==0){
                        if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                         if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                    f[i]=new String(Chengfa(n,m,a[i],b[i],d[i],e[i]));
                    }
                    else{
                        f[i]=new String(Chengfa(1,1,a[i],1,d[i],1));
                    }
                }
                //除法运算
                else if(c[i]>=75&&c[i]<100)   {
                    if(c[i]%2==0){
                         if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                         if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                    f[i]=new String(Chufa(n,m,a[i],b[i],d[i],e[i]));
                    }
                    else{
                        if(x4==1)//嵌套4:除法有无余数
                        {f[i]=new String(Chufa(a[i],d[i]));}
                        if(x4==2)
                        {int l=(int)(Math.random()*20+1);
                         a[i]=d[i]*l;
                         System.out.println(a[i]+" ÷ "+d[i]+" =");
                         f[i]=l+"";
                        }
                    }
                }
                
            }
            System.out.println("答案:");
            for(int i=0;i<30;i++)
                System.out.println(f[i]);
            break;
        }
         case 2:{//无乘除法
            for(int i=0;i<30;i++)
            {a[i]=(int)(Math.random()*x2+1);
            b[i]=(int)(Math.random()*x2+1);//分母不能为0
            
            c[i]=(int)(Math.random()*100);
            
            d[i]=(int)(Math.random()*x2+1);
            e[i]=(int)(Math.random()*x2+1);//分母不能为0
            int n=MaxCommonDivisor(a[i],b[i]);
            int m=MaxCommonDivisor(d[i],e[i]);
            //加法运算
           if(c[i]>=0&&c[i]<25) {
               if(c[i]%2==0){
                   if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                   if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                   f[i]=new String(Jiafa(n,m,a[i],b[i],d[i],e[i]));
               }
               else{
                   f[i]=new String(Jiafa(1,1,a[i],1,d[i],1));
               }
            }
            //减法运算
            else if(c[i]>=25&&c[i]<50) {
                //嵌套3:减法有无负数
                switch(x3){
                case 1:{//有负数
                    if(c[i]%2==0){
                        if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                          if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                        f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));
                    }
                    else{
                          f[i]=new String(Jianfa(1,1,a[i],1,d[i],1));
                    }
                break;
                }
                case 2:{//无负数
                if(c[i]%2==0){
                     if(a[i]>b[i]){int t=a[i];a[i]=b[i];b[i]=t;}
                     if(d[i]>e[i]){int t=d[i];d[i]=e[i];e[i]=t;}
                if(a[i]*e[i]>d[i]*b[i])
                    {f[i]=new String(Jianfa(n,m,a[i],b[i],d[i],e[i]));}
                if(a[i]*e[i]<=d[i]*b[i])
                    {f[i]=new String(Jianfa(n,m,d[i],e[i],a[i],b[i]));}
                }
                else{
                    if(a[i]>=d[i])f[i]=new String(Jianfa(1,1,a[i],1,d[i],1));
                    else f[i]=new String(Jianfa(1,1,d[i],1,a[i],1));
                }
                break;
                }
                }
            }
           }
            System.out.println("答案:");
            for(int i=0;i<30;i++)
                System.out.println(f[i]);
            
        }
        
    }
        
    }

    
      //求两个数的最大公约数
        public static int MaxCommonDivisor(int m,int n){
            if(m<n){int temp=m;m=n;n=temp;}
            while(m%n!=0){
                int t=m%n;
                m=n;
                n=t;
            }
            return n;
        }
      //用函数封装加减乘除法    
        public static String Jiafa(int n,int m,int a,int b,int d,int e){
            String f ="";
            if(n==b&&m==e)
            {System.out.println(a/b+" + "+d/e+" =");f=(a/b)+(d/e)+"";}
            else if(n==b&&m!=e)
            {System.out.println(a/b+" + "+d/m+"/"+e/m+" =");
            f=(a/b)*(e/m)+d/m+"/"+e/m;}
            else if(n!=b&&m==e)
            {System.out.println(a/n+"/"+b/n+" + "+d/e+" =");
            f=a/n+(d/e)*(b/n)+"/"+b/n;}
            else if(n!=b&&m!=e)
            {System.out.println(a/n+"/"+b/n+" + "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a*e+b*d,b*e);
            if(k==b*e)
            f=(a*e+b*d)/k+"";
            else if(k!=b*e)
            f=(a*e+b*d)/k+"/"+b*e/k;
            }
            return f;
        }
        public static String Jianfa(int n,int m,int a,int b,int d,int e){
            String f = "";
            if(n==b&&m==e)
            {System.out.println(a/b+" - "+d/e+" =");f=(a/b)-(d/e)+"";}
            else if(n==b&&m!=e)
            {System.out.println(a/b+" - "+d/m+"/"+e/m+" =");
            f=(a/b)*(e/m)-d/m+"/"+e/m;}
            else if(n!=b&&m==e)
            {System.out.println(a/n+"/"+b/n+" - "+d/e+" =");
            f=a/n-(d/e)*(b/n)+"/"+b/n;}
            else if(n!=b&&m!=e)
            {System.out.println(a/n+"/"+b/n+" - "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a*e+b*d,b*e);
            if(k==b*e)
            f=(a*e-b*d)/k+"";
            else if(k!=b*e)
            f=(a*e-b*d)/k+"/"+b*e/k;
            }
            return f;
        }
        public static String Chengfa(int n,int m,int a,int b,int d,int e){
            String f = "";
            if(n==b&&m==e)
            {System.out.println(a/b+" X "+d/e+" =");f=(a/b)*(d/e)+"";}
            else if(n==b&&m!=e)
            {System.out.println(a/b+" X "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a/n*d,e);
            if(k==e)
            f=a*d/n/e+"";
            else if(k!=e)
                f=a*d/n/k+"/"+e/k;
            }
            else if(n!=b&&m==e)
            {System.out.println(a/n+"/"+b/n+" X "+d/e+" =");
            int k=MaxCommonDivisor(a*d/m,b);
            if(k==b)
                    f=a*d/m/b+"";
            else if(k!=b)
                    f=a*d/m/k+"/"+b/k;}
            else if(n!=b&&m!=e)
            {System.out.println(a/n+"/"+b/n+" X "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a*d/m/n,b*e/m/n);
            if(k==b*e/m/n)
            f=a*d/b/e+"";
            else if(k!=b*e/m/n)
            f=a*d/k/m/n+"/"+b*e/k/m/n;
            }
            return f;
        }
        public static String Chufa(int n,int m,int a,int b,int d,int e){
            String f="";
            if(n==b&&m==e)
            {System.out.println(a/b+" ÷ "+d/e+" =");f=(a/b)/(d/e)+"";}
            else if(n==b&&m!=e)
            {System.out.println(a/b+" ÷ "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a/n*e,d);
            if(k==d)
            f=a*e/n/d+"";
            else if(k!=d)
                f=a*e/n/k+"/"+d/k;
            }
            else if(n!=b&&m==e)
            {System.out.println(a/n+"/"+b/n+" ÷ "+d/e+" =");
            int k=MaxCommonDivisor(a*m,b*d);
            if(k==b*d)
                f=a*m/b/d+"";
                else if(k!=b*d)
                    f=a*m/k+"/"+b*d/k;}
            else if(n!=b&&m!=e)
            {System.out.println(a/n+"/"+b/n+" ÷ "+d/m+"/"+e/m+" =");
            int k=MaxCommonDivisor(a*e,b*d);
            if(k==b*d)
            f=a*e/b/d+"";
            else if(k!=b*d)
            f=a*e/k+"/"+b*d/k;
            }
            return f;
        }

        public static String Chufa(int a,int b){
            String f="";
            if(a%b==0){a++;}
            System.out.println(a+" ÷ "+b+" =");
            f=a/b+"......"+a%b;
            return f;
        }
}

运行结果截图:

(除法有余数仅在随机产生的整数除法中出现,真分数除法结果仍可以为分数)

一些错误bug的处理:

四则运算2的编程时间表
       日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/7 19:00 21:00 30分钟 1小时30分钟 主要对源程序进行了改进,将加减乘除用函数封装 完成了基本的框架
3/8 15:00 16:00 0 1小时 添加了嵌套条件,并对条件进行判断,用try和catch判断输入错误 开始时嵌套用switch,却忘记加入break(和break位置加入错误),致使思路混乱
  18:40 20:40 0 2小时 由于switch大量括号混乱,将整体框架删除重新写入。 switch与if结合,进行嵌套。
3/10 16:20 17:00 0 40分钟 对代码进行了改进,进一步完善了代码,增加了错误判断 基本完成前四层条件的嵌套
             
             

 

随机产生括号尚未完成,未完待续……

posted @ 2017-03-10 17:13  也许没资格  阅读(144)  评论(0编辑  收藏  举报