Java-有理数类设计

一、有理数类代码
package text;

public class Rational {
	private long numerator = 0;     //分子
	private long denominator = 1;   //分母

	public Rational() {             //构造函数
		this(0,1);
	}
	public Rational(long numerator, long denominator) {      //求最大公约数
		long gcd = gcd(numerator,denominator);
		this.numerator= ((denominator>0)? 1 : -1)*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);
		int gcd = 1;
		for(int i=1;i<=numerator&&i<=denominator;i++) {
			if(numerator%i == 0&&denominator%i == 0) {
				gcd=i;
			}
		}
		return gcd;
	}
	public long getNumerator(){
		return numerator;
		}
	public long getDenominator(){
		return denominator;
		}
	public Rational add(Rational secondRational){          //加法
		long n=numerator*secondRational.getDenominator()+denominator*secondRational.getNumerator();
		long d=denominator*secondRational.getDenominator();
		return new Rational(n,d);
		}
	public Rational subtract(Rational secondRational){          //减法
		long n=numerator*secondRational.getDenominator()-denominator*secondRational.getNumerator();
		long d=denominator*secondRational.getDenominator();
		return new Rational(n,d);
		}
	public Rational multiply(Rational secondRational){          //乘法
		long n=numerator*secondRational.getNumerator();    
		long d=denominator*secondRational.getDenominator();
		return new Rational(n,d);
		}
	public Rational divide(Rational secondRational){          //除法
		long n=numerator*secondRational.getDenominator();
		long d=denominator*secondRational.numerator;
		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()&&nenominator < s.getDenominator())) {
            return 1;          //前者大于后者
        }
		else {
            return -1;          //后者大于前者
        }
	}
		

}
二、测试代码
package text;

import text.Rational;

public class Main {
	public static void main(String[] args) {
		Rational r1 = new Rational(8,9);
		Rational r2 = new Rational(2,3); 
		System.out.println("r1 + r2 = "+r1.add(r2).getNumerator()+'/'+r1.add(r2).getDenominator());
		System.out.println("r1 - r2 = "+r1.subtract(r2).getNumerator()+'/'+r1.subtract(r2).getDenominator());
		System.out.println("r1 * r2 = "+r1.multiply(r2).getNumerator()+'/'+r1.multiply(r2).getDenominator());
		System.out.println("r1 / r2 = "+r1.divide(r2).getNumerator()+'/'+r1.divide(r2).getDenominator());
		System.out.println("r1与r2比较结果:"+r1.Compare(r2)+"(0:r1=r2;1:r1>r2;-1:r1<r2)");

	}
}
三、运行截图

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

C语言倾向于编写全部代码,重过程;Java更倾向于将数据和方法进行封装和调用,更加灵活

五、尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
  1. 别人如何复用你的代码?

    导入我的数据包

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

    依赖,调用了我的有理数类。

    不会,我的类属性修改,属于private型,不会影响他人调用。

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

    是。

    private型他人无法调用,保障了数据的安全性。

posted on 2020-10-04 11:18  lim-M  阅读(49)  评论(0编辑  收藏  举报