仿照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的?
有。

posted @ 2021-09-27 19:59  破茧123  阅读(67)  评论(0)    收藏  举报