JAVA-有理数的设计

一.仿照BigDecimal类设计有理数类的代码

package xs01;

public class Rational {

	private int num;   //分子
    private int den; //分母

    public Rational() {
          num=0;
          den=1;
    }
    public Rational (int num,int den) {
		int gcd=gcd(num, den);
		this.num=((den>0)?1:-1)*num/gcd;
		this.den=Math.abs(den)/gcd;
    }
    private int GetNumerator() {
 		// TODO Auto-generated method stub
 		return num;
 	}
    public int GetDenominator() {
          return den;
    }
    private static int gcd(int a,int b) {
          if(a%b==0)
                return b;
          else
                return gcd(b, a%b);
   }
    //基础计算
    public Rational add(Rational newRational) {
          int a=this.num*newRational.GetDenominator()+this.den*newRational.GetNumerator();
          int b=this.den*newRational.GetDenominator();
          return new Rational(a,b);
    }
 
	public Rational subtract(Rational newRational) {
          int a=this.num*newRational.GetDenominator()-this.den*newRational.GetNumerator();
          int b=this.den*newRational.GetDenominator();
          return new Rational(a,b);
    }
    public Rational multiply(Rational newRational) {
          int a=this.num*newRational.GetNumerator();
          int b=this.den*newRational.GetDenominator();
          return new Rational(a,b);
    }
    public Rational divide(Rational newRational) {
          int a=this.num*newRational.GetDenominator();
          int b=this.den*newRational.GetNumerator();
          return new Rational(a,b);
    }

    public void compare(Rational newRational) {
          if (this.subtract(newRational).GetNumerator()<0)
                System.out.println("a<b");
          else if(this.subtract(newRational).GetNumerator()==0)
      	 System.out.println("a=b");
          else
      	System.out.println("a>b");
    }
    //转换类型
    public double doubleValue() {
          return this.num*1.0/this.den;
    }
    public int intValue() {
          return (int)doubleValue();
    }
    public long longValue() {
          return (long)doubleValue();
    }
    public float floatValue()  {
          return (float)doubleValue();
    }
    public String toString() {
          if (this.den==1)
                return this.num+"";
          else
                return this.num+"/"+this.den;
    }

}

二.测试代码

package xs02;
import xs01.Rational;
public class Main_1 {

	public static void main(String[] args) {
		Rational x=new Rational(2,7);
        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));
        x.compare(y);
        System.out.println(x.intValue());
        System.out.println(x.longValue());
        System.out.println(x.floatValue());
        System.out.println(x.doubleValue());
	}
}

三.运行截图

四.讨论

1.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
发现c语言和java的不同。我们使用C语言的时候主要使用函数,但Java使用的是面向对象的类。
2.别人如何复用你的代码?
直接导入我编写的包,调用其中类即可
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
否,并不依靠;是的
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
有些开放而有些属性设置为private,因为private本身可以保证数据的安全性,当然也有一些方法设置为private,因为我们不需要直接去调用。

posted @ 2020-10-04 21:11  字圣大人  阅读(97)  评论(0)    收藏  举报