# APCS ![APCS-BG](https://hackmd.io/_uploads/BJ86xLdsyx.jpg) <!-- ![images](https://hackmd.io/_uploads/H1kIZ8usJx.png) --> :::info [TOC] ::: <br/> ## __簡介__ __Advanced Placement Computer Science__, ++大學程式先修檢測++是由台灣大學資訊工程系受教育部委託舉辦的測驗,目標是讓高中生具備基礎的程式設計能力,內容涵蓋 __資料結構、演算法、計算思維__,考制分為++觀念題++與++實作題++,分別評分級分 1~5 級。並且部分大學會將 APCS 成績納入招生評分或抵免學分使用。 ![image](https://hackmd.io/_uploads/SyB1-q_sye.png) <br/> ## __測驗內容__ - APCS 主要分為兩大部分:[作答系統說明](https://apcs.csie.ntnu.edu.tw/index.php/info/systemdescription/) 1.__觀念題__ ==(40 分鐘,共 25 題,每題 4 分)== :::danger ++可以跳題,有必要時可以先跳複雜或需要大量計算 !++ ::: - 內容涵蓋: a. 演算法與資料結構(排序、搜尋、堆疊、佇列、遞迴等) b. 記憶體與變數範圍 c. 基礎計算與邏輯運算 d. 控制結構(迴圈、條件判斷) e. 物件導向程式設計(Class、Method、繼承等) f. 運算效率(時間與空間複雜度分析) 2. __實作題__ ==(150 分鐘,共 4 題,每題 100 分)== :::success ++第一題永遠是最簡單的,這分數一定要拿 ~++ ::: - 內容涵蓋: a. 讀取輸入、格式化輸出 b. 陣列、字串處理 c. 遞迴與分治法 d. 基礎圖論(BFS、DFS) e. 動態規劃(DP) f. 資料結構(Set、Map、Linked List) g. 模擬(Simulation) h. many others <br/> ## __語言選擇__ 不同程式語言有不同的特性,在 APCS 或競賽解題中,建議選擇適合自己的語言能幫助你更高效地解題。 - ![img.icons8](https://hackmd.io/_uploads/SyerLX9i0.png) **C++** - 🔹 **優點** - **執行速度快**:C++ 是編譯語言,效能最佳,適合大型數據運算。 - **STL(標準模板庫)強大**:內建 `vector`, `set`, `map`, `priority_queue` 等資料結構,讓解題更方便。 - **手動記憶體管理**:靈活運用 `new`、`delete`,但需注意記憶體洩漏問題。 - 🔻 **缺點** - **語法較複雜**,學習門檻較高。 - **指標(pointers)概念較難掌握**,需額外花時間學習。 - 需手動管理記憶體,可能會導致 **記憶體洩漏**(不影響競程但需留意)。 - **用途** 1. **APCS 解題** 2. **競程比賽(IOI, LeetCode Contest)** 3. **高效能系統、嵌入式系統** 4. **Unreal Engine** 5. **各種軟體開發** :::spoiler **C++ Resource** - **[C++ Online Compiler](https://onecompiler.com/cpp)** - **[Dev C++ 官網](https://www.bloodshed.net/)** - **[MinGW64+vscode 安裝教學](https://www.youtube.com/watch?v=8QdDlNOMCgA)** ::: --- - ![img.icons8](https://hackmd.io/_uploads/Hks3Um5j0.png) **Python (v2/v3)** - 🔹 **優點** - **語法簡單直覺**,適合初學者。 - **強大內建函式庫**,可快速處理數據(`sum(list)`, `sorted(list)`)。 - **適合數據分析與 AI/機器學習**,如 NumPy, Pandas, TensorFlow。 - 🔻 **缺點** - **執行速度慢**:Python 是 **直譯語言**,相較 C++ **慢 10~100 倍**。 - **變數型別是動態類型(dynamic typing)**,容易出錯(如 `list` vs `tuple`)。 - **記憶體管理較自動化,但難以最佳化**,影響大數據運算的效能。 - **用途** 1. **不建議用於 APCS 解題** 2. **AI / 機器學習(ML)** 3. **數據分析、腳本開發** 4. **高階軟體開發** :::spoiler **Python Resource** - **[Python Online Compiler](https://www.onlinegdb.com/online_python_compiler)** - **[Google Colab 官網](https://colab.google/)** - **[Python 官網](https://www.python.org/)** - **[Jupyter Notebool](https://jupyter.org/install)** ::: --- - ![img.icons8](https://hackmd.io/_uploads/Hkk9_Q9oC.png) **Java** (較不建議) - 🔹 **優點** - **語法中等**:比 C++ 友善,不需手動管理記憶體(**自動垃圾回收 GC**)。 - **物件導向(OOP)強大**,適合大型專案開發。 - **內建類別豐富**:如 `ArrayList`, `HashMap`, `TreeSet`,處理資料較方便。 - 🔻 **缺點** - **執行速度較慢**:Java 透過 **JVM** 執行,速度比 C++ 慢 2~5 倍。 - **程式碼較冗長**,有較多樣板程式(boilerplate code)。 - **IO(輸入輸出)較慢**,可能需使用 `BufferedReader` 最佳化。 - **用途** 1. **APCS 官方推薦語言** 2. **物件導向開發** 3. **企業級應用(Spring, Android 開發)** 4. **各式軟體開發 (Mobile 為主)** :::spoiler **Java Resource** - **[Java Online Compiler](https://onecompiler.com/java)** - **[Java 官網](https://www.java.com/zh-TW/)** ::: <br/> ### _++簡易示範題目++_ << [ZeroJudge - a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) >> - 題目: - 敘述: 請寫一個程式,讀入兩個數字 a, b,並求出它們的和。 - 輸入格式: - 每組輸入共一行,內含 兩個整數 `a` 和 `b`,以空白隔開。 - 整數 `a`, `b` 的絕對值皆小於 $10^9$。 - 輸入格式: 對於每組輸入,輸出該 兩整數的和。 --- 1. C++ 解法: ```CPP[] #include <iostream> // 引入標準輸入輸出函式庫 using namespace std; int main() { int a, b; // 宣告兩個整數變數 cin >> a >> b; // 從標準輸入讀取 a 和 b cout << a + b << endl; // 輸出 a + b 的結果 return 0; } ``` --- 2. Python 解法: ```Python[] # 讀取輸入,並以空白分割成兩個數字 a, b = map(int, input().split()) print(a + b) # 計算並輸出結果 ``` --- 3. Java 寫法: ```Java[] import java.util.Scanner; // 引入 Scanner 類別 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 建立 Scanner 物件 int a = sc.nextInt(); // 讀取第一個整數 int b = sc.nextInt(); // 讀取第二個整數 System.out.println(a + b); // 輸出兩數之和 sc.close(); // 關閉 Scanner } } ``` <br/> ## 評分方式 * ![image](https://hackmd.io/_uploads/HJV6MiOiyg.png) ![bd905c8f6d3a7768fe59bb0557f40335](https://hackmd.io/_uploads/HyFsecOikl.jpg) <br/> ## Q&A - ++(Q1) **APCS 考試的難度如何?**++ APCS 難度依題目而異,一般來說: 1. 觀念題範圍廣,但大多屬於基本概念與推理題。 2. 實作題有**遞迴、排序、動態規劃、圖論**等經典演算法,難度大概跟 **LeetCode** 平台上 Easy 題還有 Medium 題的程度。 - ++(Q2) **如何準備 APCS?**++ **程式觀念題準備:** - 熟悉 **演算法概念(排序、搜尋、遞迴)** - 了解 **時間複雜度分析(Big-O 記號)** - 練習程式碼 **輸出推理題**(Python、Java、C++) **實作題準備:** - **刷題**:練習 __ZeroJudge__、__LeetCode (Easy/Medium)__ 題目 - **熟悉測資測試方式**,學會 Debug 與優化程式碼 <br/> :::spoiler Relevant - [大學程式先修檢測](https://apcs.csie.ntnu.edu.tw/) - [ZeroJudge 平台](https://zerojudge.tw/) - [LeetCOde 平台](https://leetcode.com/) :::