1. 程式人生 > 其它 >java——有理數類

java——有理數類

問題列表:

1.仿照BigDecimal類以面向物件的方式設計有理數類。
給出你的完整的有理數類的程式碼.
給出你的測試程式碼。要在與有理數類不同包的其他類中呼叫有理數類。
類名、變數名命名需符合Java規範。

2.嘗試回答與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?

3.嘗試從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論。
(1)別人如何複用你的程式碼?
(2)別人的程式碼是否依賴你的有理數類的內部屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?
(3)有理數類的public方法是否設定合適?為什麼有的方法設定為private?
(4)你的類裡面有static屬性或方法嗎?如果有,為什麼要設定為static的?

一、有理數類設計程式碼:
package com.company;

public class Rational {
    private int numerator; // 分子

    private int denominator; // 分母

    public Rational(int n, int d) {
        this.numerator = n;

        this.denominator = d;

    } // 建構函式

    public int getNumerator() {
        return numerator;

    } // 獲取分子

    public int getDenominator() {
        return denominator;

    } // 獲取分母

四則運算

    public Rational add(Rational secondRational) {
        int n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();

        int d = denominator * secondRational.getDenominator();

        return new Rational(n, d);

    } // 加法

    public Rational subtract(Rational secondRational) {
        int n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();

        int d = denominator * secondRational.getDenominator();

        return new Rational(n, d);

    } // 減法

    public Rational multiply(Rational secondRational) {
        int n = numerator * secondRational.getNumerator();

        int d = denominator * secondRational.getDenominator();

        return new Rational(n, d);

    } // 乘法

    public Rational divide(Rational secondRational) {
        int n = numerator * secondRational.denominator;

        int d = denominator * secondRational.numerator;

        return new Rational(n, d);

    } // 除法

比較大小

    public int compare(Rational r2) {
        long n = this.numerator * r2.denominator - this.denominator * r2.numerator;

        if (n > 0)

            System.out.println("r1>r2");

        else if (n < 0)

            System.out.println("r1<r2");

        else

            System.out.println("r1==r2");

        return 0;

    } // 比較大小

返回字串

    public String toString() {
        if (denominator == 1)

            return numerator + "";

        else

            return numerator + "/" + denominator;

    } // 返回字串

有理數型別轉化為其他型別

    public int intValue() {
        return (int) doubleValue1();

    } // 將Rational轉為int型

    public long longValue() {
        return (long) doubleValue1();

    } // 將Rational轉為long型

    public float floatValue() {
        return (float) doubleValue1();

    } // 將Rational轉為float型

    public double doubleValue1() {
        return numerator * 1.0 / denominator;

    } // 將Rational轉為double型
}
二、不同包下呼叫有理數類程式碼:
package test;
import com.company.*;

    public class Main {
        public static void main(String[] args) {
            Rational test1 = new Rational(-1, 5);

            Rational test2 = new Rational(4, 7);

            System.out.println("test1 + test2 = " + test1.add(test2));

            System.out.println("test1 - test2 = " + test1.subtract(test2));

            System.out.println("test1 * test2 = " + test1.multiply(test2));

            System.out.println("test1 / test2 = " + test1.divide(test2));

            System.out.println("將test1轉為int型:" + test1.intValue());

            System.out.println("將test1轉為long型:" + test1.longValue());

            System.out.println("將test2轉為float型:" + test2.floatValue());

            System.out.println("將test2轉為double型:" + test2.doubleValue1());

            System.out.println("將test2轉為toString型:" + test2.toString());

            test1.compare(test2);

        }
    }

測試截圖如下:

1.與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?

答:因為設計的類的方法和屬性是針對它本身特性來考慮的,面向物件;而C語言更多通過函式呼叫,面向過程。

2.從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論.
(1)別人如何複用你的程式碼?

答:java中的包 (package)”機制能夠實現程式碼的複用,故匯入包含有編寫好的有理數類的包即可。

(2)別人的程式碼是否依賴你的有理數類的內部屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?

答:別人的程式碼會依賴於我的有理數類的屬性,因為別人在與我的有理數類不同包的其他類中呼叫了我的有理數類;由於我的有理數類的屬性使用private進行了封裝,所以當我的有理數類的屬性修改時,不會影響他人呼叫我的有理數程式碼。

(3)有理數類的public方法是否設定合適?為什麼有的方法設定為private?

答:有理數類的public方法設定合理,方便呼叫,包中的其他類都可以呼叫。
如有理數的屬性設為private,這正是有理數的不能輕易改變的程式碼部分。比如一些產品屬性是不便使用客戶修改的這種情況,就需要設定private。同時設為private也更好的保證程式碼的安全性。

(4)你的類裡面有static屬性或方法嗎?如果有,為什麼要設定為static的?

答:無。