國立空中大學 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 項。直接列出前十項,觀察一下就能了解了。
|
f[0] |
f[1] |
f[2] |
f[3] |
f[4] |
f[5] |
f[6] |
f[7] |
f[8] |
f[9] |
f[10] |
|
0 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
請撰寫一個 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


