L2-005 集合相似度 (25分)
阿新 • • 發佈:2020-10-04
一、有理數類的程式碼
package BIgDecinal; 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, intdenominator) {//約分 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; } publicRationalNumber 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; } }
二、測試程式碼
package ss; import java.util.Scanner; import BIgDecinal.RationalNumber; public class Main { 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("第一個數轉換為長整型型:"); System.out.println(num1.longValue()); System.out.print("第一個數轉換為雙精度浮點型型:"); System.out.println(num1.doubleValue()); } }
三、執行結果示例
四、討論
1、問:描述與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?
答:在使用C語言編寫有理數程式碼過程中,注重的更多是完成這個功能,不要求功能與功能之間的聯絡,而面向物件程式設計則更加系統,不同的功能被不同的類,模組分隔的清楚,需要使用的時候只要使用我們所需的功能即可。
2、問:別人如何複用我的程式碼?
答:拷貝我的程式碼並命名如RationalNumber的類,然後就可以在編寫程式碼過程中需要時或者建一個新類來輸出時呼叫RationalNumber內的方法即可。
3、問:別人的程式碼是否依賴你的有理數類的屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?
答:依賴,當我修改我的有理數類的屬性時,會對他人呼叫我的程式碼時產生影響,其中可能包括入參、返回值等方面的改動產生的影響。
4、問:有理數類的public方法是否設定合適?為什麼有的方法設定為private?
答:合適,使用public有助於其他類在使用有理數類的方法時能夠直接有效的呼叫,而有的方法可以設定為private來限於自身訪問。