1. 程式人生 > 實用技巧 >3.1-互評-OO設計-有理數類的設計

3.1-互評-OO設計-有理數類的設計

3.1-互評-OO設計-有理數類的設計

仿照BigDecimal類以面向物件的方式設計有理數類

一、給出你的有理數類的程式碼

package oo3_1;

public class Rational {
	private int num;      //分子
	private int den;      //分母
	public int GetNumerator() {
		return num;
	}
	public int GetDenominator() {
		return den;
	}
	private static int gcd(int x,int y) {
		if(x%y==0)
			return y;
		else
			return gcd(y, x%y);
	}
	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;
	}
	public Rational() {
		num=0;
		den=1;
	}
	public Rational add(Rational newRational) {
		int x=this.num*newRational.GetDenominator()+this.den*newRational.GetNumerator();
		int y=this.den*newRational.GetDenominator();
		return new Rational(x,y);
	}
	public Rational subtract(Rational newRational) {
		int x=this.num*newRational.GetDenominator()-this.den*newRational.GetNumerator();
		int y=this.den*newRational.GetDenominator();
		return new Rational(x,y);
	}
	public Rational multiply(Rational newRational) {
		int x=this.num*newRational.GetNumerator();
		int y=this.den*newRational.GetDenominator();
		return new Rational(x,y);
	}
	public Rational divide(Rational newRational) {
		int x=this.num*newRational.GetDenominator();
		int y=this.den*newRational.GetNumerator();
		return new Rational(x,y);
	}
	public String toString() {
        if (this.den==1)
        {
            return this.num+"";
        }else{
            return this.num+"/"+this.den;
        }
    }
    public void compare(Rational newRational) {
        if (this.subtract(newRational).GetNumerator()<0)
            System.out.println("x<y");
        else if(this.subtract(newRational).GetNumerator()==0)
        	 System.out.println("x=y");
        else
        	System.out.println("x>y");
    }
    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();
    }
}

二、給出你的測試程式碼,要在與有理數類不同包的其他類中呼叫有理數類

package oo3_1;
import oo3_1.Rational;
public class text {
	public static void main(String[] args){
        Rational x=new Rational(2,3);
        Rational y=new Rational(6,7);
        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());
    }
}

三、執行截圖

四、嘗試描述怎麼與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?

c語言更加面向過程,而java是對類的編寫,可以直接進行呼叫

五、嘗試從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論。

a.別人如何複用你的程式碼?
匯入自己編寫的有理數包,從而呼叫類中的屬性和方法
b.別人的程式碼是否依賴你的有理數類的屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?
依賴;不影響;
c.有理數類的public方法是否設定合適?為什麼有的方法設定為private?
合適,因為設定為private的方法只能在該類中執行,很好保護了一些重要程式碼的“隱私”。通過public的方法來訪問其他的需要被使用到的程式碼,提高程式碼的安全性。