软件工程个人作业02

四则运算2的设计思路:

  因为老师添加了一些要求,比如说能够通过参数来控制有无乘除法,加减有无负数,除法是否有余数。

所以,我意识到,应该把每个式子都写成函数,比如说,整数加法式子,减法式子,都写成函数,然后再通过参数来控制

是否产生此类型的式子,以及式子的一些格式。

四则运算的代码如下:

  Main.java

  

import java.util.*;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("请输入数值范围:");
        Scanner scan=new Scanner(System.in);
        int range=scan.nextInt();
        
        //新想法,可以在用户还没做出选择之前,先出点没有任何要求的题
        System.out.println("需要定制多少题:");
        int number=scan.nextInt();
        int alnumber=0;  //代表已出题目的数目
        int i; //用于循环
        Random ran=new Random();   //专门用于产生随机数
        int ranNumber;//存随机产生的数
        //建一个Ways类的对象,用于方法的调用
        Ways ways=new Ways();
        
        //用于存储用户的选择
        char choice[]=new char[4];
        System.out.println("是否需要乘除法?");
        choice[0]=scan.next().charAt(0);
        System.out.println("是否需要括号?");
        choice[1]=scan.next().charAt(0);
        System.out.println("加减是否需要负数?");
        choice[2]=scan.next().charAt(0);
        System.out.println("除法是否需要余数?");
        choice[3]=scan.next().charAt(0);
        
        for(i=0;i<number;i++){
            //开始出题
            switch(ran.nextInt(8)+1){
            case 1:
                System.out.println(ways.addInt(range));
                break;
            case 2:
                System.out.println(ways.mimusInt(range, choice[2]));
                break;
            case 3:
                
                if(ways.multiplyInt(range, choice[0])!=null){
                    System.out.println(ways.multiplyInt(range, choice[0]));
                }
                else i--;
                break;
            case 4:
                if(ways.divideInt(range, choice[0],choice[3])!=null){
                    System.out.println(ways.divideInt(range, choice[0],choice[3]));
                }
                else i--;
                break;
            case 5:
                    System.out.println(ways.add(range));
                break;
            case 6:
                    System.out.println(ways.minus(range,choice[2]));
                break;
            case 7:
                if(ways.multiply(range,choice[0])!=null){
                    System.out.println(ways.multiply(range,choice[0]));
                }
                else i--;
                break;
            case 8:
                if(ways.divide(range,choice[0])!=null){
                    System.out.println(ways.divide(range,choice[0]));
                }
                else i--;
                break;
            }
        }
    }

}

  Ways.java

  

import java.util.*;


public class Ways {
    public String addInt(int range){
        //整数加法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=a+b;
        String result=a+"+"+b+"="+c;
        return result;
    }
    public String mimusInt(int range ,char a1){
        //整数减法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        if(a1=='n')
        {
            if(a<b){
                int temp;
                temp=a;
                a=b;
                b=temp;
            }
        }
        int c=a-b;
        String result=a+"-"+b+"="+c;
        return result;
    }
    public String multiplyInt(int range,char a1){
        //整数乘法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=a*b;
        String result=a+"*"+b+"="+c;
        if(a1=='n'){
            result=null;
        }
        return result;
    }
    public String divideInt(int range,char a1,char a2){
        //整数除法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        while(b==0){
            b=ran.nextInt(range)+1;
        }
        if(a2=='n')
        {
            while(a%b!=0){
                a=ran.nextInt(range)+1;
                b=ran.nextInt(range)+1;
                while(b==0){
                    b=ran.nextInt(range)+1;
                }
            }
        }
        int c=a/b;
        String result=a+"/"+b+"="+c;
        if(a1=='n'){
            result=null;
        }
        return result;
    }
    public String add(int range){
        //真分数加法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=ran.nextInt(range)+1;
        int d=ran.nextInt(range)+1;
        
        //分母不能为零
        while (b==0){
            b=ran.nextInt(range);
        }
        while (d==0){
            d=ran.nextInt(range);
        }
        
        if(a>b){
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        if(c>d){
            int temp;
            temp=c;
            c=d;
            d=temp;
        }
        
        String result="("+reduce(a,b)+")"+"+"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"+");
        return result;
    }
    
    //用于判断两个分数的大小
    public boolean judge(int a,int b,int c,int d ){
        if(a*d-b*c<0){
            return false;
        }
        return true;
    }
    public String minus(int range,char a1){
        //真分数减法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=ran.nextInt(range)+1;
        int d=ran.nextInt(range)+1;
        
        //分母不能为零
        while (b==0){
            b=ran.nextInt(range);
        }
        while (d==0){
            d=ran.nextInt(range);
        }
        
        if(a>b){
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        if(c>d){
            int temp;
            temp=c;
            c=d;
            d=temp;
        }
        if(a1=='n'){
            while(judge(a,b,c,d)==false){
                a=ran.nextInt(range)+1;
                b=ran.nextInt(range)+1;
                c=ran.nextInt(range)+1;
                d=ran.nextInt(range)+1;
                if(a>b){
                    int temp;
                    temp=a;
                    a=b;
                    b=temp;
                }
                if(c>d){
                    int temp;
                    temp=c;
                    c=d;
                    d=temp;
                }
            }
        }
        String result="("+reduce(a,b)+")"+"-"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"-");
        return result;
    }
    public String multiply(int range ,char a1){
        //真分数乘法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=ran.nextInt(range)+1;
        int d=ran.nextInt(range)+1;
        
        //分母不能为零
        while (b==0){
            b=ran.nextInt(range);
        }
        while (d==0){
            d=ran.nextInt(range);
        }
        
        if(a>b){
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        if(c>d){
            int temp;
            temp=c;
            c=d;
            d=temp;
        }
        
        String result="("+reduce(a,b)+")"+"*"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"*");
        
        if(a1=='n'){
            result=null;
        }
        return result;
    }
    public String divide(int range,char a1){
        //真分数除法
        Random ran=new Random();
        int a=ran.nextInt(range)+1;
        int b=ran.nextInt(range)+1;
        int c=ran.nextInt(range)+1;
        int d=ran.nextInt(range)+1;
        //分母不能为零
        while (b==0){
            b=ran.nextInt(range);
        }
        while (d==0){
            d=ran.nextInt(range);
        }
        
        if(a>b){
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        if(c>d){
            int temp;
            temp=c;
            c=d;
            d=temp;
        }
        String result="("+reduce(a,b)+")"+"/"+"("+reduce(c,d)+")"+"="+calculate(reduce(a,b),reduce(c,d),"/");
        if(a1=='n'){
            result=null;
        }
        return result;
    }
    public int maxCommon(int a ,int b)
    {
        //循环法求两个数的最大公约数
        
        //保证第一个参数大于第二个参数
        if(a<b)
        {
            int temp;
            temp=a;
            a=b;
            b=temp;
        }
        while(a%b!=0)   //在余数不为零时循环
        {
            int temp=a%b;
            a=b;
            b=temp;
        }
        return b;  //返回最大公约数
    }
    
    public int minCommon(int a,int b)
    {
        //求最小公倍数
        return a*b/maxCommon(a,b);
    }
    
    public String reduce(int a ,int b)
    {
        //对于a/b组成的分数进行约分
        
        //第一步就是找出两者的最大公约数
        int c=maxCommon(a,b);
        
        //分子分母约分
        a=a/c; 
        b=b/c;
        
        //把a,b转换成分数返回
        String temp=a+"/"+b;
        return temp;
    }
    public String calculate(String a,String b,String c) //参数分别代表第一个分数,第二个分数,以及运算符
    {
        int a1=Integer.parseInt(a.substring(0,a.indexOf("/")));//代表a的分子
        int a2=Integer.parseInt(a.substring(a.indexOf("/")+1));//代表a的分母
        int b1=Integer.parseInt(b.substring(0,b.indexOf("/")));//代表b的分子
        int b2=Integer.parseInt(b.substring(b.indexOf("/")+1));//代表b的分母
        if(c.equals("+"))
        {
            //首先求两个分母的最小公倍数,进行通分
            int temp=minCommon(a2,b2);
            a1=temp/a2*a1;
            b1=temp/b2*b1;
            
            //求合并后的分子
            int temp1=a1+b1;
            
            String temp2=reduce(temp1,temp);
            return temp2;
        }
        else if(c.equals("-"))
        {
            //首先求两个分母的最小公倍数,进行通分
            int temp=minCommon(a2,b2);
            a1=temp/a2*a1;
            b1=temp/b2*b1;
            
            //求合并后的分子
            int temp1=a1-b1;
            
            return reduce(temp1,temp);
        }
        else if(c.equals("*"))
        {
            //直接把分母相乘得到合并后的分母
            int temp=a2*b2;
            
            //求合并后的分子
            int temp1=a1*b1;
            
            return reduce(temp1,temp);
        }
        
        else if(c.equals("/"))
        {
            //分数相除就是第一个分数乘以第二个分数的倒数
            int temp=a2*b1;
            
            //求合并后的分子
            int temp1=a1*b2;
            
            return reduce(temp1,temp);
        }
        String xuhaojun="成功了";
        return xuhaojun;
        
    }
    public String equation(int range,char a1){
        Random ran=new Random();
        int number=ran.nextInt(9)+2;//决定这个式子有几个数
        int number1=number/2;
        for(int i=0;i<number1;i++){
            
        }
        String result="";
        if(a1=='n'){
            result=null;
        }
        return result;
    }
}

  程序结果截图:

程序总结:

  通过这个程序,我真是深刻的认识到了分而治之的思想,当我们遇到一个问题时,不管这个问题怎么样,

我们应该想到这个问题分解成一些比较小的问题,然后再分别去解决这些小问题。

还有就是一定要把解决问题的手段封装到方法里,这样会便于以后的管理。

 

项目计划日志:

  

 

日期

任务

听课

编写程序

阅读课本

准备考试

日总计

周一

60

60

 

 

120

周二

 

 

 

 

 

周三

 

180

 

 

180

周四

 

120

 

 

120

周五

 

 

 

 

 

周总计

60

360

 

 

420

时间记录日志:

  

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/6

14:00

16:00

 

120

听课

软件工程概论

 

 

 

22:00

22:40

 

40

写思路

把程序的思路写下来

 

 

3/8

15:00

18:00

 

180

编程序

四则运算2

 

 

3/9

20:00

22:00

 

120

编程序

四则运算2

 

 

3/10

16:00

18:00

 

120

写报告

四则运算2 的报告

 

 

 

posted @ 2017-03-10 19:06  Kefi123  阅读(211)  评论(0编辑  收藏  举报