有理数类的设计

仿照BigDecimal类以面向对象的方式设计有理数类。
1.给出你的有理数类的代码。

package p1;
public class Rational{
      private int numerator;//分子
      private int denominator;//分母

      public Rational (int numerator,int denominator)//构造函数
      {
          this.numerator = numerator;
          this.denominator = denominator;
      }

      public int getNumerator()//获取分子
      {
          return this.numerator;
      }

      public int getDenominator()//获取分母
      {
          return this.denominator;
      }
 private static int gcd(int n,int d)//求最大公约数
    {
        int a = Math.abs(n);
        int b = Math.abs(d);
        int gcd = 1;
        for (int k=2;k<=a && k<=b;k++)
        {
            if(a%k==0&&b%k==0) {
                gcd=k;
            }
        }
        return gcd;
    }
      public Rational add(Rational first,Rational second)//加法
      {
          int n = first.numerator * second.denominator + second.numerator * first.denominator;
          int d = first.denominator * second.denominator;
          return new Rational(n,d);
      }

      public Rational subtract(Rational first,Rational second)//减法
      {
          int n = first.numerator * second.denominator - second.numerator * first.denominator;
          int d = first.denominator * second.denominator;
          return new Rational(n,d);
      }

      public Rational multiply(Rational first,Rational second)//乘法
      {
          int n = first.numerator * second.numerator;
          int d = first.denominator * second.denominator;
          return new Rational(n,d);
      }

      public Rational divide(Rational first,Rational second)//除法
      {
          int n = first.numerator * second.denominator;
          int d = first.denominator * second.numerator;
          return new Rational(n,d);
      }

      public boolean equal(Rational first,Rational second) //判断是否相等
      {
          if ((first.numerator == second.numerator)&(first.denominator == second.denominator)) {
              return true;
          } else {
              return false;
          }
      }

      public int intValue()     //转换为int型
      {
          return this.numerator / this.denominator;
      }
      public long longValue()   //转换为long型
      {
          return (long)doubleValue();
      public double doubleValue()//转换为double型
      {
          return this.numerator*1.0 / this.denominator;
      }
      public float floatValue()  //转换为float型
      {
          return (float)doubleValue();
      }
      public String toString()   //转换为string型
      {
          return this.numerator + "/" + this.denominator;
      }
      }
 
给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
类名、变量名命名需符合Java规范
public class Main {
    public static void main(String[] args){
        Rational x=new Rational(1,6);
        Rational y=new Rational(3,5);
        System.out.println("x="+x.toString());
        System.out.println("y="+y.toString());
        System.out.println("x+y="+x.add(y));
        System.out.println("x-y="+x.subtract(y));
        System.out.println("x*y="+x.multiply(y));
        System.out.println("x/y="+x.divide(y));
        System.out.println(x.intValue());
        System.out.println(x.longValue());
        System.out.println(x.doubleValue());
        System.out.println(x.floatValue());
        System.out.println(x.toString());
    }
}


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

设计的类有属性和方法,java倾向于面向对象,封装了很多类和接口,以功能来解决问题;而c语言倾向于面向过程,即程序要实现的功能步骤
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
别人如何复用你的代码?         导入我的有理数类属性
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?      依赖;会影响
有理数类的public方法是否设置合适?为什么有的方法设置为private?      合适; 因为设置成private时,只有类的内部才能访问到,外部没法访问,可以保护数据;设置成public,可以被任意类访问,被调用时方便

 

posted @ 2020-10-04 09:34  爆炒蒟蒻  阅读(172)  评论(0编辑  收藏  举报