有理数类的设计

1、有理数类的设计

package number;

public class Rational {

	public int num;
	public int denom;

	public Rational(int num, int denom) {// 对有理数对象进行初始化
		
		this.num = num;
		this.denom = denom;
		
		if(num==0&&denom==-1) {//若分子为零则直接返回
			this.num=0;
			this.denom=-1;
			return;
		}

		if (denom == 0) {
			System.err.println("分母不得为零");
			return;
		}

		if (denom < 0) {// 将正负号设置到分子上
			this.num = -num;
			this.denom = -denom;
		}

		if (denom != 1) {// 若分母不为1则将分数化简
			int a = Math.abs(num);
			int b = Math.abs(denom);
			int temp;
			if (a < b) { // 保证被除数大于除数
				temp = a;
				a = b;
				b = temp;
			}
			if (a % b != 0) {
				while (a % b != 0) { // 在余数不为0时,进行循环
					temp = a % b;
					a = b;
					b = temp;
				}
			}
			this.num /= b;
			this.denom /= b;
		}
	}

	public void out() {// 输出有理数对象
		System.out.println("(" + this.num + "," + this.denom + ")");
	}
	public Rational back() {
		return new Rational(0,1);
	}

	public Rational plus(Rational number) {// 加法运算
		int num = this.num * number.denom + number.num * this.denom;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational subtract(Rational number) {// 减法运算
		int num = this.num * number.denom - number.num * this.denom;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational multiply(Rational number) {// 乘法运算
		int num = this.num * number.num;
		int denom = this.denom * number.denom;
		if(num==0)back();
		return new Rational(num, denom);
	}

	public Rational divide(Rational number) {// 除法运算
		int num = this.num * number.denom;
		int denom = this.denom * number.num;
		if(num==0)back();
		return new Rational(num, denom);
	}
}

2、测试代码:

package test;

import number.Rational;

public class Test {
	public static void main(String[] args) {
		// 创建有理数对象
		Rational sc = new Rational(2, -8);
		Rational st = new Rational(-4, 8);
		sc.out();
		st.out();
		// 有理数的运算
		Rational sv = sc.plus(st);
		sv.out();
		sv = sc.subtract(st);
		sv.out();
		sv = sc.multiply(st);
		sv.out();
		sv = sc.divide(st);
		sv.out();
	}
}

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

在函数的编写、调用、类的实例化方面可以明显看出java是通过对象这一概念来完成各种调用、生成和计算的。

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

package包的导入

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

依赖、有影响,包中类的属性经确立后,使用该类的其他类就只能使用该类有且仅有的属性和方法,不能对其修改。如属性修改后,别人调用时可能要根据修改的内容增加或删减参数才能实现调用

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

根据访问权限和修改权限而定

posted @ 2020-10-04 21:51  WSW233  阅读(116)  评论(0编辑  收藏  举报