Java——有理数类的设计

一、代码

Rational(有理数)类代码

package Rational;

public class Rational {

	private long numerator; //分子
	private long denominator;//分母
	
	/*构造无参函数*/
	public Rational() {
		this(0,1);
	}
	
	/*辗转相除法求两数的最大公约数*/
	private long gcd(long a,long b) {
		if(b==0) 
			return a;
		return gcd(b,a%b);
	}
	
	/*构造参数函数*/
	public Rational(long a,long b) {
		numerator=a;
		denominator=b;
		long k=gcd(numerator, denominator);
		if(k>1) {
			numerator/=k;
			denominator/=k;
		}
	}
	
	/*加法运算*/
	public Rational myAdd(Rational x) {
		return new Rational(numerator*x.getDenominator()+x.getNumerator()*denominator,denominator*x.getDenominator());
	}
	
	/*减法运算*/
	public Rational mySub(Rational x) {
		return new Rational(numerator*x.getDenominator()-x.getNumerator()*denominator,denominator*x.getDenominator());
	}
	
	/*乘法运算*/
	public Rational myMul(Rational x) {
		return new Rational(numerator*x.getNumerator(),denominator*x.getDenominator());
	}
	
	/*除法运算*/
	public Rational myDiv(Rational x) {
		return new Rational(numerator*x.getDenominator(),denominator*x.getNumerator());
	}
	
	/*设置分子的值*/
	public void setNumerator(long numerator) {
		this.numerator = numerator;
	}
    
	/*设置分母的值*/
	public void setDenominator(long denominator) {
		this.denominator = denominator;
	}

	/*获取分子的值*/
	public long getNumerator() {
		return numerator;
	}
    
	/*获取分母的值*/
	public long getDenominator() {
		return denominator;
	}
	
	/*比较两个有理数是否相等*/
	public boolean myEquals(Rational x) {
		if((numerator==x.getNumerator())&&(denominator==x.getDenominator()))
			return true;
		return false;
	}
	
	/*比较两个有理数的大小*/
	public int myCompare(Rational x) {
		if (this.mySub(x).numerator>0)
			return 1;
		else if(this.mySub(x).numerator==0)
			return 0;
		else return -1;
	}
}

测试代码(main)

import Rational.Rational;

public class Main {

	public static void main(String[] args) {
		Rational rat1=new Rational(1,2);
		Rational rat2=new Rational(3,4);
		Rational c;
		System.out.println("第一个有理数为:"+rat1.getNumerator()+"/"+rat1.getDenominator());
		System.out.println("第二个有理数为:"+rat2.getNumerator()+"/"+rat2.getDenominator());
        
        /*加法运算*/
		c=rat1.myAdd(rat2);
		System.out.println("两个有理数相加结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"+"+rat2.getNumerator()+"/"+rat2.getDenominator()+"="+c.getNumerator()+"/"+c.getDenominator());
        
        /*减法运算*/
		c=rat1.mySub(rat2);
		System.out.println("两个有理数相减结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"-"+rat2.getNumerator()+"/"+rat2.getDenominator()+"="+c.getNumerator()+"/"+c.getDenominator());
        
        /*乘法运算*/
		c=rat1.myMul(rat2);
		System.out.println("两个有理数相乘结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"*"+rat2.getNumerator()+"/"+rat2.getDenominator()+"="+c.getNumerator()+"/"+c.getDenominator());
        
        /*除法运算*/
		c=rat1.myDiv(rat2);
		System.out.println("两个有理数相除结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"÷"+rat2.getNumerator()+"/"+rat2.getDenominator()+"="+c.getNumerator()+"/"+c.getDenominator());
        
        /*da'xiao运算*/
		int k=rat1.myCompare(rat2);
		if(k>1)
			System.out.println("两个有理数的大小比较结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+">"+rat2.getNumerator()+"/"+rat2.getDenominator());
		else if (k==0) {
			System.out.println("两个有理数的大小比较结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"="+rat2.getNumerator()+"/"+rat2.getDenominator());
		}
		else
			System.out.println("两个有理数的大小比较结果为:"+rat1.getNumerator()+"/"+rat1.getDenominator()+"<"+rat2.getNumerator()+"/"+rat2.getDenominator());
		
	}

}

测试结果截图

二、有理数类功能介绍及相关问题回答

1.功能介绍

该自定义的Rational类存放在Rational包里,它可以返回有理数的最简形式,可以对两个有理数进行加、减、乘、除运算,亦可以比较两个有理数的大小,判断两个有理数是否相等。它可以在main函数中通过set对有理数的值进行更改。

2.相关问题

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

A1:c语言的有理数代码多倾向于构造函数来对有理数(对象)的属性进行操作,而用java设计的类方法则是偏向直接面对有理数(对象)进行操作。

 

Q2:别人如何复用你的代码?

A2:导入我的Rational包即可
 

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

A3:是的,别人的代码会依赖我的有理数类属性。当我的有理数属性修改时,不会影响他人调用我的有理数代码。因为设计的有理数类中,有理数的属性类型为private型,且在类中给出了setter、getter的方法。

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

A4:在该有理数类的设计中,我已把提供使用的方法设置为了public,而不被别人使用的,设置为了private。如加减乘除的运算,则是可以使用的;而求最大公约数(gcd)只是辅助我完成对有理数类的设计而存在,其被设为private。

posted @ 2020-10-04 10:30  AJAJAJAJAJAJ  阅读(228)  评论(0)    收藏  举报