有理数类的设计

一、有理数类代码

public class Rational {
    private int numerator;//分子
    private int denominator;//分母
    public Rational() {  
        this(0,1);
    }
  //构造函数
    public Rational(long numerator, long denominator) {
        long gcd = gcd(numerator,denominator);
        this.numerator= ((denominator>0)? 1 : -1)*numerator / gcd;
        this.denominator=Math.abs(denominator)/gcd;
    }
  //求最大公约数,便于简化有理数
    public static long gcd(long n,long d){
        long n1=Math.abs(n);
        long n2=Math.abs(d);
        int gcd=1;
        for(int k=1;k<=n1&&k<=n2;k++){
            if(n1%k==0&&n2%k==0){
                gcd=k;
            }
        }
        return gcd;
    }
    //生成器
    public long getNumerator(){
        return numerator;
    }
    public long getDenominator(){
        return denominator;
    }
    //实现加法
    public Rational add(Rational secondRational){
        long n=numerator*secondRational.getDenominator()+
                denominator*secondRational.getNumerator();
        long d=denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    //实现减法
    public Rational subtract(Rational secondRational){
        long n=numerator*secondRational.getDenominator()-
                denominator*secondRational.getNumerator();
        long d=denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    //实现乘法
    public Rational multiply(Rational secondRational){
        long n=numerator*secondRational.getNumerator();
        long d=denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    //实现除法
    public Rational divide(Rational secondRational){
        long n=numerator*secondRational.getDenominator();
        long d=denominator*secondRational.numerator;
        return new Rational(n,d);
    }
    //重写toString类
    public String toString(){
        if(denominator==1){
            return numerator+"";
        }else{
            return numerator+"/"+denominator;
        }
    }
    
}

二、测试代码

public static void main(String[] args){
        Rational x=new Rational(5,3);
        Rational y=new Rational(8,5);
        System.out.println(x.toString());
        System.out.println(y.toString());
        System.out.println(x.add(y));
        System.out.println(x.subtract(y));
        System.out.println(x.multiply(y));
        System.out.println(x.divide(y));

    }
}

三、讨论

1.描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
c语言和Java有一部分功能是相似的,但是Java更加面向对象,因为Java直接在类里把类的属性什么的都写清楚了,在同一个包里的另一个class里直接用就可以了。
c语言设计时更偏向过程,要用怎样的函数来实现这个过程。
2.别人如何复用你的代码?
使用我代码中的有理数类的属性就可以复用。
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,不会影响。
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,因为有的方法只能运用在类中,不能随便更改,保证数据的安全性,而有的方法希望可以被使用,因此就通过public方法来访问。

posted @ 2020-10-04 02:28  林毅()  阅读(98)  评论(0编辑  收藏  举报