仿照BigDecimal类以面向对象的方式设计有理数类。
1.给出你的有理数类的代码。
package p1; public class Rational{ private int numerator;//分子 private int denominator;//分母 public Rational (int numerator,int denominator)//构造函数 { this.numerator = numerator; this.denominator = denominator; } public int getNumerator()//获取分子 { return this.numerator; } public int getDenominator()//获取分母 { return this.denominator; } private static int gcd(int n,int d)//求最大公约数 { int a = Math.abs(n); int b = Math.abs(d); int gcd = 1; for (int k=2;k<=a && k<=b;k++) { if(a%k==0&&b%k==0) { gcd=k; } } return gcd; } public Rational add(Rational first,Rational second)//加法 { int n = first.numerator * second.denominator + second.numerator * first.denominator; int d = first.denominator * second.denominator; return new Rational(n,d); } public Rational subtract(Rational first,Rational second)//减法 { int n = first.numerator * second.denominator - second.numerator * first.denominator; int d = first.denominator * second.denominator; return new Rational(n,d); } public Rational multiply(Rational first,Rational second)//乘法 { int n = first.numerator * second.numerator; int d = first.denominator * second.denominator; return new Rational(n,d); } public Rational divide(Rational first,Rational second)//除法 { int n = first.numerator * second.denominator; int d = first.denominator * second.numerator; return new Rational(n,d); } public boolean equal(Rational first,Rational second) //判断是否相等 { if ((first.numerator == second.numerator)&(first.denominator == second.denominator)) { return true; } else { return false; } } public int intValue() //转换为int型 { return this.numerator / this.denominator; } public long longValue() //转换为long型 { return (long)doubleValue(); public double doubleValue()//转换为double型 { return this.numerator*1.0 / this.denominator; } public float floatValue() //转换为float型 { return (float)doubleValue(); } public String toString() //转换为string型 { return this.numerator + "/" + this.denominator; } }
给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
类名、变量名命名需符合Java规范
类名、变量名命名需符合Java规范
public class Main { public static void main(String[] args){ Rational x=new Rational(1,6); Rational y=new Rational(3,5); System.out.println("x="+x.toString()); System.out.println("y="+y.toString()); System.out.println("x+y="+x.add(y)); System.out.println("x-y="+x.subtract(y)); System.out.println("x*y="+x.multiply(y)); System.out.println("x/y="+x.divide(y)); System.out.println(x.intValue()); System.out.println(x.longValue()); System.out.println(x.doubleValue()); System.out.println(x.floatValue()); System.out.println(x.toString()); } }
尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
设计的类有属性和方法,java倾向于面向对象,封装了很多类和接口,以功能来解决问题;而c语言倾向于面向过程,即程序要实现的功能步骤
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
别人如何复用你的代码? 导入我的有理数类属性
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码? 依赖;会影响
有理数类的public方法是否设置合适?为什么有的方法设置为private? 合适; 因为设置成private时,只有类的内部才能访问到,外部没法访问,可以保护数据;设置成public,可以被任意类访问,被调用时方便