封装有理数类(Java)

java中并未对有理数(说人话:分数)操作进行封装,而对于入门选手来说自己就能简单封装,建议理解后自己从头写到尾,能够很好的体会到Java中对于各种操作的封装是如何进行的。

说人话:老师让写的,教材上的。

本代码不同于教材,多注释,能让小白快速理解。

包结构如图

 Denominator 就是我们要封装的分数类,类中应包含读取操作,加减乘除操作。

public class Denominator {
    //分子
    private int numerator = 1;
    //分母
    private int denominator = 1;

    public int getNumerator() {
        return numerator;
    }

    //设置分子分母(需要约分)
    public void setNum(int numerator,int denominator) {
        if(denominator == 0){
            System.out.println("分母不能设置为0");
            return;
        }
        if(numerator < 0 || denominator < 0){
            System.out.println("分子分母暂不支持为负数");
            return ;
        }
        int maxNum = maxNum(numerator,denominator);
        //让分子分母同时除于最大公约数(约分)
        numerator /= maxNum ;
        denominator /= maxNum;
        this.numerator = numerator;
        this.denominator = denominator;
    }

    public int getDenominator() {
        return denominator;
    }


    //求分子分母的最大公约数(约分需要用到)
    public int maxNum(int num1,int num2){
        //保证两数非负,不然运算不了
        if(num1 < 0){
            num1 = -num1;
        }
        if(num2 < 0 ){
            num2 = -num2;
        }
        //保证第一个是大数
        if(num1 < num2){
            int temp = num1;
            num1 = num2 ;
            num2 = temp;
        }
        if(num1 == 0 || num2 == 0){
            return 1;
        }
        int r = num1 % num2 ;
        while(r != 0){
            num1 = num2;
            num2 = r;
            r = num1 % num2 ;
        }
        return num2;
    }

    //加减乘除(返回一个分数类)
    public Denominator yunsuan(Denominator d,int type){
        //取出传进来的分子分母
        int fenzi = d.numerator;
        int fenmu = d.denominator;
        //创建一个分数类存放相加后的分数值
        Denominator denominator = new Denominator();
        if(type == 1){
            //传进来的值与本身的值相加(分母不变,分子相加)
            //这里要考虑同分母和不同分母
            //同分母直接分子相加
            if(this.denominator == fenmu){
                denominator.setNum(fenzi+this.numerator,this.denominator);
            }else if(this.denominator != fenmu){
                //不同分母先把分母变成相同的
                denominator.setNum(fenzi*this.denominator+this.numerator*fenmu,this.denominator*fenmu);
            }
        }else if(type == 2){
            //传进来的值与本身的值相减(分母不变,分子相减)
            //同上
            if(this.denominator == fenmu){
                denominator.setNum(this.numerator-fenzi,this.denominator);
            }else{
                denominator.setNum(this.numerator*fenmu-fenzi*this.denominator,this.denominator*fenmu);
            }
        }else if(type == 3){
            //传进来的值与本身的值相乘
            denominator.setNum(fenzi*this.numerator,fenmu*this.denominator);
        }else if(type == 4){
            //传进来的值与本身的值相除(剩他的倒数)
            denominator.setNum(this.numerator*fenmu,this.denominator*fenzi);
        }
        return denominator;
    }

    //重写输出方法(输出分数)
    @Override
    public String toString() {
        if(this.numerator % this.denominator == 0){
            return "该分数为 "+this.numerator / this.denominator;
        }else if(this.numerator == 0){
            return "该分数为 0";
        }
        return "该分数为 " +
                 this.numerator +
                " / " + this.denominator;
    }
}

再在Main类中使用 该分数类

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        //设置第一个分数
        Denominator denominator = new Denominator();
        System.out.println("请输入操作数分子 分母:(以空格隔开)");
        int nume1 = scanner.nextInt();
        int deno1 = scanner.nextInt();
        denominator.setNum(nume1,deno1);
        System.out.println("我要用这个分数运算了! "+denominator);
        //设置第二个分数
        Denominator d1 = new Denominator();
        System.out.println("请输入被操作数分子 分母:(以空格隔开)");
        int nume2 = scanner.nextInt();
        int deno2 = scanner.nextInt();
        d1.setNum(nume2,deno2);
        System.out.println("被操作数为 "+d1);

        System.out.println("-----------------------------------");

        //相加
        System.out.println("相加结果 "+denominator.yunsuan(d1,1));
        //相减
        System.out.println("相减结果 "+denominator.yunsuan(d1,2));
        //相乘
        System.out.println("相乘结果 "+denominator.yunsuan(d1,3));
        //相除
        System.out.println("相除结果 "+denominator.yunsuan(d1,4));

        System.out.println("-----------------------------------");

    }
}

运行结果:

 

总结:实际开发中很少涉及到对分数的操作,教材举例只是让刚接触的人员了解java内部是如何封装的,调用相关方法背后的代码逻辑。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值