3.1-互评-OO设计-有理数类的设计

1.有理数代码

package Rl;
public class Rational{
	private int numerator;//分子
    private int denominator;//分母
    
    public int getNumerator() //获取分子
    {
        return numerator;
    }
    
    public int getDenominator()//获取分母
    {
        return denominator;
    }
    private static int gcd(int n,int d)//求最大公约数
    {
    	int a = Math.abs(n);
    	int b = Math.abs(d);
    	int gcd = 1;
    	for (int i=2;i<=a && i<=b;i++)
    	{
    		if(a%i==0&&b%i==0) {
    			gcd=i;
   		 }
   	 }
    	return gcd;
    }
    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;
    }
    public Rational add(Rational newRational)//加法运算
    {
        int n=this.numerator*newRational.getDenominator()+this.denominator*newRational.getNumerator();
        int d=this.denominator*newRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational subtract(Rational newRational)//减法运算
    {
        int n=this.numerator*newRational.getDenominator()-this.denominator*newRational.getNumerator();
        int d=this.denominator*newRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational multiply(Rational newRational)//乘法运算
    {
        int n=this.numerator*newRational.getNumerator();
        int d=this.denominator*newRational.getDenominator();
        return new Rational(n,d);
    }
    public Rational divide(Rational newRational)//除法运算
    {
        int n=this.numerator*newRational.getDenominator();
        int d=this.denominator*newRational.getNumerator();
        return new Rational(n,d);
    }
    public String toString()//转换为字符串类型
    {
        if (this.denominator==1)
        {
            return this.numerator+"";
        }else{
            return this.numerator+"/"+this.denominator;
        }
    }
    public void compare(Rational newRational)//判断是否相等
    {
        if (this.subtract(newRational).getNumerator()<0)
            System.out.println("x<y");
        else if(this.subtract(newRational).getNumerator()==0)
        	 System.out.println("x=y");
        else
        	System.out.println("x>y");
    }
    public double doubleValue() //转换为double型
    {
        return this.numerator*1.0/this.denominator;
    }
    public int intValue() //转换为int型
    {
        return (int)doubleValue();
    }
    public long longValue() //转换为long型
    {
        return (long)doubleValue();
    }
    public float floatValue()  //转换为float型
    {
        return (float)doubleValue();
    }

}
      

2.测试代码

import Rl.Rational;
public class Main {
    public static void main(String[] args){
        Rational x=new Rational(2,3);
        Rational y=new Rational(4,5);
        System.out.println("x="+x.toString());
        System.out.println("y="+y.toString());
        System.out.println("x+y="+x.add(y));
        System.out.println("x-y="+x.subtract(y));
        System.out.println("x*y="+x.multiply(y));
        System.out.println("x/y="+x.divide(y));
        x.compare(y);
        System.out.println(x.intValue());
        System.out.println(x.longValue());
        System.out.println(x.floatValue());
        System.out.println(x.doubleValue());
    }
}

3.测试结果

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

C语言编写代码偏向实现程序执行的过程,而java的代码有属性,方法等特征。代码有更多的功能性,需要时调用相应代码就可以实现功能

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

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

通过导入该有理数包,调用类中的属性和方法

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

依赖有理数的属性。不会影响。

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

合适,因为设置为private的方法只能在该类中运行,很好保护了一些重要代码的“隐私”。通过public的方法来访问其他的需要被使用到的代码,提高代码的安全性。

posted @ 2020-10-04 01:25  阿尔法个贝塔  阅读(168)  评论(0编辑  收藏  举报