有理数类的设计

1.有理数类的代码

package rational;
      public class Rational{
            private long numerator = 0;//分子
            private long denominator = 1;//分母

      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 numerator, long denominator){//求最大公约数方便化简
            long n = Math.abs(numerator);
            long d = Math.abs(denominator);
            int gcd = 1;
            for(int i=1;i<=d&&i<=n;i++){
                  if(n%i==0&&d%i==0)
                        gcd = i;
            }
            return gcd;
      }
      public long getNumerator(){//生成器
            return numerator;
      }
      public long getDenominator(){
            return denominator;
      }
      public String toString(){//toString类
          if(denominator==1){
                return numerator+"";
          }
          else return numerator+"/"+denominator;
    }
	public String substract(Rational test2) {
		// TODO Auto-generated method stub
		return null;
	}
      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);
      }
      public boolean equals(Object praml){//判断是否相等
            if((this.subtract((Rational)(praml))).getNumerator()==0){
                  return true;
            }
            else return false;
      }
     
}

2.测试代码

package test;

import rational.Rational;

public class Main{
      public static void main(String[] args){
            Rational r1 = new Rational(2,5);
            Rational r2 = new Rational(-1,4);
            System.out.println("相加 ="+r1.add(r2));
            System.out.println("相减 = "+r1.subtract(r2));
            System.out.println("相乘 = "+r1.multiply(r2));
            System.out.println("相除 = "+r1.divide(r2));
      }
}

测试结果

3.讨论

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

C语言的更加偏向于整个过程,而Java则是更多的编写类,要调用的时候方便,更加倾向于面向对象

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

只需要使用我代码中的属性就好

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

是,会影响。

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

因为public是可以公共访问,而private是仅限私人访问,可以设置访问权限

posted @ 2020-10-04 11:14  ……,  阅读(85)  评论(0编辑  收藏  举报