有理数类的设计

目录

1. 给出你的完整的有理数类的代码。尝试在该类中编写toString、equals方法。

2. 给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。

4. 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

5. 尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

  5.1 别人如何复用你的代码? 

  5.2 别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?

  5.3 有理数类的public方法是否设置合适?为什么有的方法设置为private?

  5.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?


1. 给出你的完整的有理数类的代码。尝试在该类中编写toString、equals方法。

// Rational.java
package rationalnumbers;

public class Rational {
    private int fenzi; // 分子
    private int fenmu; // 分母

    public Rational(int fenzi, int fenmu) {
        if (fenmu == 0) {
            throw new IllegalArgumentException("分母不能为0");
        }
        this.fenzi = fenzi;
        this.fenmu = fenmu;
        reduce();
    }

    private void reduce() {
        int gcd = gcd(fenzi, fenmu);
        this.fenzi /= gcd;
        this.fenmu /= gcd;
        if (this.fenmu < 0) {
            this.fenzi = -this.fenzi;
            this.fenmu = -this.fenmu;
        }
    }

    private int gcd(int a, int b) {
        while (b != 0) {
            int t = b;
            b = a % b;
            a = t;
        }
        return a;
    }

    public String toString() {
        return fenzi + "/" + fenmu;
    }

    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Rational rational = (Rational) obj;
        return fenzi == rational.fenzi && fenmu == rational.fenmu;
    }

    public Rational add(Rational other) {
        int newFenzi = this.fenzi * other.fenmu + other.fenzi * this.fenmu;
        int newFenmu = this.fenmu * other.fenmu;
        return new Rational(newFenzi, newFenmu);
    }

    public Rational multiply(Rational other) {
        int newFenzi = this.fenzi * other.fenzi;
        int newFenmu = this.fenmu * other.fenmu;
        return new Rational(newFenzi, newFenmu);
    }

    public int getFenzi() {
        return fenzi;
    }

    public int getFenmu() {
        return fenmu;
    }
}

2. 给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。

package rationalnumbers;
import rationalnumbers.Rational;

public class Main {
            public static void main(String[] args) {
            Rational r1 = new Rational(1, 2);
            Rational r2 = new Rational(1, 3);

            Rational sum = r1.add(r2);
            Rational product = r1.multiply(r2);

            System.out.println("Sum: " + sum);
            System.out.println("Product: " + product);
        }
    }

4. 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

因为它封装了有理数的数据和操作,提供了一个清晰的接口,并且隐藏了实现细节。这使得 Rational 类更容易维护和扩展。

5. 尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

  5.1 别人如何复用你的代码? 

可以通过导入 Rational 类并创建其实例来复用代码。他们可以调用 Rational 类的公共方法,如 addmultiplytoStringequals

  5.2 别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?

由于 Rational 类的内部属性是私有的(private),其他代码不直接依赖于这些属性。因此,即使属性名发生变化,也不会影响其他代码。

  5.3 有理数类的public方法是否设置合适?为什么有的方法设置为private?

Rational 类的公共方法设置为提供必要的操作,如加法、乘法、字符串表示和相等性检查。私有方法(如 reducegcd)用于实现细节,因此设置为私有。

  5.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?

Rational 类没有静态属性或方法,因为每个有理数实例都是独立的,不需要类级别的共享数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值