APCS 經驗談
=====
## 我是誰
我接觸程式設計的緣由比較特別,雖然從國小就發現對電腦有興趣,但都不知道有什麼相關資源,也沒特別動力去學習
國中在巴哈的 Minecraft 公會遇到一群 [SITCON 學生計算機年會](https://sitcon.org) 的網友,就趁著那個機會加入他們,開始學習
高中除了很多人參加的演算法競賽外,我也因為社群朋友的邀請參加了資訊安全類型的競賽
雖然跟大學生比起來我沒有特別厲害,但是靠著年齡優勢,出去許多比賽都被特別照顧
今年個人申請靠著 APCS 組通過第一階段篩選
也因為這些年累積的經驗,順利在面試階段通過 28 取 3 的競爭錄取交大資工
## 什麼是 APCS
APCS 為 **A**dvanced **P**lacement **C**omputer **S**cience 的英文縮寫,是指「大學程式設計先修檢測」,現在都還是免費報名。
分為**觀念題**及**實作題**,這兩部分都是中文命題,最高五級分
**觀念題**是四選一的單選題,除了兩三題是計算機概論外,其他都是用 C 語言寫的
**程式設計實作題**以撰寫完整程式解決問題為主,可自行選擇用 C, C++, Java, Python 撰寫程式
## 報考動機
### 跟風考考看
我上高中才開始學 C 語言,第一次報名檢測是在高一下的時候,當時雖然觀念題有滿級分,但實作題只拿到三級
不過輸出成績時官方提供選擇哪幾場的功能,就算考差也不用擔心會對後續造成影響
### 放到備審資料作為能力證明
除了少數學校上課會教外,多數高中生可能連程式碼都沒看過,願意學習程式代表高中就確定對資訊的興趣,這種自學的能力也是大學教授們會喜歡的
### 透過 APCS 組彌補學科劣勢
今年交大資工乙組第一階段篩選的門檻除了數學滿級分外,英文 + 自然最多只能掉 2 級分
但因為我有 APCS 滿級分的優勢,以學測 48 級分就通過了一階篩選,不過相對的就是二階面試競爭很激烈
這次交大 APCS 組共有 28 人通過一階篩選,但預計錄取人數只開 3 個名額,而且對手們都會寫程式,需要拿出更多相關成績才有機會錄取
### 抵免大學學分
目前就師大自己承認學分,未來很可能有其他學校跟進
## APCS 題型說明
官方有公開 [歷屆試題](https://apcs.csie.ntnu.edu.tw/index.php/questionstypes/previousexam/) 可供參考,這邊舉幾題簡單解釋
### 基礎觀念理解(basic concepts understanding)
基礎觀念理解會有像是計算機概論的題目
![](https://i.imgur.com/wKR28TL.png)
#### 運算符號的意義
`|` VERTICAL LINE 直線(豎槓) -> OR 或
`!` EXCLAMATION MARK 驚嘆號 -> NOT 不
有點類似高一下的迪摩根定律
OR 是取聯集
NOT 是取補集
### 程式除錯(code debugging)
程式除錯也是蠻重要的一環,我也看過朋友犯下類似這樣的錯誤
![](https://i.imgur.com/j0uSsSA.png)
這個例子中 i 會從 0 開始,每次 +5,一路到 95, 100,共執行了 21 次
(A) 一樣是從 0 開始,但改成每次 +1,一路到 19 為止,正確的印出了 20 次 Hi
(B) 將起始值從 0 改為 5
(C\) 最後一個數字從 100 變成了 95
(D) 頭尾都少一了,從 5 到 95 只有 19 次
### 程式運行追蹤(code tracing)
像這種題目就比較複雜了,通常要先會寫程式才看得懂
![](https://i.imgur.com/E1EJuqL.png)
要你用大腦判斷程式執行的結果,但像這題範圍到 100,就要找出規律
從 G(100) 函式可以看出 for 迴圈的 i 從 0, 1, 2, 3 一直到 99,因此會從 K(0), K(1) 開始呼叫,一直到 K(99) 為止,其中每次進入 K(b) 時會先將全域變數 n 增加 1
那句 if 中的 % 百分比符號在程式語言中代表除法的取餘數,假如 b 除 4 的餘數不為 0,就執行 K(b+1)
### 程式填空(code completion)
有些題目會提供半完成的程式碼,問你要選哪段才會出現正確結果
![](https://i.imgur.com/fA9akkp.png)
可以將四個式子一一帶入
(A) 光是 14 * 13 就超過 100 了,顯然不可能
(B) 14 + 11 + 8 + 5 + 2 的確是 40
(C\) 這種可以先列出來 F(14) = 14 - F(12)、F(12) = 12 - F(10),等列到 F(4) = 4 - F(2) = 2 後,開始一層一層往上推
F(4) = 2, F(6) = 4, F(8) = 4, F(10) = 6, F(12) = 6, F(14) = 8, Ans = 8
(D) 這個式子有三種解讀方式
1. 第一種是編譯器邏輯,這裡的 3n 的 n 不是直覺上的三倍,會被編譯器視為 3 的後綴,又因為沒有 n 這種後綴,會造成編譯失敗無法執行
2. 第二種是直覺上來看,由於 3\*14 + 1 = 43,3\*43 + 1 = 130,再來變成 391, 1174, 3523 等數字,永遠不會有答案
3. 第三種是程式實際的行為,由於電腦的空間有限,所以 int 這種資料型態只能儲存範圍大約在 ±2,147,483,647 之間的整數,到了 1,872,532,363 後,乘三會變成 1,322,629,794,反而減少了,這是 Overflow 整數溢位捨棄高位數的結果;下一個變成 -327,077,913,於是小於 4 就回傳 F(14) = -327,077,913
### 實作題:三角形辨別
寫這種題目與其說是考程式語言,不如說是在考邏輯能力
![](https://i.imgur.com/FykToMy.png)
像這題用到的「兩邊之和大於第三邊」跟「畢氏定理」是國二的東西
但 APCS 是檢定不是競賽,連判斷方式都給你了,只要用電腦的語言寫出來就好
![](https://i.imgur.com/7fj5bIX.png)
每題會給兩三筆測試資料,以這題來說應該不用我解釋各位也看得懂
但不是通過範例測資就好,還要考慮到有沒有邊界狀況,像是假如兩個數字乘起來太大,就可能造成錯誤
![](https://i.imgur.com/Ojs6uBb.png)
這題太簡單了,沒有分測資範圍
但多數題目會有部分給分的狀況,像這是另一題的截圖
## 如何準備 APCS 檢測
再來是一些推薦給學弟妹們的準備方式
### 台大資訊之芽課程
目前從身邊朋友打聽到的消息中,資訊之芽課程可以算是裡面最紮實的一個
可惜今年度課程已經在進行中了,無法報名參加,但 [教學講義](https://tw-csie-sprout.github.io/c2019/) 是公開在網路上的,很適合新手拿來學習
有興趣想參加的話,今年十二月記得鎖定他們 [粉專](https://fb.com/ntucsiesprout/),明年的這時候就有做不完的回家功課了
### 台中女中線上解題系統
通常寫演算法程式除了自己測試外,網路上有許多解題平台,除了提供大量題目可供練習,也會幫你驗證答案是否正確
中文的有全台最大的 [ZeroJudge](https://zerojudge.tw/)、建中 [TIOJ](https://tioj.ck.tp.edu.tw/)、中女中 [Green Judge](http://www.tcgs.tc.edu.tw:1218/) 等
英文有每週舉辦兩三次競賽的 [CodeForces](https://codeforces.com/)、全球權威的 [UVa Judge](https://uva.onlinejudge.org/) 以及日本的 [AtCoder](https://atcoder.jp/) 等許多平台
[Green Judge](http://www.tcgs.tc.edu.tw:1218/) 這套是中女中上課教學用的解題系統,題目從最基礎的 Hello World、加減乘除、字串處理開始,依照難度循序漸進,適合想考 APCS 的初學者練習用
### 板中校內授課講義
每年資訊奧林匹亞會選出全台前 12 強的高中生們,進入選手培訓營,今年板中就包下兩個名額
板中內部除了學生自主發起的 [培訓課程](https://ic.sean.cat/) 外
每週二晚上開立 AP 大學先修課程,真的可以抵免學分
### 演算法筆記
解釋的太過詳細了,可當字典參考
我自己在 Google 搜尋演算法時都會加上「演算法筆記」這個關鍵字,裡面內容品質大多還蠻不錯的
## 相關社群:SITCON 學生計算機年會
我國中就是從 SITCON 這個社群接觸到寫程式的學習資源
![](https://sitcon.org/branding/withname.png)
### 一個於網路發起,鼓勵自發學習、切磋成長的學生社群
這是一個學生自發組成的研討會,秉持著以學生為主軸的核心價值,藉以凝聚與傳遞學生的力量。
希望藉由提供一個經驗交流與資訊技術實務分享的平台,使已有成就者能夠傳承己身經驗,並讓初入茅廬者得以對資訊科學有更深入的瞭解;進而達到「學以致用、教學相長」的目標。
### 每年三月在中研院舉辦 1,000 人規模的年會
今年三月我也受到 SITCON 邀請,站在中研院的演講廳 [向會眾們分享](https://sitcon.org/2019/agenda/71d881df-22a7-48b9-b6e5-3996e6ff02d2/)
### 平時可於社團/群組線上交流
平常在 [Telegram 群組](https://t.me/SITCONgeneral/) 也是閒聊居多,遇到任何問題只要表現出誠意,在裡面可以輕鬆的提問
## 相關社群:COSCUP 開源人年會
![](https://api2018.coscup.org/assets/coscup-1NLdnQEZeeTTDhFaqBbiFnt5g-cf7LFLX.png)
+ 台灣自由軟體運動重要的推動者之一
+ 除了邀請國際的重量級演講者之外,
台灣本土的自由軟體推動者也經常在此發表演說。
+ 每年八月在台科大舉辦 1,500 人規模的年會
今年搶票也快開始了,記得關注 [粉絲專頁](https://fb.com/coscup) 最新訊息
## 放榜結果
累積了足夠的經驗,在面試過程中也會比較順利
![](https://i.imgur.com/cxikiIE.png)
這次我除了交大正取外,政大、淡江也都拿到了 正取1
只有成大因為學測四科就佔了 30%,被擠下去到 備3 了
## 其他資源連結
+ 校內分享投影片:https://bit.ly/apcs-cssh
+ 備審資料參考:https://img.sean.taipei/2019/05/nctu.pdf
+ 演講議程錄影:https://youtu.be/9ZF_qOAychw