網路城邦
上一篇 回創作列表 下一篇   字體:
Java程式語言與系統開發期末報告
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 項。直接列出前十項,觀察一下就能了解了。

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

( 知識學習隨堂筆記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=ben168&aid=164638133