Java互评-有理数的设计

1.有理数代码

package rational;

public class Rational {
	private int numerator;//分子
	private int denominator;//分母
	
	//分子和分母的Getter和setter
	public int getNumerator() {
		return numerator;
	}
	
	public void setNumerator(int numerator) {
		this.numerator = numerator;
	}
	
	public int getDenominator() {
		return denominator;
	}
	
	public void setDenominator(int denominator) {
		this.denominator = denominator;
	}
	
	
	public Rational() {//无参构造函数
		this.numerator=0;
		this.denominator=1;
	}
	public Rational(int numerator, int denominator) {//构造函数
		int gcd = gcd(numerator,denominator);
		this.numerator=((denominator>0)?1:-1)*numerator/gcd;
		this.denominator=Math.abs(denominator)/gcd;
	}
	
	private int gcd(int a,int b) {//求最大公约数
		a=Math.abs(a);
		b=Math.abs(b);
		int t;
		if(a<b) {
			t=a;
			a=b;
			b=t;
		}
		t=a%b;
		while(t!=0) {
			a=b;
			b=t;
			t=a%b;
		}
		return b;
	}
	
	public Rational add(Rational secondRational) {//加法
		int numerator2 = this.numerator*secondRational.getDenominator() + this.denominator*secondRational.getNumerator();
		int denominator2 = this.denominator*secondRational.getDenominator();
		return new Rational(numerator2,denominator2);
	}
	
	public Rational subtract(Rational secondRational) {//减法
		int numerator2 = this.numerator*secondRational.getDenominator() - this.denominator*secondRational.getNumerator();
		int denominator2 = this.denominator*secondRational.getDenominator();
		return new Rational(numerator2,denominator2);
	}
	
	public Rational multiply(Rational secondRational) {//乘法
		int numerator2 = this.numerator*secondRational.getNumerator();
		int denominator2 = this.denominator*secondRational.getDenominator();
		return new Rational(numerator2,denominator2);
	}
	
	public Rational divide(Rational secondRational) {//除法
		int numerator2 = this.numerator*secondRational.getDenominator();
		int denominator2 = this.denominator*secondRational.getNumerator();
		return new Rational(numerator2,denominator2);
	}
	
	public Rational abs() {//绝对值
		int numerator2 = this.numerator;
		int denominator2 = this.denominator;
		if(numerator2<0) numerator2 = -numerator2;
		if(denominator2<0) denominator2 = -denominator2;
		return new Rational(numerator2,denominator2);
	}
	
	public int compare(Rational secondRational) {//比较大小
		if(this.subtract(secondRational).getNumerator()>0) {
			return 1;
		}else if(this.subtract(secondRational).getNumerator()<0) {
			return -1;
		}else return 0;
	}
	
	public boolean equals(Rational secondRational) {//判断是否相等
		if(this.subtract(secondRational).getNumerator()==0) {
			return true;
		}else return false;
	}
	
	public String toString() {//转换成字符串类型
		if(this.denominator==1) {
			return this.numerator+"";
		}else {
			return this.numerator+"/"+this.denominator;
		}
	}
	
	public int intValue() {//转换成int类型
		return (int)doubleValue();
	}
	
	public long longValue() {//转换成long类型
		return (long)doubleValue();
	}
	
	public float floatValue() {//转换成float类型
		return (float)doubleValue();
	}
	
	public double doubleValue() {//转换成double类型
		return 1.0*this.numerator/this.denominator;
	}
}

2.测试代码

(在与有理数类不同包的其他类中调用有理数类)

package testrational;

import rational.Rational;

public class TestRational {
	public static void main(String[] args) {
		Rational a= new Rational(-5,8);
		Rational b= new Rational(8,12);
		
		
		System.out.println(a.toString());
		System.out.println(b.toString());
		
		//测试有理数运算方法
		System.out.println("a+b = "+a.add(b));
		System.out.println("a-b = "+a.subtract(b));
		System.out.println("a*b = "+a.multiply(b));
		System.out.println("a/b = "+a.divide(b));
		System.out.println("a的绝对值 = "+a.abs());
		System.out.println("a和b比大小:"+a.compare(b));
		System.out.println("a和b是否相等:"+a.equals(b));
		System.out.println("a转换成int类型 = "+a.intValue());
		System.out.println("a转换成long类型 = "+a.longValue());
		System.out.println("a转换成float类型 = "+a.floatValue());
		System.out.println("a转换成double类型 = "+a.doubleValue());
	}
}

运行结果:

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

C语言的代码更加面向过程,在解决问题时,不同于C语言使用函数,我设计的类的核心在于对象本身,而不是整个解决过程。并且我设计的具有面向对象语言的许多特征如封装性、继承等等等,也更方便他人调用。

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

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

导入相应包中的有理数类即可调用,如导入:import rational.Rational;

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

别人的代码不依赖我的有理数类的属性。、
当我的有理数类的属性的数值、名称等修改时,因为属性定义为private,所以不影响;但当属性的类型变化时,如分子的int型修改为double型时,会影响到他人调用我的有理数类代码。

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

大部分方法需要被其他类调用,设置为public方法是合适的。
而将属性设置为private可以保证数据的安全性,也有部分辅助类方法设置为private,这些方法不需要被调用,例如如我的有理数类中的求最大公约数的方法就设置为private。

原文地址:https://www.cnblogs.com/cjt0722/p/13766211.html