香港電腦奧林匹克競賽’97
初 賽
限時: 一小時三十分
1. 本試卷共有試題十一題題,共 247 分。不同題目各佔不同分數。
2. 所有答案必須寫在所提供的答題簿內,任何寫在本試卷內的答案均不會予以評分。
3. 使用 QuickBASIC 或 Pascal 其中一種程序語言編寫。整份試卷衹可使用一種程序語言作答。請把 所選用的程序語言填在答題簿上。
主辦機構:
香港教育署 香港電腦教育學會 香港電腦學會
1. 寫出下列各程序段的輸出:
(QuickBASIC 版本) (Pascal 版本)
(a) A = 5 A := 5;
B = 4 B := 4;
PRINT A; B writeln (A, ' ', B);
C = A C := A;
A = B A := B;
B = C B := C;
PRINT A; B; C writeln (A, ' ', B, ' ', C);
(b) K = 0 K := 0;
DO WHILE K <= 5 while K <= 5 do begin K = K + 2 K := K + 2;
PRINT K; write(K, ' ')
LOOP end;
(c) X = 1 X := 1;
Y = 2 Y := 2;
Z = 3 Z := 3;
IF X > Y THEN if X > Y then
PRINT X writeln(X)
ELSE else
IF Y < Z THEN if Y < Z then PRINT Y writeln(Y) ELSE PRINT Z else writeln(Z);
END IF END IF
(10 分)
2. 下列程序段用以計算以下算式:
1 1
1 1 2
1 1 2 3
1 1 2 3 4
1
1 2 3 4 5
填寫下列空格以完成此程序段:
(QuickBASIC 版本) (Pascal 版本)
S = ??? S := ??? ;
3. 給出 81 個數字 A1,,A2,A3, . . .,Ak, . . .,A80,A81,這些數字中八十個均相等,只有一 個較其他數字大。一個名為 Compare 的預設過程是用來比較兩數,compare(P, Q)比較兩 數 P 和 Q,並回送下列結果:(a) P=Q 或(b) P>Q 或 (c) P<Q。
按下列所示的方式,只調用 compare 四次,找出該較大的一個數字。把答案填在空格上。
步驟 1 設 S
1= A
1+ A
2+ A
3+ . . . + A
27S
2= A
28+ A
29+ A
30+ . . . + A
54Compare (S
1, S
2):
若 S
1> S
2取 k = 0 S
1< S
2取 k = 27 S
1= S
2取 k = 54
步驟 2 設 S
1= A
k+1+ A
k+2+ A
k+3+ . . . + A
k+9S
2= A
k+10+ A
k+11+ A
k+12+ . . . + A
k+18Compare (S
1, S
2):
若 S
1> S
2取 k = ???
S
1< S
2取 k = ???
S
1= S
2取 k = ???
步驟 3 設 S
1= A
k+1+ A
k+2+ A
k+3S
2= A
k+4+ A
k+5+ A
k+6Compare (S
1, S
2):
若 S
1> S
2取 k = ???
S
1< S
2取 k = ???
S
1= S
2取 k = ???
步驟 4 設 S
1= A
k+1S
2= A
k+2Compare (S
1, S
2):
若 S
1> S
2取 k = ???
S
1< S
2取 k = ???
S
1= S
2取 k = ???
步驟 5 輸出: "The larger number is"; A
k+1(9 分)
4. 以下為一程序段:
(QuickBASIC 版本) (Pascal 版本)
IF (A > B) AND (C < 0) THEN if (A > B) and (C < 0) then IF B > 5 THEN if B > 5 then
PRINT "X" writeln('X')
ELSE else
PRINT "Y" writeln('Y')
END IF else
ELSE writeln('Z');
PRINT "Z"
END IF
已知若要測試此程序段各個不同的邏輯路徑,最少要使用三組測試數據。建議三組測試數據 及其預期輸出。
(12 分)
5. 細閱下列程序段,並寫出此程序段運行後的輸出。
(QuickBASIC 版本) (Pascal 版本)
PROCESS(3) procedure PROCESS (A : integer);
END begin
if A > 10 then SUB PROCESS (A) writeln('HERE') IF A > 10 THEN else begin
PRINT "HERE" writeln(A);
ELSE PROCESS(A + 2)
PRINT A end
PROCESS (A + 2) end;
END IF
END SUB begin
PROCESS(3) end.
(10 分)
6. 小明編寫了下列程序段:
(QuickBASIC 版本)
PRINT " 10 9 8 7 6 5 4 3 2 1 "
PRINT " 10 9 8 7 6 5 4 3 2 "
PRINT " 10 9 8 7 6 5 4 3 "
PRINT " 10 9 8 7 6 5 4 "
PRINT " 10 9 8 7 6 5 "
PRINT " 10 9 8 7 6 "
PRINT " 10 9 8 7 "
PRINT " 10 9 8 "
PRINT " 10 9 "
PRINT " 10 "
(Pascal 版本)
writeln (' 10 9 8 7 6 5 4 3 2 1 ');
writeln (' 10 9 8 7 6 5 4 3 2 ');
writeln (' 10 9 8 7 6 5 4 3 ');
writeln (' 10 9 8 7 6 5 4 ');
writeln (' 10 9 8 7 6 5 ');
writeln (' 10 9 8 7 6 ');
writeln (' 10 9 8 7 ');
writeln (' 10 9 8 ');
writeln (' 10 9 ');
writeln (' 10 ');
編寫一不超過兩句輸出語句的程序段,使其能產生與小明的程序段一樣的輸出。
(10 分)
7. 一位商人要向一間公司購買一批鑽石。一顆三卡以下的鑽石,每卡價值$1234;一顆三卡或 以上的鑽石,每卡價值$2345。試編程找出此商人所購買的鑽石的總值。每顆鑽石的重量於 程序運行時由鍵盤輸入。
(注意:除以上所列之條件外,你可考慮在程序中加入如輸入提示或其他所需的條件。)
(20 分)
8. 在一個邊長為 S 的等邊三角形中,可劃上一個邊長為 S/2 的等邊三角形,這一個新劃上的等 邊三角形經加暗後如圖 8-1 所示。在 3 個邊長為 S/2 而未經加暗的等邊三角形中,每一個均可 劃上一個邊長為 S/4 的等邊三角形,這 3 個新劃上的等邊三角形經加暗後如圖 8-2 所示。在 9 個邊長為 S/4 而未經加暗的等邊三角形中,每一個均可劃上一個邊長為 S/8 的等邊三角形,這 9個新劃上的等邊三角形經加暗後如圖 8-3 所示。餘此類推。
編寫一程序段找出最少須劃多少個等邊三角形使得所有著色等邊三角的面積大於所給出邊長 為 S 的三角形面積的 90%。
圖 8-1 圖 8-2 圖 8-3
(30 分)
9. 利用 1, 2, 3, 4, 5, 6, 7 及 8 中任意四個數字可組成一個四位數。
(a) 若給出的八個數字中,每一個均可以重覆使用,編寫一能愆生所有不同四位數的程 序。例如 1111, 1234, 2134, 6236, 8154 為其中數個四位數。
(b) 若給出的八個數字中,每一個最多只可使用一次,編寫一能愆生所有不同四位數的 程序。例如 1234, 2134, 8154 為其中數個四位數;而 1111, 6236 則不是。
(40 分)
10. 線性搜索及對分搜索為兩種搜索算法。它們的算法如下所示。設該數據陣列的名稱為 Num,
數據陣列 Num 中第 i 個元素以 Num[i] 表示,此數據陣列中元素的數目為 N,要搜索的目 標為 Target,。
線性搜索
設定 P 為 0 , CNT 為 0 重覆
把 CNT 的數值增加 1 --- (*) 直至 Num[CNT] = Target 或 CNT > N
若 CNT 不大於 N, 設定 P 為 CNT
對分搜索 (陣列 Num 應已按升序排序) 設定 Head = 1, Tail = N 重覆
設定 P 為 Head 與 Tail 的值之和除以 2 所得的商的整數值 若 Num[P] > Target 則設定 Tail 為 P - 1
若 Num[P] < Target 則設定 Head 為 P + 1 --- (**) 直至 Num[P] = Target 或 Head > Tail
若 Num[P] 不等於 Target 則設定 P 為 0
注意: 在兩個算法中,若 Target 的值在 Num 中出現,P 存儲與 Target 吻合的元素的位 置。否則, P 賦值為 0 。
(a) 若 Target 的數值為 37,陣列 Num 存儲了下列七個數字:
1, 23, 26, 45, 58, 93 和 102。
(i) 當採用線性搜索算法時,寫出語句(*)運行時 Num[CNT]的內容。
(ii) 當採用對分搜索算法時,寫出語句(**)運行時 Num[P]的內容。
(b) 若陣列 Num 有 2 000 000 個數字,找出
(i) 當採用線性搜索算法時,語句(*)的最高運行次數;及 (ii) 當採用對分搜索算法時,語句(**)的最高運行次數。
(c) 使用遞歸子程序編寫一程序段去實施對分搜索算法。
(40 marks)
11. 在圖書館當要以一組關鍵字搜索文章時,文章內的字往往不用與這組關鍵字完全吻合。這些 關鍵字在文章中可能被其他字所分隔,或以相反的次序出現,也被視作搜索成功。例如若關 鍵字 為 "Computer" 和 "Education" ,則文 章中 若出 現 "computer in education" 或 "education by using computer"均被視為滿足搜索的條件。
可是,這方法會找到太多文章,其中有些可能並非用戶所需要用到的。因此,較佳的方法就 是為每一篇文章計算一個相關分數,這個分數可約略地告知用戶該文章與所提供的關鍵字的 相關程度為何。當使用兩個不同的關鍵字(K1 及 K2)進行搜索時,相關分數,S,定義為 S = ( A
* B ) / ( C + 1) ;其中
S 是相關分數;
A 是第一個關鍵字(K1)在該文章中所出現的次數;
B 是第二個關鍵字(K2)在該文章中所出現的次數;
C 是該文章中任何 K1 與任何 K2 之間的最短距離。
下列定義用以確定 A,B 及 C 的值:
w 一個字是指一組字母數字串,它由任何一個或多個非字母數字符(例如空白符、標點符 號等)與其他字分隔。
w 文章中出現某一關鍵字是指文章中有一個字的串法(大小寫不論)與該關鍵字完全相同。
w 兩字間的距離指在兩字之間的字數。距離的所有可能值中最小的是該文章中兩個關鍵字 的最短距離。若兩個關鍵字不能配對,則最短距離定義為零。給出例子如下:
關鍵字 Computer Education
文章 ART1 ...computer assisted learning in education....education by computer....
...Computer application in education 文章 ART2 ...education in computer education 文章 ART3 ...education in society....
文章 ART1, ART2, ART3 的 S, A, B 及 C 的值分別如下:
A的值 B的值 C的值 S的值
文章 ART1 3 3 1 4.5
文章 ART2 1 2 0 2
文章 ART3 0 1 0 0
編程接受從鍵盤輸入兩個關鍵字;從文本文件讀入文章;計算此文章的相關分數;然後把這 相關分數在屏幕顯示。
文章儲存在一文本文件"INPUT.TXT"中,文件的第一行為一整數,表示隨後文本的行數。其 後,每行文本均少於 256 個字符,全篇文章的總字數少於 2000 個。
運行樣本
Enter two keywords? Computer Education Relevance score = 34.5
(60 分)
全卷完