有理数类的设计

有理数类的设计

1.给出你的有理数类的代码。

package Rational;

public class Rational {
	private int denominator = 1;// 有理数的分母
	private int numerator = 0;// 有理数的分子

	public Rational() // 构造无参函数
	{
		this(0, 1);
	}

	public Rational(int numerator, int denominator) // 构造有参数的函数
	{
		this.denominator = Math.abs(denominator);
		this.numerator = ((denominator > 0) ? 1 : -1) * numerator;
	}

	public double toDouble()// 转化为double
	{
		return this.numerator * 1.0 / this.denominator;
	}

	public int toInt()// 转化为int
	{
		return (int) toDouble();
	}

	public float toFloat()// 转化为float
	{
		return (float) toDouble();
	}

	public long toLong()// 转化为long
	{
		return (long) toDouble();
	}

	public int gcd(int a, int b) //求最大公约数
	{

		int x = Math.abs(a);
		int y = Math.abs(b);
		if (x < y) {
			int temp = x;
			x = y;
			y = temp;
		}

		if (x % y != 0) {
			int k = x % y;
			return gcd(y, k);// 再次循环
		}
		return y;
	}

	public Rational add(Rational a, Rational b) // 有理数加法
	{
		int x = a.numerator * b.denominator + b.numerator * a.denominator;
		int y = a.denominator * b.denominator;
		int newnum = x / gcd(x, y);
		int newden = y / gcd(x, y);
		return new Rational(newnum, newden);
	}

	public Rational subtract(Rational a, Rational b) // 有理数减法
	{
		int x = a.numerator * b.denominator - b.numerator * a.denominator;
		int y = a.denominator * b.denominator;
		int newnum = x / gcd(x, y);
		int newden = y / gcd(x, y);
		return new Rational(newnum, newden);
	}

	public Rational multiply(Rational a, Rational b) // 有理数乘法
	{
		int x = a.numerator * b.numerator;
		int y = a.denominator * b.denominator;
		int newnum = x / gcd(x, y);
		int newden = y / gcd(x, y);
		return new Rational(newnum, newden);
	}

	public Rational divide(Rational a, Rational b) // 有理数除法
	{
		int x = a.numerator * b.denominator;
		int y = a.denominator * b.numerator;
		int newnum = x / gcd(x, y);
		int newden = y / gcd(x, y);
		return new Rational(newnum, newden);
	}

	public String toString()// 转换为字符串类型
	{
		if (this.denominator == 1) {
			return this.numerator + "";
		} else {
			return this.numerator + "/" + this.denominator;
		}
	}

	public void compare(Rational a, Rational b)// 比较大小
	{

		if (this.subtract(a, b).toDouble() > 0)
			System.out.println(a + ">" + b);
		else if (this.subtract(a, b).toDouble() == 0)
			System.out.println(a + "=" + b);
		else
			System.out.println(a + "<" + b);
	}

	public String roundedTothree()// 保留三位小数
	{
		java.text.DecimalFormat df = new java.text.DecimalFormat("#0.000");

		return df.format(this.numerator * 1.0 / this.denominator);
	}

}

2.你的测试代码。要在与有理数类不同包的其他类中调用有理数类。

package javalearn;

import Rational.Rational;

public class Main {
	public static void main(String[] args) {
		Rational x = new Rational(5, 7);
		Rational y = new Rational(4, 5);
		Rational z = new Rational();
		System.out.println(x.toString());
		System.out.println(y.toString());
		System.out.println(z.add(x, y).toString());
		System.out.println(z.subtract(x, y).toString());
		System.out.println(z.multiply(x, y).toString());
		System.out.println(z.divide(x, y).toString());
		z.compare(x, y);
		System.out.println(x.toInt());
		System.out.println(x.toLong());
		System.out.println(x.toFloat());
		System.out.println(x.toDouble());
		System.out.println(x.roundedTothree());
	}
}

3.运行结果

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

java是针对对象的机制,可以通过对类的编写,使用时导入,在对象后写其方法就可以,十分便捷,而c语言则需要通过函数的方式,面对过程,编写代码时也是对这个过程的编写,使用时调用就可以了。

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

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

导入包中的有理数类,

import Rational.Rational;

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

依赖,不影响,有理数类中属性设置为private,不影响他人调用

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

合适,不希望被别人更改,同时编写相应的public方法使别人使用。

posted @ 2020-10-04 10:20  宋林涛  阅读(212)  评论(0编辑  收藏  举报