JAVA-有理数类的设计

1.有理数类代码

package cn.goktech;

public class RationalNumber {
    private int numerator;//分子
    private int denominator;//分母
    
    public int getNum() {//返回分子
        return numerator;
    }
    
    public int getDen() {//返回分母
        return denominator;
    }
    
    public RationalNumber(int numerator, int denominator) {//处理分子分母正负的情况
        int gcd = gcd(numerator,denominator);
        this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;//分母正则乘1,负则乘-1
        this.denominator = Math.abs(denominator) / gcd;//分母都化为正
    }

    private static int gcd(int numerator, int denominator) {//求最大公约数
        int m = Math.abs(numerator);
        int n = Math.abs(denominator);
        int temp = 1;
        while(n != 0) {
            temp = m % n;
            m = n;
            n = temp;
        }
        return m;
    }
    
    public RationalNumber add(RationalNumber number1,RationalNumber number2) {//加法运算
        int n = number1.getNum() * number2.getDen() + number2.getNum() * number1.getDen();
        int d = number1.getDen() * number2.getDen();
        return new RationalNumber(n,d);
    }
    
    public RationalNumber sub(RationalNumber number1, RationalNumber number2) {//减法运算
        int n = number1.getNum() * number2.getDen() - number2.getNum() * number1.getDen();
        int d = number1.getDen() * number2.getDen();
        return new RationalNumber(n,d);
    }
    
    public RationalNumber mult(RationalNumber number1, RationalNumber number2) {//乘法运算
        int n = number1.getNum() * number2.getNum();
        int d = number1.getDen() * number2.getDen();
        return new RationalNumber(n, d);
    }
    
    public RationalNumber div(RationalNumber number1, RationalNumber number2) {//除法运算
        int n = number1.getNum() * number2.getDen();
        int d = number1.getDen() * number2.getNum();
        return new RationalNumber(n, d);
    }
    
    public boolean equal(RationalNumber number1,RationalNumber number2) {//判断两数是否相等
        if(number1.getDen() == number2.getDen() && number1.getNum() == number2.getNum())
            return true;
        else
            return false;
    }
    
    public double doubleValue() {//转double
        return this.numerator * 1.0 / this.denominator;
    }
    
    public long longValue() {//转long
        return (long)doubleValue();
    }
    
    public String toString() {//转string
        return this.numerator+"/"+this.denominator;
    }
}

2.测试代码

package cn.goktech01;

import cn.goktech.RationalNumber;

public class Main01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RationalNumber x=new RationalNumber(5,7);
        RationalNumber y=new RationalNumber(4,5);
        System.out.print("两数相加得:");
        System.out.println(x.add(x,y));
        System.out.print("两数相减得:");
        System.out.println(x.sub(x,y));
        System.out.print("两数相乘得:");
        System.out.println(x.mult(x,y));
        System.out.print("两数相除");
        System.out.println(x.div(x,y));
        System.out.print("两数是否相等:");
        System.out.println(x.equals(y));
        System.out.print("第一个数转long型:");
        System.out.println(x.longValue());
        System.out.print("第一个数转string型:");
        System.out.println(x.toString());
        System.out.print("第一个数转double型");
        System.out.println(x.doubleValue());
	}

}

3.运行结果

4.讨论分析

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

答:c语言强调的是过程,Java强调的是对象,Java的方法必须放在与之相对应的类里,而c语言可以放在外面,因此Java对更面向对象。

2.问:别人如何复用我的代码?

答:可以拷贝我RationalNumber类的代码,需要用到的时候import该类,就可以调用它的方法。

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

答:依赖,当我的属性修改,别人要调用的时候也要随之修改,否则会报错,比如入参的修改。

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

答:合适,当其他类在调用RationalNumber类的方法时,可以直接调用。private是用来访问自身,比如this.属性。

posted @ 2020-10-04 17:35  123yj  阅读(95)  评论(0编辑  收藏  举报