ADT之练习题

来源:互联网 发布:安全员c证网络查询 编辑:程序博客网 时间:2024/06/05 20:44

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:
可能存在不足的地方,大家可以予以指出,相互学习,共同进步。


0 0
原创粉丝点击