仿照BigDecimal类以面向对象的方式设计有理数类
一.完整的有理数类的代码。
public class Rational {
//属性
private long numerator = 0; //分子
private long denominator = 1; //分母
public long getNumerator() {
return numerator;
}
public void setNumerator(long numerator) {
this.numerator = numerator;
}
public long getDenominator() {
return denominator;
}
public void setDenominator(long denominator) {
this.denominator = denominator;
}
//构造函数(无参)
public Rational(){//分子分母初始化
this.numerator = 0;
this.denominator = 1;
}
//构造函数(有参)
public Rational(long numerator, long denominator){
this.numerator = numerator/gcd(Math.abs(numerator), Math.abs(denominator)); //分子化简(除以分子、分母的最大公约数)
this.denominator = denominator/gcd(Math.abs(numerator), Math.abs(denominator));//分母化简(除以分子、分母的最大公约数)
}
public static long gcd (long number1, long number2){//最大公约数计算
while (number1 != number2)
{
if (number1 > number2)
number1 = number1 - number2;
else
number2 = number2 - number1;
}
return number1;
}
public static Rational add (Rational num1, Rational num2) {//有理数求和
long tempNumerator = num1.numerator*num2.denominator + num1.denominator*num2.numerator;
long tempDenominator = num1.denominator*num2.denominator;
long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
Rational rationalNumber = new Rational(tempNumerator/gcd,tempDenominator/gcd);
return rationalNumber;
}
public static Rational subtract (Rational num1, Rational num2) {//有理数求差
long tempNumerator = num1.numerator*num2.denominator - num1.denominator*num2.numerator;
long tempDenominator = num1.denominator*num2.denominator;
long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
Rational rationalNumber = new Rational(tempNumerator/gcd,tempDenominator/gcd);
return rationalNumber;
}
public static Rational multiply (Rational num1, Rational num2) {//有理数求积
long tempNumerator = num1.numerator*num2.numerator;
long tempDenominator = num1.denominator*num2.denominator;
long gcd = gcd(Math.abs(tempNumerator),Math.abs(tempDenominator));
Rational rationalNumber = new Rational(tempNumerator/gcd,tempDenominator/gcd);
return rationalNumber;
}
}
二.你的测试代码
要在与有理数类不同包的其他类中调用有理数类。
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner in=new Scanner(System.in);
System.out.println("请输入两个有理数的分子和分母:");
RationalNum x = new RationalNum(in.nextInt(), in.nextInt());
RationalNum y = new RationalNum(in.nextInt(), in.nextInt());
System.out.println("|x| = " + x.abs());
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("x + y = " + x.add(y));
System.out.println("x - y = " + x.subtraction(y));
System.out.println("x * y = " + x.multiply(y));
System.out.println("x的int 型 " + x.intValue());
System.out.println("x的double 型 " + x.doubleValue());
in.close();
}
}
三.尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
因为C语言的函数代码是依据函数,通过过程来实现的;
而类是将功能以方式的形式写出,会更倾向于面向对象,使用时将类导入就可以,相比之下这样更加方便。
四。尝试从代码复用的角度来描述你设计的有理数类。
从几个方面讨论。
(1)别人如何复用你的代码?
可以通过导入包。
(2)别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
会依赖,当有理数类的属性修改后会影响到调用有理数的代码。
(3)有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,因为设置成private时,可以对数据进行保护,因为只有类的内部才能访问到,外部没法访问。
(4)你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
有。
浙公网安备 33010602011771号