Java 有理数设计

1.有理数类的代码

package R1;
public class Rational{
	private int numerator;//分子
	private int denominator;//分母
	public int getNumerator() //获取分子
    {
        return numerator;
    }

    public int getDenominator()//获取分母
    {
        return denominator;
    }
    public Rational() {//无参构造函数
        this(0,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 static int gcd(int numerator,int denominator)//求最大公约数
    {
        int n1=Math.abs(numerator);
        int n2=Math.abs(denominator);
        int tmp;
        while (n2 != 0) {
            tmp = n1 % n2;
            n1 = n2;
            n2 = tmp;
        }
        return n1;
    }
    public Rational add(Rational secondRational)//加法
    {
        int n=this.numerator*secondRational.getDenominator()+this.denominator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational subtract(Rational secondRational)//减法
    {
        int n=this.numerator*secondRational.getDenominator()-this.denominator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational multiply(Rational secondRational)//乘法
    {
        int n=this.numerator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational divide(Rational secondRational)//除法
    {
        int n=this.numerator*secondRational.getDenominator();
        int d=this.denominator*secondRational.getNumerator();
        return new Rational(n,d);
    }
    public boolean equals(Object secondRational){//判断是否相等
        if((this.subtract((Rational)(secondRational))).getNumerator()==0){
              return true;
        }
        else return false;
    }
    public int compare(Rational secondRational)//比较大小
    {
        if (this.subtract(secondRational).getNumerator()>0)
            return 1;
        else if (this.subtract(secondRational).getNumerator()==0)
            return 0;
        else
            return -1;
    }
    public String toString()//转换为string类型
    {
        if (this.denominator==1)
        {
            return this.numerator+"";
        }else{
            return this.numerator+"/"+this.denominator;
        }
    }
    public int intValue() //将Rational转换为int型
    {
        return (int)doubleValue();
    }

    public long longValue() //将Rational转换为long型
    {
        return (long)doubleValue();
    }

    public float floatValue()  //将Rational转换为float型
    {
        return (float)doubleValue();
    }

    public double doubleValue() //将Rational转换为double型
    {
        return this.numerator*1.0/this.denominator;
    }
}

2.测试的代码

package R1;
import R1.Rational;
public class Main {
	public static void main(String[] args) {
		Rational x=new Rational(5,6);
        Rational y=new Rational(2,3);
        System.out.println("有理数的分数形式:"+x.toString());//输出x的分数形式
        System.out.println("有理数相减得:"+y.toString());//输出y的分数形式
        System.out.println("两有理数相加得:"+x.add(y));//输出两分数相加的结果
        System.out.println("两有理数相减得:"+x.subtract(y));//输出两分数相减的结果
        System.out.println("两有理数相乘得:"+x.multiply(y));//输出两分数相乘的结果
        System.out.println("两有理数相除得:"+x.divide(y));//输出两分数相除的结果
        System.out.println("两有理数是否相等:"+x.equals(y));//判断两分数是否相等
        System.out.println("两有理数的大小关系:"+x.compare(y));//比较两分数大小
	}
}

运行结果截图

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

c语言更加的面向过程,需要考虑写什么样的函数来完成它,而Java更多的是对类的编写,很多都是直接调用即可,因此Java更加面向对象。

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

虽然别人编写的是不同包的类,但是只要导入自己编写的有理数类的包,就可以复用我的代码了。

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

别人的代码是依赖于我的有理数类的属性,但是我的有理数类的属性为private型,所以不会影响我有理数类的代码。

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

合适,因为有的方法只能运用在类中,不能随便更改,保证数据的安全性,而有的方法希望可以被使用,因此就通过public方法来访问。

posted @ 2020-10-04 00:35  GGG(郭其松)  阅读(125)  评论(0编辑  收藏  举报