OO设计-有理数类的设计

一、有理数类代码

package RationalNumber;

public class RationalNumber {
    private int numerator;//分子
    private int denominator;//分母
    
    public int getNumerator() {
        return numerator;
    }
    
    public int getDenominator() {
        return denominator;
    }
    
    public RationalNumber(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 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.getNumerator() * number2.getDenominator() + number2.getNumerator() * number1.getDenominator();
        int d = number1.getDenominator() * number2.getDenominator();
        return new RationalNumber(n,d);
    }
    
    public RationalNumber subtract(RationalNumber number1, RationalNumber number2) {//减法运算
        int n = number1.getNumerator() * number2.getDenominator() - number2.getNumerator() * number1.getDenominator();
        int d = number1.getDenominator() * number2.getDenominator();
        return new RationalNumber(n,d);
    }
    
    public RationalNumber multiply(RationalNumber number1, RationalNumber number2) {//乘法运算
        int n = number1.getNumerator() * number2.getNumerator();
        int d = number1.getDenominator() * number2.getDenominator();
        return new RationalNumber(n, d);
    }
    
    public RationalNumber divide(RationalNumber number1, RationalNumber number2) {//除法运算
        int n = number1.getNumerator() * number2.getDenominator();
        int d = number1.getDenominator() * number2.getNumerator();
        return new RationalNumber(n, d);
    }
    
    public boolean equal(RationalNumber number1,RationalNumber number2) {//判断两数是否相等
        if(number1.getDenominator() == number2.getDenominator() && number1.getNumerator() == number2.getNumerator())
            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;
    }
}

二、测试代码

import java.util.Scanner;

import RationalNumber.RationalNumber;;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个数的分子、分母,将自动转换为有理数输出:");
        int a = sc.nextInt(),b = sc.nextInt();
        System.out.println("请输入第二个数的分子、分母,将自动转换为有理数输出:");
        int c = sc.nextInt(),d = sc.nextInt();
        RationalNumber num1 = new RationalNumber(a,b);
        RationalNumber num2 = new RationalNumber(c,d);
        System.out.println("第一个数是"+num1.getNumerator()+"/"+num1.getDenominator());
        System.out.println("第二个数是"+num2.getNumerator()+"/"+num2.getDenominator());//此处可展示约分功能
        System.out.println("-----------------------------------------------");
        System.out.print("相加得:");
        System.out.println(num1.add(num1, num2));
        System.out.print("相减得:");
        System.out.println(num1.subtract(num1, num2));
        System.out.print("相乘得:");
        System.out.println(num1.multiply(num1, num2));
        System.out.print("相除得:");
        System.out.println(num1.divide(num1, num2));
        System.out.print("两数是否相等:");
        if(num1.equal(num1, num2))
            System.out.println("相等");
        else
            System.out.println("不相等");
        System.out.print("第一个数转换为long型:");
        System.out.println(num1.longValue());
        System.out.print("第一个数转换为double型:");
        System.out.println(num1.doubleValue());

    }
}

三、运行结果示例

输入1/2、3/4

 

 

 四、讨论

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

答:在使用C语言编写有理数代码过程中,注重的更多是完成这个功能,不要求功能与功能之间的联系,而面向对象编程则更加系统,不同的功能被不同的类,模块分隔的清楚,需要使用的时候只要使用我们所需的功能即可。

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

答:拷贝我的代码并命名如RationalNumber的类,然后就可以在编写代码过程中需要时或者建一个新类来输出时调用RationalNumber内的方法即可。

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

答:依赖,当我修改我的有理数类的属性时,会对他人调用我的代码时产生影响,其中可能包括入参、返回值等方面的改动产生的影响。

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

答:合适,使用public有助于其他类在使用有理数类的方法时能够直接有效的调用,而有的方法可以设置为private来限于自身访问。

 

posted @ 2020-10-04 02:43  Tvivanomy(王林涛)  阅读(126)  评论(0编辑  收藏  举报