下列題目中所有程序均假設以 Turbo Pascal 7.0 編譯;程序中任何 未有顯示宣告部份之變量,均假設已經適當地宣告。
1. 下列哪一個算式,當 p 及 q 不論是任何布爾值時,算式的值 均為 false?
A. not(p and (not p or q)) or q
B. (not q and (not p or q)) or not p
C. (p and q or not p) or (p or not (p or q))
D. not((p or q) and not p) or q 2. 下列哪一程序語句無法印出字符 'M'?
A. write(chr(77));
B. write(char(77));
C. write('m'-'a'+'A');
D. 上列皆不是
3. 設 Power 是一個遞歸函數(recursive function),以遞歸的方 法計算 x 的 n 次方。如 Power(3.0,4)的值是 81.00,而 Power(2.0,3)的值是 8.00。函數 Power 可以下列程序段去 實現:
function Power(x:real; n:integer) : real;
begin
if n = 0 then Power := 1 else
Power := x * (?) ; end; {end of function Power}
上列函數中缺去的部份(?)應填上甚麼?
A. Power(x, n);
B. Power(x, n+1);
C. Power(x-1, n);
D. Power(x, n-1);
4. 若 n 的值為 5,下列函數返回的值是多少?
function F(n : integer) : integer;
begin
if n = 0 then F := 1
else
F := n + F(n - 1);
end;
A. 16 B. 15 C. 5 D. 21
5. 若 n 的值為 10,下列函數返回的值是多少?
function F(n : integer):integer;
begin
if n < 2 then F := 0 else
F := 1 + F(n div 2);
end;
A. 5 B. 4C. 3
D. 2
6. 細閱下列程序段:
if a > 5 then
if a > 8 then write('Distinction') else write('Pass');
if a > 6 then write('Credit');
當 a=7 及 a=4 時,上列程序段的輸出分別為:
a=7 a=4 A. PassCredit 沒有輸出 B. Credit Pass
C. 沒有輸出 沒有輸出
D. Credit 沒有輸出
7. 下列為一個遊戲棋盤:
1 2 3 4 5
五個數字方塊及一個空白方塊可隨意放在棋盤上而產生不同 的排列方式,這些方塊放在遊戲棋盤上共可產生多少種不同 的排列方式?
A. 5! – 1 B. 5!
C. 6!
D. 6! – 1
8. 以下列函數計算 G(5)的數值是多少?
function G(n : integer) : integer;
begin
if n = 0 then G := 1 else
G := n * G(n-1);
end;
A. 1 B. 120 C. 25 D. 5
9. 下列各字符串若以 Pascal 程序按降序排序,結果的排列次序 為何?'IOI', 'NOI', 'SEARCC', 'SCY',
'SCYENDED'
A. 'SEARCC' > 'SCYENDED' > 'SCY' > 'NOI' >
'IOI'
B. 'SEARCC' > 'SCY' > 'SCYENDED' > 'NOI' >
'IOI'
C. 'IOI' > 'NOI' > 'SCYENDED' > 'SCY' >
'SEARCC'
D. 'IOI' > 'NOI' > 'SCY' > 'SCYENDED' >
'SEARCC'
10. 下列程序段的輸出為何?
for i := 1 to 5 do if i > 3 then
for j := 5 downto 1 do if j > 3 then
write(i);
A. 4455 B. 334455 C. 5454 D. 5544 11.
1 6 7 5 2
4 2 9 5 6
5 5 3 4 8
9 2 8 4 1
由上圖左上角沿一條路徑至右下角,路徑每次前進均只能向 右或向下,路徑所經數字的和最大是多少?
A. 35 B. 43 C. 46 D. 47 12.
從 S 往 T 共有多少條可能的路徑?
A. 8 B. 9 C. 10 D. 11
細閱下列說明,然後解答第 13-17 題:
二叉樹結構可以有三種不同的表達方式,以上圖的二叉樹為例:
中綴式(infix): ABCDMPZ 前綴式(prefix): DBACPMZ 後綴式(postfix): ACBMZPD 13. 以下是另一個二叉樹結構:
這樹若以中綴式及前綴式表示,分別為:
A. DCZXA, CDXZA B. CDAXZ, ACDXZ C. CDXZA, DZCXA D. ACXDZ, DZCXA
14. 如今要寫一個遞歸過程,把以後綴式表示的二叉樹結構寫出 來,下列哪一個程序段正確?
S T
procedure postfix(subtree : TreePointer);
begin ...
end;
A. if subtree <> null then begin
write(subtree^.root);
postfix(subtree^.left);
postfix(subtree^.right);
end;
B. if subtree <> null then begin
postfix(subtree^.left);
write(subtree^.root);
postfix(subtree^.right);
end;
C. while subtree^.left <> null do postfix(subtree^.left);
write(subtree^.root);
while subtree^.right <> null do postfix(subtree^.right);
D. if subtree <> null then begin
postfix(subtree^.left);
postfix(subtree^.right);
write(subtree^.root);
end;
15. 以下是一個二叉樹結構的中綴式及前綴式表示方式:
中綴式: ABCDEFGHI 前綴式: DBACGFEHI 則此二叉樹的後綴式表示方式為:
A. ACBEGFIHD B. ACEIFHBGD C. ABCEFIHGD D. ACBEFIHGD 題 16-17:
下列過程試圖按題 15 的要求提出解答:
procedure postfix(pre, mid : string;
var sub : string);
var
p: integer;
temp, sub1, sub2: string;
begin
temp := pre[1];
sub := '';
p := pos(temp, mid);
if p = 1 then sub1 := '' else (1) ;
if p = length(mid) then sub2 := ''
else
postfix(copy(pre, p+1, length(pre)-p), copy(mid, p+1, length(mid)-p), sub2);
(2) ; end;
16. 上列程序段中,(1)應填上甚麼?
A. postfix(pre, mid, sub1)
B. postfix(copy(pre, 1, p-1), copy(mid, 2, p), sub1)
C. postfix(copy(pre, 2, p-1), copy(mid, 1, p-1), sub1)
D. postfix(copy(pre, 2, p), copy(mid, 1, p), sub1)
17. 上列程序段中,(2)應填上甚麼?
A. sub := sub1 + sub2 + temp B. sub := temp + sub1 + sub2 C. sub := sub2 + sub1 + temp
D. sub := sub1[1] + sub2[1] + temp
18. 細閱下列程序段。若 i、j、k、n、answer 均已宣告為整數變 量,而 n 則已初始化為一正整數。
answer := 0;
for i:=2 to n do for j:=2 to n do
if (i > j) and (i mod j = 0) then answer := answer + 1;
answer := (n*(n - 1)) div 2 - answer;
上列程序段運行後,變量 answer 所儲的數值是:
A. 2 與 n 之間(包含 2 及 n)的質數數目
B. 數字對(i,j)的數目,其中 1<j<i<=n 且 i 是 j 的倍 數
C. 數字對(i,j)的數目,其中 1<j<i<=n 且 i 不是 j 的 倍數
D. 數字對(i,j)的數目,其中 1<=j<i<=n 且 i 不是 j 的 倍數
19. 某國家有多個城市,且有多條不同票價的巴士路線,從一個 城市直接到另一個城市。CityA 及 CityB 是該國的兩個城市 在該國的任何一個城市,均最少有一條路徑(乘搭一部或多 部巴士)由 CityA 到達此城市,且這城市亦最少有一條路徑 (乘搭一部或多部巴士)通往 CityB。若已知所有直接連接任 何城市間的巴士路線及票價,下列哪一(哪些)算法可找出由 CityA 至 CityB 的最廉宜票價?
A. 賦值 D = CityA 賦值 P = 0
當 D 並非 CityB,運行 由 D 的每一條巴士路線
選取票價最小者
把 P 賦值為 P + 此巴士路線的票價 把 D 賦值為此巴士路線的終點城市 輸出 P
B. 賦值集 S = {CityA}
賦值 CityA = 0 當 S 並非空集,運行
從 S 中找出一個數值最少的元素 D 從 S 中移走 D
從 D 開出的每一條巴士路線,運行 把此路線的終點城市加到 S 中 賦值此終點城市 = D 的數值
+ 此巴士路線的票價 輸出 CityB 的數值
C. A 與 B 都是 D. 上列皆不是
20. 有八個城市,代號分別為 0 至 7。城市代號可以二進制數字 表示,當而且僅當兩個二進制代號之間只有一個二進制位的 數字不同時,兩城市間有公路連接,並在下表以‘1’表示。
若參觀這些城市時必須沿著代號增加的方向(例如參觀完城 市 3 之後,雖然城市 3 與城市 2 之間有公路連接,但仍不可 回頭參觀城市 2),從城市 0 至城市 7 共有多少條參觀路徑?
To
From 0 1 2 3 4 5 6 7 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 2 0 0 0 1 0 0 1 0 3 0 0 0 0 0 0 0 1 4 0 0 0 0 0 1 1 0 5 0 0 0 0 0 0 0 1 6 0 0 0 0 0 0 0 1 7 0 0 0 0 0 0 0 0 A. 4
B. 6 C. 8 D. 12
21. 有兩種硬幣,分別為四元及七元,問有多少種不同的正整數 幣值無法以這些硬幣作任何組合去繳付?
A. 9 B. 10 C. 11 D. 8
細閱下列描述,然後解答題 22 至 25:
有九件工作 (J1, J2, J3, J4, J5, J6, J7, J8, J9) 分配給有三個處理器的系 統去完成,這三個處理器分別命名為 P1、P2 及 P3,工作分配時
須遵從下列限制:
(a) 任何一件工作均只可分配給三個處理器的其中一個 (b) J8 及 J9 必須分配給同一處理器
(c) J7 及 J9 不可分配給同一處理器
(d) J5 必須由處理 J6 或 J4 的處理器去處理 (e) 每一處理器必須處理最少兩件工作 22. 下列哪一工作分配方案是有效的?
A. P1: J1, J2, J8, J9 P2: J5, J6 P3: J3, J4
B. P1: J1, J2, J7, J8 P2: J3, J4, J5, J9 P3: J6
C. P1: J1, J2, J3, J7 P2: J8, J9 P3: J4, J5, J6
D. P1: J1, J2, J3 P2: J7, J8, J9 P3: J4, J5, J6
23. 若 J1、J2、J3、J4 及 J5 均分配予 P1,則下列哪一情況必定出現?
A. 無法產生任何有效分配方案 B. J8 及 J9 必須分配予 P2.
C. J6 及 J8 將分配予不同的處理器 D. J6 及 J7 將分配予不同的處理器
24. 若 J1、 J2、 J3 及 J4 均分配予 P1,而 J6 則分配予 P2,要產生 一個有效的分配方案,下列哪一項必定正確?
A. J5 將分配予 P2.
B. J7 將分配予 P2.
C. 剛好有兩件工作分配予 P2.
D. J8 將分配予 P3.
25. 設再有另一個限制:若 J5 與 J6 分配給同一個處理器,則 J5
與 J8 也要分配給同一處理器。若 J1、J2、J3 及 J6 已分配給 P1,
下列哪些工作可分配給同一個處理器?
A. J1 與 J4
B. J5 與 J8
C. J6 與 J7
D. 上列皆不是
細閱下列說明,然後解答題 26-29:
參賽者 C 參加了一項國際軟件比賽,賽事為時三小時,共有四道 題目,每一道題目的分數相同,都是 100 分。當 C 花了 10 分鐘閱 讀題目後,他作出了下列的估計:
(i) 花 30 分鐘去做題一,將可獲得 50 分,每多花 10 分鐘將可 多獲 5 分,直至滿分 100 分為止。例如若 C 花 70 分鐘去做題 一,他將可獲得 70 分。(注意:花 29 分鐘將會只獲得 0 分,
而花 69 分鐘將會只獲得 65 分)
(ii) 花 20 分鐘去做題二,將可獲得 10 分,每多花 15 分鐘,C 將 會多獲 10 分,直至滿分 100 分為止。
(iii) 花 30 分鐘去做題三,將可獲得 5 分,每多花 5 分鐘,C 將會
多獲 5 分,直至滿分 100 分為止。
(iv) 花 30 分鐘去做題四,將可獲得 90 分,每多花 10 分鐘,C 將 會多獲 5 分,直至滿分 100 分為止。
假設 C 的估計正確,則若 C 花 50 分鐘在題一、30 分鐘在題二、30 分鐘在題三、60 分鐘在題四,則 C 將會共獲得 60 + 10 + 5 + 100 = 175 分。
C 決定寫一個程序去協助他分配花在每一題的時間,以便獲取最 多的分數。
以下函數意圖計算當花 t1 分鐘在題一時,所得到的分數:
function score1(t1 : integer) : integer;
var answer : integer;
begin
L1: answer := 0;
L2: if t1 > 0 then begin
answer : = ((t1 - 30) div 10) * 5;
L3: if t1 >= 30 then answer:=answer + 50;
L4: if answer > 100 then answer :=100;
end;
score1 := answer;
end;
26. 但函數 score1 發生錯誤,下列哪一個 t1 的數值會令函數 返回一個錯誤的答案?
A. 170 B. 30 C. 22 D. 9
27. 要糾正該錯誤,下列哪一行需要作出修改?
A. L1 B. L2 C. L3 D. L4
28. C 終 於 完 成 了 四 個 函 數 :
score1(t1:integer)、score2(t2:integer)、score 3(t3:integer)及 score4(t4:integer),這些函數都 可以分別正確地返回題一至四所獲得的分數。
細閱下列程序段,其中 n 是當 C 完成此程序後所餘下的分鐘 數目(即 C 真正用於解答各比賽題目的時間)。
max := -1;
for t1 := 1 to n do for t2:=1 to n do for t3:=1 to n do for t4:=1 to n do
if t1 + t2 + t3 + t4 <= n then if score1(t1) + score2(t2)
+ score3(t3) + score4(t4) > max then
max := score1(t1) + score2(t2) + score3(t3) + score4(t4);
writeln('The max mark is', max);
可是,輸出的 max 並非真正的最佳數值!下列哪一項是這 問題的最佳解釋?
A. max 應初始化為 0 而非-1
B. 相對應的 t1、t2、t3 及 t4 的和比 n 為小
C. 最佳的時間分配方案花 0 分鐘在其中一道或多道題目上 D. 變量 t1、t2、t3、t4 既用在此程序段,也用在各函數
scoren 中
29. 不幸地,C 花了 50 分鐘仍無法正確地寫完其「最佳分數」程 序,他決定放棄。現在他只餘下 120 分鐘,他應如何分配以 便獲得最多的分數?
題 1 題 2 題 3 題 4
A. 30 分鐘 30 分鐘 30 分鐘 30 分鐘 B. 40 分鐘 20 分鐘 0 分鐘 60 分鐘 C. 70 分鐘 0 分鐘 0 分鐘 50 分鐘 D. 30 分鐘 50 分鐘 0 分鐘 40 分鐘 30. 下列哪一(些)有關遞歸過程的描述是必定正確的?
(i) 有一個參數是以參考方式傳遞(pass by reference) (ii) 有一個局部變量
(iii) 若它調用另一個過程,此過程必須為非遞歸的 A. 上列三語句皆否
B. 只有 (i) C. 只有 (i) 與 (ii) D. 上列三語句均是 31. 細閱下列程序段:
var k : integer;
function myst(j : integer) : integer;
begin
j := j + k;
myst := j;
end;
function strange(var i : integer) : integer;
begin
i := i + 1;
strange := myst(i);
end;
begin k:=3;
writeln(strange(k), k);
end;
輸出為何?
A. 73 B. 74 C. 83 D. 84
32. 細閱下列程序段:
var x, y :integer;
function F(n : integer) : integer;
begin
x := x + 1;
if (n = 0) or (n = 1) then F := 1 else F := F(n - 1) + F(n - 2);
end;
begin
x := 0;
y := F(10);
writeln(x);
end.
上列程序段的輸出為何?
A. 89
B. 117 C. 1023 D. 1024
33. 細閱下列程序段:
var a, b, x : integer;
begin
readln(a, b);
x := 0;
while b <> 0 do begin
x := x + a * (b mod 2);
a := a * 2;
b := b div 2;
end;
writeln(x);
end.
下列哪一(些)語句正確?
(i) 若 a 是偶數則 x 也是偶數 (ii) 若 b 是奇數則 x 也是奇數
(iii) 若 b 負數則 x 與 a 的正負號相同 A. 只有 (i)
B. 只有 (i) 及 (ii) C. 共有 (i) 及 (iii) D. (i)、(ii) 及 (iii) 34. 細閱下列程序段:
var
i, j, n : integer;
x, y : boolean;
begin
x := false; y := false; n := 0;
for i := 1 to 20 do for j := i+1 to 20 do
begin
if i mod 3 = 0 then x := true;
if j mod 5 = 0 then y := true;
if x and y then n := n + 1;
end;
writeln(n);
end.
上列程序段的輸出為何?
A. 6 B. 14 C. 152 D. 324
35. 細閱下列程序段:
var a, b, c, p, q, r : boolean;
begin
{...}
p := a and b;
q := a or c;
r := (p or q) and (b and not a);
{...}
end;
若上列程序段運行後,r 的值為 TRUE,則 a、b、c 的值分別 為何?
A. a=FALSE, b=TRUE, c=FALSE B. a=FALSE, b=TRUE, c=TRUE C. a=TRUE, b=FALSE, c=TRUE D. a=TRUE, b=TRUE, c=TRUE
36. 若有 10 個不同的數字 5, 10, 2, 9, 1, 7, 3, 6, 4, 8 存儲在陣列 A[1..10] 中,細閱下列程序段:
for i := 1 to 10 do
for j := i + 1 to 10 do if A[i] > A[j] then compare(A[i],A[j]);
過程 compare 共運行多少次?
A. 20 B. 23 C. 25 D. 45
37. 細閱下列程序段:
var a, b, c : integer;
begin
a := 32000;
b := 1000;
c := a+b;
writeln(c);
end.
上列程序段的輸出為何?
A. 466 B. 33000 C. –30766 D. –32302
38. 細閱下列程序段:
var
a : array[1..10,1..10] of integer;
i, j : integer;
begin
for i:=1 to 10 do
for j:=1 to 10 do a[i,j]:=i+j;
for i:=1 to 10 do
for j:=1 to 10 do a[i,j]:=a[j,i]
+j;
writeln(a[10,9]);
end.
上列程序段的輸出為何?
A. 29 B. 30 C. 36 D. 38
39. 細閱下列程序段,其中 swap(a,b)是一個過程,可以把字 符 a 與 b 互換:
var
s : string;
i, j, n : integer;
begin
readln(s);
n := length (s);
for i :=1 to n - 1 do for j:=1 to n - i do
if s[j] > s[j+1] then swap(s[j], s[j+1]);
end;
下列哪一組輸入須調用 swap( )次數最多?
A. 1234567 B. 1325476 C. 4321 D. 43125
40. 下列程序段可實現一個堆疊,假設不用報告上溢或下溢錯誤:
var
s : array[0..30000] of integer;
n : integer;
procedure push(i : integer);
begin
inc(n);
s[n] := i;
end;
function pop() : integer;
begin
pop := s[n];
dec(n);
end;
A. 過程 push 是錯的 B. 函數 pop 是錯的
C. 過程 push 及函數 pop 都是錯的 D. 過程 push 及函數 pop 都正確
題 41-45:
下列程序用以讀入連接六個城市間各道路的長度,然後找出任何 兩城市間的最短路徑。程序中欠缺部份語句。
program BFS;
const max = maxint;
var
i, j : integer;
queue : array [1..1000] of integer;
n : integer;
map : array [1..10, 1..10] of integer;
fp : {欠缺語句 1};
start, finish : integer;
city : array[1..10] of integer;
head, tail : integer;
current : integer;
begin
assign(fp, 'input.txt');
reset(fp);
readln(fp, n);
for i := 1 to n do begin for j := 1 to n do
read(fp, map[i, {欠缺語句 2}]);
readln(fp);
city[i] := {欠缺語句 3};
end;
readln(fp, start, finish);
city[start] := 0;
queue[1] := start;
head := 1;
tail := 2;
while tail > head do begin
current := queue[{欠缺語句 4}];
head := head + 1;
for i := 1 to n do
if (map[current, i] > 0) and (city[current] +
map[current, i] < city[i]) then
city[i] := city[current]
+ map[current, i];
end;
writeln('The shortest path from ', start, ' to ', finish, ' = ',
{欠缺語句 5});
close(fp);
end.
41. 取代{欠缺語句 1}的最佳選擇是:
A. text B. integer C. char D. byte
42. 取代{欠缺語句 2}的最佳選擇是:
A. i B. j C. n D. k
43. 取代{欠缺語句 3}的最佳選擇是:
A. 0 B. -1 C. i D. max
44. 取代{欠缺語句 4}的最佳選擇是:
A. head B. tail C. i D. j
45. 取代{欠缺語句 5}的最佳選擇是:
A. start B. finish
C. city[start]
D. city[finish]
美國信息交換標準代碼(ASCII)編碼表
(空白) 32 @ 64 ` 96
! 33 A 65 a 97
" 34 B 66 b 98
# 35 C 67 c 99
$ 36 D 68 d 100
% 37 E 69 e 101
& 38 F 70 f 102
' 39 G 71 g 103
( 40 H 72 h 104
) 41 I 73 i 105
* 42 J 74 j 106
+ 43 K 75 k 107
, 44 L 76 l 108
- 45 M 77 m 109
. 46 N 78 n 110
/ 47 O 79 o 111
0 48 P 80 p 112
1 49 Q 81 q 113
2 50 R 82 r 114
3 51 S 83 s 115
4 52 T 84 t 116
5 53 U 85 u 117
6 54 V 86 v 118
7 55 W 87 w 119
8 56 X 88 x 120
9 57 Y 89 y 121
: 58 Z 90 z 122
; 59 [ 91 { 123
< 60 \ 92 | 124
= 61 ] 93 } 125
> 62 ^ 94 ~ 126
? 63 _ 95