有理数类的定义

一、代码预览

public class Rational {
	private int num = 0;
	private int deno = 1;

	public Rational() {
		this(0, 1);
	}

	public Rational(int num, int deno) // 约分到最简
	{
		int gcd = gcd(num, deno);
		this.num = (deno > 0 ? 1 : -1) * num / gcd;
		this.deno = Math.abs(deno) / gcd;
	}

	public static int gcd(int n, int d)// 寻找最大公约数
	{
		int nl = Math.abs(n);
		int dl = Math.abs(d);
		int gcd = 1;
		int min = nl;
		if (nl > dl) {
			min = dl;
		}
		for (int i = 1; i <= min; i++) {
			if (nl % i == 0 && dl % i == 0) {
				gcd = i;
			}
		}
		return gcd;
	}

	public int getNum() // 获得分子
	{
		return num;
	}

	public int getDeno() // 获得分母
	{
		return deno;
	}

	public Rational add(Rational second)// 加法运算
	{
		int n = num * second.getDeno() + deno * second.getNum();
		int d = deno * second.getDeno();
		return new Rational(n, d);
	}

	public Rational minus(Rational second)// 减法运算
	{
		int n = num * second.getDeno() - deno * second.getNum();
		int d = deno * second.getDeno();
		return new Rational(n, d);
	}

	public Rational multiply(Rational second)// 乘法运算
	{
		int n = num * second.getNum();
		int d = deno * second.getDeno();
		return new Rational(n, d);
	}

	public Rational divide(Rational second)// 除法运算
	{
		int n = num * second.getDeno();
		int d = deno * second.getNum();
		return new Rational(n, d);
	}

	public int intValue() // 转换为int类型
	{
		return (int) doubleValue();
	}

	public float floatValue() // 转换为float类型
	{
		return (float) doubleValue();
	}

	public double doubleValue() // 转换为double类型
	{
		return num * 1.0 / deno;
	}

	public long longValue() // 转换为long类型
	{
		return (long) doubleValue();
	}

	public String toString()// 转换为string类型
	{
		if (deno == 1) {
			return num + "";
		} else {
			return num + "/" + deno;
		}
	}

	public void compare(Rational second) // 比较两个有理数
	{
		Rational x = minus(second);
		if (x.getNum() > 0) {
			System.out.println(num + "/" + deno + "大于" + second.getNum() + "/" + second.getDeno());
		} else if (x.getNum() == 0) {
			System.out.println(num + "/" + deno + "等于" + second.getNum() + "/" + second.getDeno());
		} else {
			System.out.println(num + "/" + deno + "小于" + second.getNum() + "/" + second.getDeno());
		}
	}
	
}

二、测试代码

public static void main(String[] args) {
    Rational x = new Rational(1, 3);
    Rational y = new Rational(4, 6);
    System.out.println(x.add(y));
    System.out.println(x.minus(y));
    System.out.println(x.multiply(y));
    System.out.println(x.divide(y));
    System.out.println(x.intValue());
    System.out.println(x.floatValue());
    System.out.println(x.doubleValue());
    System.out.println(x.longValue());
    System.out.println(x.toString());
    x.compare(y);
}

三、运行结果

四、讨论

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

c语言中这些运算是通过函数来实现的。而设计的类会具象化,有属性和方法,这些都是比较直观的。

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

导入我写的有理数类方可使用。

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

是,因为他调用了我的有理数类,也就调用了其中的属性。不会影响,属性设置为private型。

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

当你不希望你的方法可以被别人使用时可以使用private来设置方法,其具有一定的保护作用。而public就是公共的意思,方便调用。

原文地址:https://www.cnblogs.com/yyzhu/p/13766114.html