字體:小 中 大 | |
|
||||||||||||||||||||||
2021/07/03 08:30:40瀏覽636|回應0|推薦0 | ||||||||||||||||||||||
國立空中大學 109 學年度下學期期末考試題【正題】081 科目:Java 程式語言與系統開發 一律橫式作答 2-1 頁 科目:Java 程式語言與系統開發、班別:ZZZ002、姓名:、學號: 1.重要觀念(40%,每小題 10 分) (1).何謂抽象類別(abstract class)?並請舉例。 抽象類別代表僅含定義不含實際執行程式碼的類別。 通常抽象類別可用來萃取多種類別的共通性,在設計上比較方便。 抽象的方法(Abstract method)是不含執行程式碼的方法。 抽象類別與抽象方法的例子 abstract class job{ //抽象類別 abstract void cjob(); //抽象方法 } (2).何謂匿名式的內部類別 ( anonymous inner class),並請舉例。 此種類別宣告並無實作的內容,而是將其放置於其他類別中執行,例如classIn類別,其實作部分放在AtryInner建構子底下的方法。 class AtryInner { AtryInner ( ) { (new classIn ( ) { public void sayHi() {System.out.println("Hi from classIn!");} } // classIn類別的實作部分 ).sayHi( ); } } class classIn { } //classIn類別沒有實作部分 public class ATestInner { public static void main(String [ ] args) { AtryInner io = new AtryInner( ); } } (3).請比較 StringBuffer 與 StringBuilder 之間的差別。 主要的差別是速度,當執行程式時不需同步,StringBuilder的速度會比StringBuffer快,例如用在字串緩衝區被單一執行緒使用的時候。相對地,若是在多執行續共用時(同步), StringBuffer 雖較慢,但不會有共用上的錯誤。 (4).何謂遞迴程式?並請舉例。 遞迴是演算法中常用的技巧,當我們發現某個問題具有遞迴問題的特性時,可以試著思考一下如何運用遞迴的方法求解。使用遞迴的關鍵在於先找到問題本身的基礎問題,而整個問題的解決可以反覆應用基礎問題的解法來求解。 紙上作業: 先找幾個典型的可由遞迴方式求解的問題,例如「n階乘」的問題,試著用演算法的各種表示法來描述求解的步驟,一般人最先想到的大概是以控制迴路的方式,要用遞迴的話一定得寫副程式,所以先把問題分成主程式和副程式兩部分。 撰寫和測試遞迴的程式: 在遞迴呼叫的過程中,盡量利用變數值的輸出來觀察呼叫call和回傳return的順序,以及程式執行的中間結果。 應用遞迴演算法來解決問題: 有了經驗之後,才會慢慢地熟悉遞迴思考的模式,接下來就可以實際地應用遞迴演算法來解決問題;雖然迴演算法有一些效率上的問題,但是在表達上十分簡潔,習慣以後對於程式的設計有很大的幫助。 /* 遞迴函數開始 */ static int level(int k) { int sum; if (k <= 1="" font=""> return 1; else { sum = k * level(k-1); System.out.printf("%d * level(%d-1) = %d\n", k, k, sum); return sum; } } /* 遞迴函數結束 */ 2.程式題(30%) 假定我們希望透過類別繼承的關係以及重訂(override)方法來顯示幾何形狀的名稱,並且計算面積,形狀包含圓形與矩形。首先我們定義一個抽象類別 Shape,當中定義了兩個方法分別是 getName 與 getArea, 前者會傳回形狀的類別名稱,後者會傳回形狀的面積。 abstract class Shape { public String getName() { return this.getClass().getSimpleName(); } public abstract double getArea(); } 圓形類別Circle 繼承Shape,宣告一個私有變數為雙倍精確度的浮點數 r 作為半徑,建構方法只有一個參數,也就是半徑 r, 會將參數值設定成物件的屬性 radius。計算面積時會重訂父類別的 getArea 方法,因此在定義方法前要使用@Override,在方法內部則是傳回面積。 矩形類別 Rectangle 繼承 Shape,宣告二個私有變數為雙倍精確度的浮點數length 為長度, width 為寬度。建構方法有二個參數,也就是 length 與 width, 會將參數值設定成物件的屬性 length 與 width。計算面積時會重訂父類別的 getArea 方法, 因此在定義方法前要使用@Override, 在方法內部則是傳回面積。 最後要測試我們的程式是否正常運作, 要在主程式 main 當中,首先建立一個Circle 類別的物件, 然後將半徑 1.當作參數,接著呼叫 getName 方法,顯示形狀的名稱,接著呼叫 getArea 方法計算面積,然後顯示在畫面上。其次,建立一個 Rectangle 類別的物件,然後將長度與寬度都設定為 1.當作參數,接著呼叫 getName 方法,顯示形狀的名稱,接著呼叫 getArea 方法計算面積,然後顯示在畫面上。 請列印你的程式與執行的結果。 public abstract class Shape { public String getName() { //獲得圖形的名稱 return this.getClass().getSimpleName(); } public abstract double getArea();//獲得圖形的面積 } public class Circle extends Shape { private double radius; public Circle(double radius) {//獲得圓形的半徑 this.radius = radius; } @Override public double getArea() {//計算圓形的面積 return Math.PI * Math.pow(radius, 2); } } public class Rectangle extends Shape { private double length; private double width; public Rectangle(double length, double width) {//獲得矩形的長和寬 this.length = length; this.width = width; } @Override public double getArea() {//計算矩形的面積 return length * width; } } public class AreaName { public static void main(String[] args) { Circle circle = new Circle(1);//建立圓形物件並將半徑設定成1 System.out.println("圖形的名稱是:" + circle.getName()); System.out.println("圖形的面積是:" + circle.getArea()); Rectangle rectangle = new Rectangle(1, 1);//建立矩形物件並將長和寬設定成1 System.out.println("圖形的名稱是:" + rectangle.getName()); System.out.println("圖形的面積是:" + rectangle.getArea()); } } 圖形的名稱是:Circle 圖形的面積是:3.141592653589793 圖形的名稱是:Rectangle 圖形的面積是:1.0 3. 程式題(30%) 費氏數列(Fibonacci numbers)是指在一串數字中,每一項是前兩項的和。數學上的定義,第0 項等於0, 第1 項等於1; n>=2 時, 第n 項=第n-1 項+第n-2 項。直接列出前十項,觀察一下就能了解了。
請撰寫一個 Java 遞迴程式,從鍵盤輸入n 值, n 代表費氏級數的第n 項, n>=0, 在畫面顯示計算的結果f(n)。 請列印你的程式與執行的結果。 //費氏數列 by 遞迴 import java.io.*; public class FiboNumbers { public static void main(String args[]) throws IOException { BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); int n = 0; do { System.out.print("Input:"); try { n = Integer.parseInt(buf.readLine()); } catch (NumberFormatException e) { System.out.println("輸入非數字格式,重新輸入"); } } while ((n <= 0="" font=""> System.out.println("n=" + n + " F(" + n + ")=" + fab(n-1)); } public static int fab(int p) { if (p <= 1="" font=""> return 1; else return fab(p - 1) + fab(p - 2); } } Input:7 n=7 F(7)=13 |
||||||||||||||||||||||
( 知識學習|隨堂筆記 ) |