有理数类的设计--Java

有理数类的设计--Java

1.有理数代码

package rational;

public class Rational {

	private long Numerator = 0;
	private long Denominator = 1;
	
	
	//访问private中的Numerator和Denominator
	public long getNumerator() {
		return Numerator;
	}
	public long getDenominator() {
		return Denominator;
	}

	
	public Rational(long Numerator, long Denominator) {
		// TODO Auto-generated constructor stub
		long gcd = gcd(Numerator,Denominator);
		long temp;
		if(Denominator>0) {
			temp = 1;
		}else {
			temp = -1;
		}
		this.Numerator = temp * Numerator / gcd;
		this.Denominator = Math.abs(Denominator) / gcd;
	}
	
	//最大公约数
	private long gcd(long Numerator, long Denominator) {
		// TODO Auto-generated method stub
		long N = Math.abs(Numerator);
		long D = Math.abs(Denominator);
		long gcd = 1;
		for (int i = 1; i < D&&i <= N; i++) {
			if(N % i == 0&&D % i == 0) {
				gcd = i;
			}
		}
		return gcd;
	}
	
	//加法
	public Rational Add(Rational s) {
		long N = Numerator * s.getDenominator() + Denominator * s.getNumerator();
		long D = Denominator * s.getDenominator();
		/*分子=分子1*分母2+分母1*分子2
		 * 分母=分母1*分母2*/
		return new Rational(N,D);
	}
	
	//减法
	public Rational Subt(Rational s) {
		long N = Numerator * s.getDenominator() - Denominator * s.getNumerator();
		long D = Denominator * s.getDenominator();
		return new Rational(N,D);
	}
	
	//乘法
	public Rational Mult(Rational s) {
		long N = Numerator * s.getNumerator();
		long D = Denominator * s.getDenominator();
		return new Rational(N,D);
	}
	
	//除法
	public Rational Divi(Rational s) {
		long N = Numerator * s.getDenominator();
		long D = Denominator * s.getNumerator();
		return new Rational(N,D);
	}
	
	//比较
	public int Compare(Rational s) {
		if(Numerator == s.getNumerator()) {
			return 0;//相等
		}else if((Numerator > s.getNumerator()&&Denominator <= s.getDenominator())||(Numerator == s.getNumerator()&&Denominator < s.getDenominator())) {
			return 1;//前者大于后者
		}else {
			return -1;//后者大于前者
		}
	}
	
	//转换为double类型
	public double doubleValue(Rational s) {
		double value = Numerator * 1.0 / Denominator;
		return value; 
	}
}

2.测试代码

package rational;

import rational.Rational;

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Rational ra1 = new Rational(5,21);
		Rational ra2 = new Rational(2,7);
		
		System.out.println("ra1转换为double型的值为:"+ra1.doubleValue(ra1));
		System.out.println("ra2转换为double型的值为:"+ra2.doubleValue(ra2));
		System.out.println("ra1 + ra2 = "+ra1.Add(ra2).getNumerator()+'/'+ra1.Add(ra2).getDenominator());
		System.out.println("ra1 - ra2 = "+ra1.Subt(ra2).getNumerator()+'/'+ra1.Subt(ra2).getDenominator());
		System.out.println("ra1 * ra2 = "+ra1.Mult(ra2).getNumerator()+'/'+ra1.Mult(ra2).getDenominator());
		System.out.println("ra1 / ra2 = "+ra1.Divi(ra2).getNumerator()+'/'+ra1.Divi(ra2).getDenominator());
		System.out.println("ra1与ra2相比较的结果为:"+ra1.Compare(ra2)+"   (1:前者大于后者;0:二者相等;-1:后者大于前者)");

	}
}

3.运行结果截图

4.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

C语言是一种通用的、面向过程式的加算计程序设计语言,是仅产生少量的机器语言以及不需要腾和运行环境支持便能运行的。Java是面向对象编程,它利用了类和对象编程。类是对于事物的抽象,对象是具体的一个事物。

5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

a.别人如何复用你的代码?

导入我的代码数据包,并且在首行import调用我的代码数据包。

b.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

​ 别人的代码会依赖我的有理数类的属性。当我的有理数类的属性修改时,不会影响其他人对我有理数类代码的调用,因为属性的修饰类型为private型。

c.有理数类的public方法是否设置合适?为什么有的方法设置为private?

​ 合适。因为设置为private型,他人就不能在其他的类中使用和修改,对代码有一定的保护作用。

posted @ 2020-10-03 21:26  羊腿桂鱼yu  阅读(112)  评论(0编辑  收藏  举报