有理数类的设计

一、有理数类的代码

package rational;


public class Rational {
    
    private long Numerator = 0;//分子
    private long Denominator = 1;//分母
    
    //访问private中的Numerator和Denominator;
    
    
    //构造函数
    public Rational(long Numerator, long Denominator) {
        // TODO Auto-generated constructor stub
        long gcd = gcd(Numerator,Denominator);
        long flag;
        if(Denominator>0) {
            flag = 1;
        }else {
            flag = -1;
        }
        this.Numerator = flag * Numerator / gcd;
        this.Denominator = Math.abs(Denominator) / gcd;
    }
    
    //生成器
    public long getNumerator() {
        return Numerator;
    }
    public long getDenominator() {
        return Denominator;
    }
    
    //最大公约数
    private long gcd(long Numerator, long Denominator) {
        // TODO Auto-generated method stub
        long X = Math.abs(Numerator);
        long Y = Math.abs(Denominator);
        long gcd = 1;
        for (int i = 1; i < Y&&i <= X; i++) {
            if(X % i == 0&&Y % i == 0) {
                gcd = i;
            }
        }
        return gcd;
    }
    
    //转换为double类型
    public double doubleValue(Rational s) {
        double value = Numerator * 1.0 / Denominator;
        return value; 
    }
    
    //加法
    public Rational Add(Rational s) {
        long X = Numerator * s.getDenominator() + Denominator * s.getNumerator();
        long Y = Denominator * s.getDenominator();
        /*分子=分子1*分母2+分母1*分子2
         * 分母=分母1*分母2*/
        return new Rational(X,Y);
    }
    
    //减法
    public Rational Subt(Rational s) {
        long X = Numerator * s.getDenominator() - Denominator * s.getNumerator();
        long Y = Denominator * s.getDenominator();
        return new Rational(X,Y);
    }
    
    //乘法
    public Rational Mult(Rational s) {
        long x = Numerator * s.getNumerator();
        long Y = Denominator * s.getDenominator();
        return new Rational(x,Y);
    }
    
    //除法
    public Rational Divi(Rational s) {
        long X = Numerator * s.getDenominator();
        long Y = Denominator * s.getNumerator();
        return new Rational(X,Y);
    }
    
    //比较
    public int Compare(Rational s) {
        if(Numerator == s.getNumerator()) {
            return 0;//test1 = test2
        }else if((Numerator > s.getNumerator()&&Denominator <= s.getDenominator())||(Numerator == s.getNumerator()&&Denominator < s.getDenominator())) {
            return 1;//test1 > test2
        }else {
            return -1;//test1 <test2
        }
    }
    
}

二、测试代码

package rational;

import rational.Rational;

public class Main {
     public static void  main(String[] args) {
        // TODO Auto-generated method stub
         Rational test1 = new Rational(5,27);
         Rational test2 = new Rational(8,27);
         
        System.out.println("将test1转换为double型的值为:"+test1.doubleValue(test1)+";");
         System.out.println("将test2转换为double型的值为:"+test2.doubleValue(test2)+";");
         System.out.println("test1 + test2 = "+test1.Add(test2).getNumerator()+'/'+test1.Add(test2).getDenominator()+";");
         System.out.println("test1 - test2 = "+test1.Subt(test2).getNumerator()+'/'+test1.Subt(test2).getDenominator()+";");
         System.out.println("test1 * test2 = "+test1.Mult(test2).getNumerator()+'/'+test1.Mult(test2).getDenominator()+";");
         System.out.println("test1 / test2 = "+test1.Divi(test2).getNumerator()+'/'+test1.Divi(test2).getDenominator()+";");
         switch(test1.Compare(test2)) {
          case 1:System.out.println("test1与test2相比较的结果为:test1 > test2");
          case 0:System.out.println("test1与test2相比较的结果为:test1 = test2");
          case -1:System.out.println("test1与test2相比较的结果为:test1 < test2");
         }
         
     }
}

三、测试截图

四、讨论

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

C语言是一种通用的、面向过程式的加算计程序设计语言,是仅产生少量的机器语言以及不需要腾和运行环境支持便能运行的。Java是面向对象编程,它利用了类和对象编程。类是对于事物的抽象,对象是具体的一个事物。

2.别人如何复用你的代码?

导入我的代码数据包,并且在首行import调用我的代码数据包。

3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

依赖,有理数类的属性被修改会影响调用我的有理数类代码。

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

​ 合适。因为设置为private型,他人就不能在其他的类中使用和修改,对代码有一定的保护作用。

posted @ 2020-10-04 11:13  长安某•  阅读(99)  评论(0编辑  收藏  举报