臺北市 107 學年度高級中學
資訊學科能力競賽 筆試試卷
(A 版)
說明: 1. 作答時間 60 分鐘。若須計算或作圖,請利用本試卷的空白處。 2. 本筆試試卷題目為選擇題共 25 題,每題 4 分,滿分為 100 分。 3. 答案必須按題號依序填入「答案卷」上之空格內,否則不予計分。 4. 本試卷共分 A、B、C、D 四個版本,作答前請先校對試卷與答案卷是否為相同版本。 1. 給定右側程式片段,請問若以該程式判斷全 年 365 天(變數 month 為月份,day 為該 月所屬日期,不考慮閏年),有幾天會被判 斷成耶誕節?(! 運算子為邏輯運算 NOT, && 運算子為邏輯運算 AND。 (A) 354 (B) 1 (C) 11 (D) 364 2. 以下為兩個 C 程式片段,請問左右兩個程式的輸出分別為? int x=0, y=0; while (x<20) { y=y+x; x=x+1; } printf("%d\n", x+y); int x=0, y=0; while (x<20) { x=x+1; y=y+x; } printf("%d\n", x+y); (A) 左:38,右:39 (B) 左:39,右:40 (C) 左:209,右:229 (D) 左:210,右:230 3. 給定右側函式 f(),請問哪一個函式呼叫會輸出 ACE? (A) f(7, 0) (B) f(21, 0) (C) f(135, 0) (D) f(024, 0)if (!(month == 12) && day == 25) printf("不是");
else
printf("耶誕節");
void f(int n, int d) { if (n==0) return;
if (n%2) printf("%c", 'A'+d); f(n/2, d+1);
4. 使用二分搜尋法 (binary search) 在一個整數陣列中搜尋特定數值中,下列何者為非? (A) 陣列中的數值必須已依大小排序,否則不保證搜尋結果正確。 (B) 二分搜尋法不能處理資料不存在的狀況。 (C) 若陣列大小擴增為 N 倍,線性搜尋法 (linear search) 所需計算量平均擴增 N 倍,但二分搜尋法只會擴增 √𝑁 倍。 (D) 若只需要搜尋一次,使用「線性搜尋法」會比「將陣列排序再作二分搜尋法」 更有效率。 5. 在某個程式語言中,若 a 與 b 為兩個整數變數: a/b 運算是「a 除以 b」,例如 3/2 為 1.5。 a//b 運算是「小於且最靠近 a/b 的整數」,例如 3/2 為 1。
a%b 運算是「取 a 除以 b 的餘數」,且必定滿足 a = b´(a//b) + (a%b)。 請問若 a 為介於 0 到 10000(含)的值,a % -1234 不可能是下列哪個值?
(A) 0 (B) 3 (C) -3 (D) 都有可能 6. 下列何者不屬於低功率廣域網路 (Low-Power WAN, LPWAN) 技術?
(A) LoRa (B) NB-IoT (C) Sigfox (D) ZigBee 7. 下列何者為寄送電子郵件所需使用的服務/協議?
(A) DNS (B) FTP (C) POP3 (D) SMTP
8. 對一個二元樹 (Binary tree) 而言,若它有 200 個樹葉節點 (leaf node),則它有多少個 分支度 (degree) 為 2 的節點 (node)? (A) 199 (B) 200 (C) 201 (D) 100 9. 有關社交工程的敍述,下列哪一項錯誤? (A) 為避免感染病毒,應關閉電子郵件預覽窗格功能 (B) 駭客會夾帶程式上有弱點的附件檔如.exe 檔,藉以啟動安裝木馬程式,但一 般來說若是附件檔為.pdf 就没有問題,可以放心打開 (C) 電子郵件社交工程的攻擊有假冒寄件者、寄送讓收件者感興趣的主旨與内文 (D) 不開啟陌生人電子郵件是好的資安習慣 10. 下列關於雜湊(Hash)函數的敘述,何者錯誤? (A) 固定長度 (B) 正常情況下雜湊結果為唯一值 (C) 常用於驗證資料的完整性 (D) 可以解密
11. 樸克牌 A 至 K 正面朝上依序排成一列(A, 2, 3, …, 10, J, Q, K),若間隔 1 張翻牌, 則 2、4、6、8、10、Q 會變成背面朝上,接下來再從 A 開始,但間隔 2 張再翻牌, 接下來再從 A 開始,間隔 3 張再翻牌…,如此進行直到完成間隔 12 張翻牌。請問最 後正面朝上牌的牌共有幾張? (A) 1 張 (B) 2 張 (C) 3 張 (D) 以上皆非 12. 遞迴程式的呼叫與返回會用到下列哪一種資料結構?
(A) 串列(Linked list) (B) 佇列(Queue) (C) 堆疊(Stack) (D) 以上皆會用到 13. 給定右側函式 f,若要計算 f(5),請問函式 f 總共被呼叫多少次? (A) 14 次 (B) 15 次 (C) 16 次 (D) 以上皆非 14. 給定右側程式片段, 輸出結果為何? (A) 9 (B) 10 (C) 11 (D) 12 15. 十六進位 ( B7 )16 與 ( E4 )16 轉成二進位後進行 XOR 運算,結果為何? (A) ( 53 )16 (B) ( 247 )10 (C) ( 244 )8 (D) 以上皆非 int f(int n) { if (n==0) return 0; else if (n==1) return 1; else return f(n-1)+f(n-2); } int A[11]={0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; ...
int loop (int x) {
int i=1, j=10, k, count=0; do { count ++; k=(i+j)/2; if(A[k]<=x) i=k+1; else j=k-1; } while(i<=j); return count; } … printf ("%d\n", loop(1)+loop(3)+loop(21));
16. 一般在網路上使用 QoS(Quality of Service)技術,最主要的目的是 (A) 限制特定服務的存取 (B) 提升整體網路的速度 (C) 讓特定用戶具有優先使用權 (D) 讓特定的網路流量有優先權 17. 後序表示法的四則運算式通常會以堆疊(stack)來進行計算,演算法則如下: 對於每個後序的「元素」,進行下列處理: i. 如果「元素」是運算符號,則從堆疊 pop 兩次將取得的數字進行該運算, 然後將計算後的結果 push 到堆疊中; ii. 如果「元素」是數字,則 push 到堆疊中; 最後將堆疊中的結果 pop 出來就是答案。 若對下列後序運算式進行計算會需要m 次的 push 跟 n 次的 pop,請問 m –n =? 36 10 15 3 / 6 - * + 2 20 5 / * + (A) 0 (B) 1 (C) -1 (D) 以上皆非 18. 記憶體階層(Memory Hierarchy)是在電腦架構下儲存系統階層的排列順序。越上層的記 憶體有著越高的存取速度以及越小的容量,反過來說,越下層的記憶體的存取速度較 慢但容量也較大。請問下面四個選項中,哪一個選項相較下是處於最低的記憶體階層? (A) 快取記憶體(Cache)
(B) 動態隨機存取記憶體(Dynamic Random Access Memory) (C) 磁帶儲存(Tape Storage) (D) 暫存器(Register) 19. 在 IP 網路的世界中,每個連上網路的電腦都有一組 IP 位置。以臺灣師範大學資工系的 網頁伺服器為例,它的 IP 位置是 140.122.64.147。然而當我們在存取網頁服務時,通常 我們不會在網頁瀏覽器上輸入 140.122.64.147,而會輸入 www.csie.ntnu.edu.tw。請問是 下面那一種網路協定會把 URL 的字串轉換成為 140.122.64.147?
(A) CDN (Content Delivery Network) (B) DNS (Domain Name System) (C) ARP (Address Resolution Protocol) (D) HTTP (HyperText Transfer Protocol)
20. 下方 power( ) 函式應可進行指數次方運算。舉例來說,power(2, 3) = 23 = 8。 底線的部份應該填入哪段程式碼才會有正確的結果?
(A) base * power(base, exp – 1); (B) base * power(base / 2, exp – 1);
(C) power(base, exp -1) * power(base, exp -1); (D) base * power(base, exp / 2);
21. 下方左側函式 f 是一個遞迴的函式。請問如果改寫成右側疊代(iteration)的版本的話, 在底線的部份應該要填入哪段程式碼? int f ( int n ) { if ((n==2)||(n==1)||(n==0)) return n; else return f(n–1)+f(n–2)+f(n-3); }
int f_iteration( int n ) { int a=0, b=1, c=2, d=3; for (int i=0; i<n; i++) {
_________?____________ }
return a; }
(A) a=a+1; b=b+2; c=c+3; d=a+b+c; (B) a=b; b=c; c=d; d=a+b+c; (C) a=b+1; b=c+2; c=d+3; d=a+b+c; (D) d=a+b+c; a=b+1; b=c+1; c=d+1; 22. 程式語言一般被區分為高階語言與低階語言二類。關於此二類程式語言,下列敘述何 者正確? (A) 低階語言較高階語言容易開發 (B) 高階語言的執行效率通常較低階語言佳 (C) 高階語言較低階語言可攜性高
int power( int base, int exp) { if (exp == 0) return 1;
else if (exp % 2)
return _______?_________ ; else {
int temp = power(base, exp / 2); return temp * temp;
} }
23. 下列陣列內容的改變為哪一個排序法的執行過程?
5 4 3 2 1 à 1 4 3 2 5 à 4 1 3 2 5 à 4 2 3 1 5 à 1 2 3 4 5 à 3 2 1 4 5 à 1 2 3 4 5 à 2 1 3 4 5 à 1 2 3 4 5
(A) 堆積排序法 (heap sort) (B) 合併排序法 (merge sort) (C) 泡沫排序法 (bubble sort) (D) 選擇排序法 (selection sort)
24. 右側的程式執行輸出為 123。請問原因為何? (A) 0.1 的二進位表示為有限位元,但 0.3 的二進位表示為無限位元。 (B) 0.1, 0.2, 0.3 的二進位表示皆為有限 位元,但計算機在處理浮點數時因精度問 題產生了誤差。 (C) 十進位的 0.1 + 0.2 和 0.3 本來就不 相等。 (D) 計算機在處理浮點數時,以較大的值估算 0.1,因而造成此結果。 25. 右側程式執行後之輸出為何? (A) 0 (B) -1 (C) 5 (D) 10
int main (void) {
if (0.1 + 0.2 != 0.3) printf("123\n"); else printf("456\n"); return 0; } int f(x) { if (x > 10) return 1; else return f(x + 5) + f(x + 10); } int main(void) { int ans; ans = f(-1); printf("%d\n", ans); return 0; }