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);}
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:
可能存在不足的地方,大家可以予以指出,相互学习,共同进步。
0 0
- ADT之练习题
- android之ADT解理
- adt之链表
- 数据结构之字符串ADT
- ADT之MyDate
- 数据结构之表ADT
- 学习android之ADT
- 动态规划之练习题
- 编程之美 练习题
- C++之基础练习题
- C++之练习题1
- C++之练习题2
- C++之练习题3
- C++之练习题4
- C++之练习题5
- C++之练习题6
- C++之练习题7
- C++之练习题8
- phoenix设计
- 创业分享:创业的过程就是坚持的过程
- List--ArrayList(浅识)一
- 广告行业知识
- tomcat环境变量配置
- ADT之练习题
- bzoj4310: 跳蚤
- nagios 笔记
- 1002. 写出这个数 (20)
- 算法练习3.Longest Substring Without Repeating Characters 最长不重复子字符串(map)
- android sdk 下各个文件夹的作用
- 【leetcode】Minimum Depth of Binary Tree
- B. Crossed ladders
- redis 使用