一、下列是以C、Java及Javascript三種語言撰寫存取陣列(array)的程式片斷,
請問此程式片斷執行後,會產生什麼結果?如果結果錯誤,錯誤訊息為何?
各用什麼方法可避免錯誤。請寫出完整的程式來說明你的方法。(25分)
C: int a[] = {0, 1, 2, 3}; for (i=0; i<=sizeof(a); i++) printf(“%d”, a[i]);
Java: int[] a = {0, 1, 2, 3}; for (i=0; i<=a.length; i++) System.out.println(a[i]);
Javascript: var a = [0, 1, 2, 3]; for(i=0; i<=a.length; i++) document.write(a[i]);

【答】
C語言:
for迴圈應該只能跑0~3(陣列a共4個元素個數),
原程式中sizeof(a)=16,for迴圈會跑0~16,這樣是不對的,已經超過陣列a的長度了,
會讀出錯誤的數值(記憶體位置內存的資料未知)。

解釋:
sizeof(a)是取出陣列a所有元素的總byte數,不是陣列a有幾個元素個數。
應該使用sizeof(a)/sizeof(a[0])取得陣列a的元素個數。

正確寫法如下:
int a[] = {0, 1, 2, 3}; for (i=0; i< sizeof(a)/sizeof(a[0]); i++) printf(“%d”, a[i]);


Java: 
for迴圈應該只能跑0~3(陣列a共4個元素個數),
原程式for迴圈是跑0~4,超過陣列a的元素個數,會讀出錯誤的數值(記憶體位置內存的資料未知)。

解釋:
a.length會傳回陣列a元素個數,此例元素個數為4,所以迴圈會跑0~4,
陣列index是從0開始,4的位置已超出原本陣列a的長度。

正確寫法如下:
int[] a = {0, 1, 2, 3}; for (i=0; i< a.length; i++) System.out.println(a[i]);


Javascript:
for迴圈應該只能跑0~3(陣列a共4個元素個數),
原程式for迴圈是跑0~4,超過陣列a的元素個數,會顯示沒有定義(undefined)。

解釋:
a.length會傳回陣列a元素個數,此例元素個數為4,所以迴圈會跑0~4,
陣列index是從0開始,4的位置已超出原本陣列a的長度。

正確寫法如下:
var a = [0, 1, 2, 3]; for(i=0; i< a.length; i++) document.write(a[i]);


三、下面是一個使用Scheme functional language寫成之程式。回答下列問題:(25分)
(define unknown
(lambda (L)
(cond
((null? L) L)
((null? (cdr L)) L)
((eqv? (car L) (car (cdr L))) (unknown (cdr L)))
(else (cons (car L) (unknown (cdr L)))))))
1.請說明Functional Language 之主要優缺點。
2.請說明上述程式之功能。
3.請說明 (unknown ‘(3 3 2 2 2 4 4 3 4 2 2 1 0)) 之執行結果為何?

【答】
1.Functional Language 優點:程式碼簡潔直覺。缺點:前置式運算式寫法,不易閱讀。

2.解析:
(define unknown .........宣告函式, 名稱為 unknown
    (lambda (L) .........宣告函式參數, 名稱為 L
    (cond .........if-else敘述開始
    ((null? L) L) .........if L是null, 則傳回L
    ((null? (cdr L)) L) .........else if L的第一個元素之後是null, 則傳回L
    ((eqv? (car L) (car (cdr L))) (unknown (cdr L))) 
    .........else if L的第一個元素 == L的第二個元素, 則遞迴呼叫unknown函式(參數為L去掉第一個元素)
    (else (cons (car L) (unknown (cdr L))))))) 
    .........else 將L的第一個元素 跟 遞迴呼叫unknown函式(參數為L去掉第一個元素)傳回的值合併
此程式將把L串列內容連續重複出現的數字去除

3.結果:3 2 4 3 4 2 1 0

arrow
arrow
    全站熱搜

    伊 發表在 痞客邦 留言(0) 人氣()