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);
}
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爲分母
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();
}
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:
可能存在不足的地方,大家可以予以指出,相互學習,共同進步。