# [APCS] 基礎觀念習題 ###### tags: `APCS` * 以下關於直譯式程式語言及編譯式程式語言的敘述,何者錯誤? (A) 直譯式程式語言不需要經過編譯就能執行 (B) 編譯式程式語言需要經過編譯器編譯 \(C\) C++ 是一種直譯式程式語言 (D) Python 是一種直譯式程式語言 :::spoiler 解答 (D),C++ 屬於一種編譯式語言。 程式語言的分類可以有以下幾種: 1. 依階層劃分 同時也是程式的發展演進,從低階語言到高階語言,越低階越接近機器運作的方式、越高階越接近人類認知運作的方式。 * 低階語言:機器語言(Machine Language)、組合語言(Assembly Language) * 高階語言:C/C++, Java, Python * 最終我們希望完全使用自然語言操作電腦,也就是我們平常說話使用的語言。 2. 根據執行方式劃分 * 直譯式程式語言(Intepreted Language) 系統可以將原始程式的指令逐一的翻譯並執行,**不需要經過編譯**,如Python、HTML等。特點是修改程式及除錯,較為簡單容易。 * 編譯式程式語言(Compiled Language) 撰寫的原始程式,**需要經過編譯器編譯**之後,輸出為電腦中直接執行的目的程式,如C、C++、PASCAL等。特點是再次使用只要執行目的程式,無須重新在編譯其原始程式。 3. 根據設計方式劃分 * 結構化程式語言(Structured Programming Languages) 結構化的程式是以一些簡單、有層次的程式流程架構所組成,針對「循序、條件、重複」三大訴求。例如: C, BASIC * 物件導向程式語言(Object-oriented Programming Language) 具有封裝(隱藏)、繼承、多型三大概念的程式程式設計典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性與方法。物件則指的是類別的實例。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的再利用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。例如: Python, Javascript, C++ 4. 根據軟體與使用者和資料互動面向劃分 * 前端程式語言 可設計軟體使用者介面,讓使用者操作、取得資料輸出。例如:Javascript * 後端程式語言 用來讀取、運算資料,傳輸到前端。例如:Python,PHP,ASP * 資料標記語言 用來描述資料,以便提高存取效率。例如: CSS(描述網頁樣式), HTML(描述網頁資料格式與內容), XML, JSON ::: * 程式執行過程中,若變數發生溢位情形,原因為何? (A) 以有限數目的位元儲存變數值 (B) 電壓不穩定 \(C\) 作業系統與程式不相容 (D) 變數過多導致編譯器無法完全處理 :::spoiler 解答 (A)。載入資料量超過記憶體可承載資料量限制,我們稱為溢位(overflow)。 ::: * 函數`f`定義如下,若呼叫`f(1000)`,其中指令`sum = sum + i`的執行次數最接近何者? (A) 1000 (B) 3000 \(C\) 5000 (D) 10000 ![](https://hackmd.io/_uploads/B1ITw-nl3.png =60%x) :::spoiler 解答 (B) ::: * 以`a(13, 15)`呼叫函式`a`,回傳值為多少? ![](https://hackmd.io/_uploads/HyMcdb3e3.png =60%x) :::spoiler 解答 103 ::: * 以下是一個計算費氏數列第 $N$ 項($N \geq 2$)的函式。若要正確輸出費氏數列,`(a)`和`(b)`分別要填入什麼? ![](https://hackmd.io/_uploads/r15X9Zhx2.png =60%x) (A) ``` (a): f[i] = f[i - 1] + f[i - 2] (b): f[N] ``` (B) ``` (a): a = a + b (b): a ``` \(C\) ``` (a): b = a + b (b): b ``` (D) ``` (a): f[i] = f[i - 1] + f[i - 2] (b): f[i] ``` :::spoiler 解答 \(C\)。不要看到費氏數列就以為是遞迴!這個程式用了類似動態規劃的方式,只要花費 $O(N)$ 的時間就能計算出費氏數列的第 $N$ 項。 ::: * 請問以下程式輸出為何? ![](https://hackmd.io/_uploads/HyWfnZ3x2.png =60%x) (A) 1 (B) 4 \(C\) 3 (D) 33 :::spoiler 解答 (B) ::: * 求`g(13)`之回傳值。 ![](https://hackmd.io/_uploads/H1M62-hx2.png =60%x) (A) 16 (B) 18 \(C\) 19 (D) 22 :::spoiler 解答 (C) ::: * 若要將`a[0]`的元素移到`a[n - 1]`,則程式片段中 `______`要填入什麼? ![](https://hackmd.io/_uploads/Hylta-nln.png =60%x) (A) `n + 1` (B) `n - 1` \(C\) `n - 2` (D) `n` :::spoiler 解答 (C),注意其他元素都要往前移一格。 ::: * 呼叫`f1(1)`的過程中,以下何者錯誤? ![](https://hackmd.io/_uploads/r1fvRb2e3.png =45%x) (A) 印出的數字中最大的是 4 (B) `f1`一共被呼叫 2 次 \(C\) `f2`一共被呼叫 3 次 (D) 數字 2 被印出 2 次 :::spoiler 解答 (C) ::: * (a), (b), \(c\) 要分別填入什麼,才能使`f(4)`印出2468? ![](https://hackmd.io/_uploads/SyNBJzngh.png =60%x) (A) 1, 2, 1 (B) 0, 1, 2 \(C\) 0, 2, 1 (D) 1, 1, 1 :::spoiler 解答 (A) ::: * 以下程式以輾轉相除法求`i`和`j`的最大公因數。`while`迴圈裡面應該填入什麼? ![](https://hackmd.io/_uploads/B1IkxM2g3.png =60%x) (A) ```cpp k = i % j; i = j; j = k; ``` (B) ```cpp i = j; j = k; k = i % j; ``` \(C\) ```cpp i = j; j = i % k; k = i; ``` (D) ```cpp k = i; i = j; j = i % k; ``` :::spoiler 解答 (A)。分析輾轉相除法,`i`代入每回合被除數、`j`代入每回合除數、`k`是每回合的餘數、以及把最後結果代給`j`。 ::: * `G()`是一個遞迴程式,其回傳值為下表,則`______`應填入什麼? ![](https://hackmd.io/_uploads/SyTBbfhg3.png =45%x) ![](https://hackmd.io/_uploads/rkGUZfheh.png =45%x) (A) `((2 * a + 2)) * G(a, x - 1)` (B) `(a + 5) * G(a - 1, x - 1)` \(C\) `((3 * a - 1)) * G(a, x - 1)` (D) `(a + 6) * G(a, x - 1)` :::spoiler 解答 (A) ::: * `F(7)`之輸出為99,則`<condition>`應填入什麼? ![](https://hackmd.io/_uploads/r1iU7i6g2.png =45%x) (A) `a < 3` (B) `a < 2` \(C\) `a < 1` (D) `a < 0` :::spoiler 解答 (D) ::: * $n$ 為正整數,則以下程式執行完畢後 $a$ 為? ![](https://hackmd.io/_uploads/B1WMEjpx2.png =45%x) (A) $n(n+1)/2$ (B) $n^3 / 2$ \(C\) $n(n-1) / 2$ (D) $n^2(n + 1) / 2$ :::spoiler 解答 (D) 前兩個迴圈總執行次數:$n+(n-1)+(n-2)+...+1 = n(n+1)/2$ 第三個迴圈執行 $n$ 次 所以整個程式總執行次數為 $n^2(n + 1) / 2$ ::: * 以下是根據分數判斷等第的程式,正確的等第計算公式為: ![](https://hackmd.io/_uploads/SJZQSsaen.png =35%x) 則這個程式,0到100分鐘有幾個等第會計算錯誤? ![](https://hackmd.io/_uploads/Sks8HsTgh.png =45%x) :::spoiler 解答 11個 :::