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来限于自身访问。