ADT之練習題

ADT習題:


雖然前面講了ADT的相關概念,以及自定義了String和Date來演示ADT(抽象數據類型),但還是需要做點練習題,鞏固自己,

如果你真的想判斷自己是否掌握了ADT的使用,那就先看題,不要看我寫的程序,自己寫好了,再來進行對比,這樣相信你會

收穫兩個IDEA。


題1:

編寫一個名爲Point的類以描述平面上的一個點,它包含點的x座標和y座標這兩個數據字段。

要求提供對其中任何一個數據字段進行設置與獲取的方法,以及求兩點之間距離的方法,

還要求提供一個toString()方法,以返回表示點的(x,y)座標的字符串。


定義一個Point的接口:

package com.java.framework.data_structure.adt;

/**
 * Created by Ryan Xu on 2016/4/30.
 */
public interface Point {

    public String toString();

    //獲取和另外一個點之間的距離
    public double getDistance(Point point);

}


定義一個具體的Point類,ConcretePoint針對Point的抽象定義進行實現

package com.java.framework.data_structure.adt;

/**
 * Created by Ryan Xu on 2016/4/30.
 * 表示一個具體的點
 */
public class ConcretePoint implements Point {

    private double x, y;

    /**
     * 構造方法
     * @param x
     * @param y
     */
    public ConcretePoint(float x, float y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public double getDistance(Point point) {
        ConcretePoint mPoint = (ConcretePoint) point;
        double result = Math.pow((x - ((ConcretePoint) point).x), 2) + Math.pow((y - ((ConcretePoint) point).y), 2);
        return Math.sqrt(result);
    }

    @Override
    public String toString() {
        return "(" + x + "," + y + ")";
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }
}


最後通過Client進行測試:

package com.java.framework;

import com.java.framework.data_structure.adt.ConcretePoint;
import com.java.framework.data_structure.adt.Point;

public class Client {

    public static void  main(String[] args) {

        //System.out.println("Ryan Xu 2016/4/28");

        Point p1 = new ConcretePoint(2,2);
        Point p2 = new ConcretePoint(2,2);
        double d = p1.getDistance(p2);
        System.out.println(p1.toString() + "與" + p2.toString() + "兩點間的距離爲" + d);

    }
}


題2:

編寫一個名爲Rational(有理數)的類以執行分數運算,它包含numerator(分子)和denominator(分母)這兩個數據字段。要求提供以下public操作:

a.兩個分數加、減、乘、除運算

b.判斷兩個分數是否相等

c.比較兩個分數的大小

d.以x/y 的格式返回表示分數的字符串,其中x爲分子,y爲分母


定義有理數Rational的規格說明

package com.java.framework.data_structure.adt;

/**
 * 有理數Rational的規格說明
 * Created by Ryan Xu on 2016/4/30.
 */
public interface Rational {

    /**
     * 加法
     * @param rational
     * @return
     */
    public double addition(Rational rational);

    /**
     * 減法
     * @param rational
     * @return
     */
    public double subtraction(Rational rational);

    /**
     * 乘法
     * @param rational
     * @return
     */
    public double multiplication(Rational rational);

    /**
     * 除法
     * @param rational
     * @return
     */
    public double division(Rational rational);

    /**
     * 判斷是否相等
     * @param rational
     * @return
     */
    public boolean equals(Rational rational);

    /**
     * 比較大小
     * @param rational
     * @return
     */
    public int compareTo(Rational rational);

    /**
     * 返回對應格式的字符串
     * @return
     */
    public String toString();

}


定義有理數Rational 的具體實現,RationalImpl類

package com.java.framework.data_structure.adt;

/**
 * 有理數Rational規格說明的具體實現
 * Created by Ryan Xu on 2016/4/30.
 */
public class RationalImpl implements Rational {

    private int numerator;//分子
    private int denominator;//分母

    /**
     * 構造方法
     *
     * @param numerator
     * @param denominator
     */
    public RationalImpl(int numerator, int denominator) {
        if (denominator == 0) {
            throw new ArithmeticException("分母不能爲0");
        }
        this.numerator = numerator;
        this.denominator = denominator;
    }

    @Override
    public double addition(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        double result = (double) (numerator * other.denominator + denominator * other.numerator) / (denominator * other.denominator);
        return result;
    }

    @Override
    public double subtraction(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        double result = (double) (numerator * other.denominator - denominator * other.numerator) / denominator * other.denominator;
        return result;
    }

    @Override
    public double multiplication(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        double result = (double) (numerator * other.numerator) / (denominator * other.denominator);
        return result;
    }

    @Override
    public double division(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        if (other.numerator == 0) {
            throw new ArithmeticException("不能除以0");
        }
        double result = (double) (numerator * other.denominator) / (denominator * other.numerator);
        return result;
    }

    @Override
    public boolean equals(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        if (numerator == 0 && other.numerator == 0) {
            return true;
        } else {
            other = trans(other);
            if (numerator == other.numerator && denominator == other.denominator) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int compareTo(Rational rational) {
        RationalImpl other = (RationalImpl) rational;
        if (numerator == 0 && other.numerator == 0) {
            return 0;
        } else {
            other = trans(other);
            if (numerator == other.numerator) {
                return 0;
            } else if (numerator > other.numerator) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    @Override
    public String toString() {
        int commonDivisor = this.getCommonDivisor(this.numerator, this.denominator);
        return (this.numerator/commonDivisor) + "/" + (this.denominator/commonDivisor);
    }

    /**
     * 通分,將兩個分數轉換成相同分母的兩個分數
     * @param rational
     * @return
     */
    private RationalImpl trans(RationalImpl rational) {
        int denominator = this.denominator;
        this.numerator = this.numerator * rational.denominator;
        this.denominator = this.denominator * rational.denominator;
        rational.numerator = rational.numerator * denominator;
        rational.denominator = rational.denominator * denominator;
        return rational;
    }

    /**
     * 獲取最大公約數
     * Tips:本來該私有化,亦或將該方法提到一個類似MathUtil的工具類中,做爲一個靜態方法使用
     * @return
     */
    public int getCommonDivisor(int numerator, int denominator) {
        int i = 1, commDivisor = 0;
        int temp = numerator;
        if (temp < denominator){
            temp = denominator;
        }
        while (i <= temp) {
            if (numerator % i == 0 && denominator % i == 0) {
                commDivisor = i;
            }
            i++;
        }
        return commDivisor;
    }

    public int getNumerator() {
        return numerator;
    }

    public int getDenominator() {
        return denominator;
    }

    public void setNumerator(int numerator) {
        this.numerator = numerator;
    }

    public void setDenominator(int denominator) {
        this.denominator = denominator;
    }
}


最後還是定義Client進行Test

package com.java.framework;

import com.java.framework.data_structure.adt.ConcretePoint;
import com.java.framework.data_structure.adt.Point;
import com.java.framework.data_structure.adt.Rational;
import com.java.framework.data_structure.adt.RationalImpl;

public class Client {

    public static void  main(String[] args) {
//        System.out.println("Ryan Xu 2016/4/28");

//        Point p1 = new ConcretePoint(2,2);
//        Point p2 = new ConcretePoint(2,2);
//        double d = p1.getDistance(p2);
//        System.out.println(p1.toString() + "與" + p2.toString() + "兩點間的距離爲" + d);

        Rational r1 = new RationalImpl(1,2);
        Rational r2 = new RationalImpl(2,4);
        System.out.println("equals: " + r1.equals(r2));
        System.out.println("compareTo: " + r1.compareTo(r2));
        System.out.println("addition: " + r1.addition(r2));
        System.out.println("subtraction: " + r1.subtraction(r2));
        System.out.println("multiplication: " + r1.multiplication(r2));
        System.out.println("division: " + r1.division(r2));
        System.out.println("toString: " + r1.toString());

    }
}


Tips:
可能存在不足的地方,大家可以予以指出,相互學習,共同進步。


發佈了46 篇原創文章 · 獲贊 30 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章