自主學習成果-APCS 之自我培訓 201 班 14 號陳依婕 一、APCS 介紹
APCS 為 Advanced Placement Computer Science 的英文縮寫,是指「大 學程式設計先修檢測」。其檢測模式乃參考美國大學先修課程(Advanced Placement,AP),與各大學合作命題,並確定檢定用題目經過信效度考驗,
以確保檢定結果之公信力。
二、學習動機
未來升學想選擇資訊工程系或相關工程學系,由於 APCS 對於程式設計 須具備一定的標準,因此我想參加 2021 年的 6 月 5 日的 APCS,透過這次經 驗來了解自己程式設計的能力與待加強的地方,若自己的檢測結果達到大學 要求的檢定級分,會採用此次級分來參加大學特殊選才,若未達到自己預期,
則會繼續參加 2021 年 10 月的檢測。
三、培訓方法
1. 在 APCS 官網上了解命題內容領域
2. 在 APCS 官網下載歷屆試題(程式設計觀念題、實作題) 3. 將計算過程寫下並熟知程式碼的基礎概念
4. 複習實作題的運算概念 5. 培養寫程式的習慣
四、計算過程
(以下圖片為民國 106 年 10 月的歷屆試題解題過程) 觀念題:
實作題:
(以下為 106 年 10 月第 1 題-邏輯運算子)
#include <iostream>
using namespace std;
int main() {
int a = 0, b = 0, c = 0, flag = 1;
cin >> a >> b >> c;
if(a != 0) {a = 1;}
if(b != 0) {b = 1;}
if((a && b) == c)
{cout << "AND" << endl;
flag = 0;}
if((a || b) == c)
{cout << "OR" << endl;
flag = 0;}
if((a != b) == c)
{cout << "XOR" << endl;
flag = 0;}
if(flag == 1)
{cout << "IMPOSSIBLE";}
return 0;
}
(以下為 106 年 10 月第 2 題-交錯字串)
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main() {
string s;
int k, cU, cL, len, flen;
bool bU;
while(cin >> k){
cin >> s;
int length = s.length();
cU = 0;
cL = 0;
len = 0;
flen = 0;
if (isupper(s[0])) { bU = true;
cU++;
if (cU == k){
len = k;
flen = max(flen, len);
} }else{
bU = false;
cL++;
if (cL == k){
len = k;
flen = max(flen, len);
} }
for(int i = 1;i < length;i++){
if (isupper(s[i]) && bU) { cU++;
cL=0;
if (cU == k){
len += k;
flen = max(flen,len);
}
if (cU > k){
len = k;
}
} else if (isupper(s[i]) && (!bU)) { if (cL < k){
len = 0;
}
cU =1 ; cL = 0;
if (cU == k){
len += k;
flen = max(flen,len);
}
bU = true;
} else if (islower(s[i]) && (!bU)) { cL++;
cU = 0;
if (cL == k){
len += k;
flen = max(flen,len);
}
if (cL > k){
len = k;
}
}else if (islower(s[i]) && (bU)) { if (cU < k){
len = 0;
}
cL = 1;
cU = 0;
if (cL == k){
len += k;
flen = max(flen,len);
}
bU = false;
} }
cout << flen << endl;
} }
(以下為 106 年 10 月第 3 題-樹狀圖分析)
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define MAX 100001 using namespace std;
int p[MAX];
int d[MAX];
int num[MAX];
deque<int> t;
int main() {
int n,k,c;
long long int sum;
while (scanf("%d",&n) != EOF) { sum = 0;
memset(d,-1,sizeof(d));
memset(p,0,sizeof(p));
memset(num,0,sizeof(num));
for (int i = 1; i<=n; i++) { cin >> k;
if (k == 0){
t.push_back(i);
d[i]=0;
}else{
num[i]=k;
for(int j=0;j<k;j++){
cin >> c;
p[c] = i;
} } }
int node;
while(!t.empty()){
node = t.front();
t.pop_front();
d[p[node]]=max(d[p[node]],d[node]+1);
num[p[node]]--;
if (num[p[node]] == 0){
t.push_back(p[node]);
} }
for (int i = 1; i<=n; i++) { sum += d[i];
}
cout << node << endl;
cout << sum << endl;
} }
(以下為 106 年 10 月第 4 題-物品堆疊)
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct _box{
int w;
int f;
} Box;
bool cmp(Box a,Box b){
return a.w*b.f < b.w*a.f;
}
Box b[100001];
int main() {
int n;
long long int result,sum;
while (cin >> n){
result = 0;
sum = 0;
for(int i = 0; i < n; i++){
cin >> b[i].w;
}
for(int i = 0; i < n; i++){
cin >> b[i].f;
}
sort(b,b+n,cmp);
for(int i = 0; i < n-1; i++){
sum += b[i].w;
result += sum * b[i + 1].f;
}
cout << result << endl;
} }
五、自主學習心得
程式設計從小就是我的興趣之一,在這塊領域,我靠著這份熱情學得比 同學還多,更透過了自主學習的時間,將這個技能練熟,雖然資訊老師曾讓
我參加國際運算思維挑戰賽,但我覺得這不足以讓我把自己在程式設計的天 賦及專長發揮的淋漓盡致,我極力地想知道自己在這方面還有什麼地方需要 加強與學習的,我想證明在沒有補習的環境下,我也能靠著自己學的很好,
我利用高一所學的 C++,以及高一下學期的自主學習中所學的 C 語言,這之 前的自主學習計畫都是為了 APCS 所規劃的。
時間離考試的日子越來越近,壓力也隨之增加,正當我忙完學校及社團 的活動後,遙控小車的微課程也告一段落了,想趁這一個月的時間好好為 APCS 做充足的準備,只要一有時間,我就會打開題庫,靜靜地讀著歷屆試 題,儘管身邊沒有手和筆寫下觀念題的計算,也會用自己的腦袋把題目中的 程式碼「執行」一遍又一遍,直到自己完全理解並解出答案後,才甘願繼續 寫下一題,剛開始會想得很久很慢,有時候還會出現「當機」的狀況,整個 人愣在椅子上,滿腦子程式碼只為了想出解題的方法。
一切進度都在計畫之中,直到離 6/5 剩下半個月時,悲劇發生了,因為 疫情,疾管署於 5/18 宣布停課,隨後 APCS 的主辦單位宣布 6/5 的檢測取消,
而非延後,俗話說:「There is always a plan B.」,對於這巨大的變化我 不但沒有慌亂,還藉由這個契機讓備用方案派上用場,就是參加今年 10 月 的 APCS,我還有更多的時間可以準備及練習,透過暑假來練習程式設計。
做完歷屆試題後,我發現這個檢測對我來說是有挑戰性的,那些題目我 答得出來,但對於時間的掌握有待加強,我需要練習更多的題目來讓我能運 用得更巧妙,讓程式設計成為生活的一部份,雖有挑戰性,但我接受挑戰。