107年公務人員特種考試警察人員、一般警察人員考試及
107年特 種 考 試 交 通 事 業 鐵 路 人 員 考 試 試 題 代號:70620
全四頁 第一頁 考 試 別: 鐵路人員考試
等 別: 高員三級考試 類 科 別: 資訊處理 科 目: 程式語言
考試時間 : 2 小時 座號:
※注意: 禁止使用電子計算器。
不必抄題,作答時請將試題題號及答案依照順序寫在試卷上,於本試題上作答者,不予計分。
本科目除專門名詞或數理公式外,應使用本國文字作答。
一、Java 程式語言採用 dynamic dispatching。請問下面的 Java 程式輸出為何?並請略加解 釋 dynamic dispatching。(20 分)
import java.lang.*;
class A1 {
public void accept(B1 V, C1 W) { System.out.println("1.\n");
V.visit(W, this); }
public void accept(B2 V, C2 W) { System.out.println("2.\n");
V.visit(W, this); }
public void accept(B3 V, C3 W) { System.out.println("3.\n");
V.visit(W, this); } }
class A2 extends A1 {
public void accept(B1 V, C1 W) { System.out.println("4.\n");
V.visit(W, this); }
public void accept(B2 V, C2 W) { System.out.println("5.\n");
V.visit(W, this); }
public void accept(B3 V, C3 W) { System.out.println("6.\n");
V.visit(W, this); } }
class A3 extends A2 {
public void accept(B1 V, C1 W) { System.out.println("7.\n");
V.visit(W, this); }
public void accept(B2 V, C2 W) { System.out.println("8.\n");
V.visit(W, this); }
public void accept(B3 V, C3 W) { System.out.println("9.\n");
V.visit(W, this); } }
class B1 {
public void visit(C1 W, A1 U) { System.out.println("11.\n");
W.inspect(U, this); }
public void visit(C2 W, A2 U) { System.out.println("12.\n");
W.inspect(U, this); }
public void visit(C2 W, A3 U) { System.out.println("13.\n");
W.inspect(U, this); }
public void visit(C3 W, A3 U) { System.out.println("14.\n");
W.inspect(U, this); } }
(請接第二頁)
107年公務人員特種考試警察人員、一般警察人員考試及
107年特 種 考 試 交 通 事 業 鐵 路 人 員 考 試 試 題 代號:70620
全四頁 第二頁 考 試 別: 鐵路人員考試
等 別: 高員三級考試 類 科 別: 資訊處理 科 目: 程式語言
class B2 extends B1 {
public void visit(C1 W, A1 U) { System.out.println("15.\n");
W.inspect(U, this); }
public void visit(C2 W, A2 U) { System.out.println("16.\n");
W.inspect(U, this); }
public void visit(C2 W, A3 U) { System.out.println("17.\n");
W.inspect(U, this); }
public void visit(C3 W, A3 U) { System.out.println("18.\n");
W.inspect(U, this); } }
class B3 extends B2 {
public void visit(C1 W, A1 U) { System.out.println("31.\n");
W.inspect(U, this); }
public void visit(C2 W, A2 U) { System.out.println("32.\n");
W.inspect(U, this); }
public void visit(C2 W, A3 U) { System.out.println("33.\n");
W.inspect(U, this); }
public void visit(C3 W, A3 U) { System.out.println("34.\n");
W.inspect(U, this); } }
class C1 {
public void inspect(A1 U, B1 V) { System.out.println("41.\n"); } public void inspect(A2 U, B2 V) { System.out.println("42.\n"); } public void inspect(A3 U, B3 V)
{ System.out.println("43.\n"); } }
class C2 extends C1 {
public void inspect(A1 U, B1 V) { System.out.println("51.\n"); } public void inspect(A2 U, B2 V)
{ System.out.println("52.\n"); } public void inspect(A3 U, B3 V) { System.out.println("53.\n"); } }
(請接第三頁)
107年公務人員特種考試警察人員、一般警察人員考試及
107年特 種 考 試 交 通 事 業 鐵 路 人 員 考 試 試 題 代號:70620
全四頁 第三頁 考 試 別: 鐵路人員考試
等 別: 高員三級考試 類 科 別: 資訊處理 科 目: 程式語言
(請接背面)
class C3 extends C2 {
public void inspect(A1 U, B1 V) { System.out.println("61.\n"); } public void inspect(A2 U, B2 V) { System.out.println("62.\n"); } public void inspect(A3 U, B3 V)
{ System.out.println("63.\n"); } }
class Demo {
public static void main(String[] arg) { A2 a; B2 b; C2 c;
a = new A3();
b = new B3();
c = new C3();
a.accept(b, c);
}
} // end of the Demo class
二、請問下面的 Scheme 程式執行結果為何?(10 分)
(define x 0)
(+ 5 (call/cc (lambda (cc)
(set! x cc) 6) ) ) (* 8 (* 9 (+ 10 (x 35))))
執行完上列程式之後,接著再執行下面的程式,結果又為何?(10 分)
(+ 8 (- 9 (* 12 (x 31))))
三、在 Unix/Linux 的系統裡,libfoo.a 與 libfoo.so 之類的程式庫(libraries)有何不同?
並依生成方式、使用方式、使用時機、對系統的影響等面向說明。(20 分)
(請接第四頁)
107年公務人員特種考試警察人員、一般警察人員考試及
107年特 種 考 試 交 通 事 業 鐵 路 人 員 考 試 試 題 代號:70620
全四頁 第四頁 考 試 別: 鐵路人員考試
等 別: 高員三級考試 類 科 別: 資訊處理 科 目: 程式語言
四、考慮下列與前後文無關的文法(context-free grammar)。請問它是 LL(1)文法嗎?如果是,
請寫出它的 LL(1)文法分析表(LL(1) parse table)。如果不是,請說明理由。(20 分)
1.S ::= ABC 2.A ::= dB 3.A ::= e 4.B ::= Af 5.B ::= g 6.C ::= h
五、請問下列 C 程式執行的結果是什麼?(10 分)
#include <stdio.h>
int a, b;
void main() { a = 4;
b = 30;
printf("Before the switch statement, a= %d.\n", a);
switch (a) {
case 1: a = a *10; break;
case 2: a = a *10; break;
case 3: a = a *10;
while (a < b ) case 4: { a = a + 5; } break;
case 5: a = a *10; break;
default:
b = a *10; break;
} // end of switch
printf("after the switch statement, a= %d.\n", a);
}
請檢視下面的 C++程式,請問執行該程式後的輸出為何?(10 分)
#include <stdio.h>
class A{
public:
int X;
A() { X = 1; printf("X = %d\n", X); } };
class B : public A { public:
B() { X = 2; printf("X = %d\n", X); } };
main() {
B * pB = new B;
}