APCS考古題 C,Java,Python三種語言例題詳解一次公開
APCS當中,哪一個課程最能讓你奪得先機?這篇文章讓你一目了然!
第一次考 APCS 程式語言,從哪個程式語言下手才會事半功倍呢?
若一開始就選到一個好上手、測驗時又好作答的程式語言,減少準備時間和學習負擔就是當然的啦,且勢在必行!本篇文章將以三款詢問度較高的應考語言 C , Java , Python 來做解析、比較
此篇你將了解...
- APCS 檢測的規範與基礎
- APCS 觀念題範例與解題:
- APCS 實作題-哪個語言適合解題?
先來了解一下檢測內容的基礎概念,APCS 的兩大題組 【觀念題】與【實作題】:
程式設計觀念題
-題型:單選題 (含題組),以運算思維、問題解決與程式設計概念測試為主。
- 檢測與計分方式:分兩節次檢測 (單節測驗時間60分鐘), 檢測分數為合併計分,滿分100分
觀念題例題#1
1. 右側程式碼,執行時的輸出為何?
(A) 0 2 4 6 8 10
(B) 0 1 2 3 4 5 6 7 8 9 10
(C) 0 1 3 5 7 9
(D) 0 1 3 5 7 9 11
void main() {
for (int i=0; i<=10; i=i+1) {
printf ("%d ", i);
i = i + 1;
}
printf ("\n");
}
這一題主要要測驗的內容,是考驗考生是否了解 C 語言當中, for 迴圈的結構。
以 for 迴圈來說,三的區段的值分別是初始值、條件值、運算值。
在這一題當中,第一次執行的時候 i 為 0 ,所以會先印出 0。
接下來,由於第四行 i=i+1 的關係, i 會變為 1 。但是執行迴圈時,回到了 for 的第三部分,這時候,還是另外一次的 i=i+1 ,所以 i 變為 2,然後進行驗證, i <= 10
根據這樣的執行邏輯, i 每印出一個就會 +2 一次,直到 i 超過 10 之後跳出迴圈。
觀念題例題#2
2. 若以 f(22)呼叫右側 f()函式,
總共會印出多少數字?
(A) 26
(B) 22
(C) 11
(D) 15
void f(int n) {
printf ("%d\n", n);
while (n != 1) {
if ((n%2)==1) {
n = 3*n + 1;
}
else {
n = n / 2;
}
printf ("%d\n", n);
}
}
本題所考內容,是對於 while 與 if 的熟悉度。
傳入 22 進 function 之後,會先印出 22。
接下來進入 while 迴圈,如果 n 不是 1 ,那麼這個迴圈會一直執行。
while 當中, 如果 n 是奇數,則 n 會變成 3xn+1 ,如果 n 是偶數,那 n 會變成原來的一半。
所以整個流程會是「22➔11➔34➔17➔52➔26➔13➔40➔20➔10➔5➔16➔8➔4➔2➔1」。
程式設計實作題
- 題型:共計 4 個題組,以撰寫完整程式或副程式計分。
- 檢測與計分方式:為單節次檢測 (測驗時間 140 分鐘),滿分 400 分
實作題例題
【問題描述】
一次考試中,於所有及格學生中獲取最低分數者最為幸運,反之,於所有不及格同學中,獲取最高分數者,可以說是最為不幸,而此二種分數,可以視為成績指標。請你設計一支程式,讀入全班成績(人數不固定),請對所有分數進行排序,並分別找出不及格中最高分數,以及及格中最低分數。當找不到最低及格分數,表示對於本次考試而言,這是一個不幸之班級,此時請你印出:「worst case」;反之,當找不到最高不及格分數時,請你印出「best case」。註:假設及格分數為 60,每筆測資皆為 0~100 間整數,且筆數未定。
【輸入格式】
第一行輸入學生人數,第二行為各學生分數(0~100 間),分數與分數之間以一個空白間格。每一筆測資的學生人數為 1~20 的整數。
【輸出格式】
每筆測資輸出三行。
第一行由小而大印出所有成績,兩數字之間以一個空白間格,最後一個數字後無空白;
第二行印出最高不及格分數,如果全數及格時,於此行印出 best case;
第三行印出最低及格分數,當全數不及格時,於此行印出 worst case。
【範例一:輸入】
10
0 11 22 33 55 66 77 99 88 44
【範例一:正確輸出】
0 11 22 33 44 55 66 77 88 99
55
66
(說明)不及格分數最高為 55,及格分數最低為 66。
【範例二:輸入】
1
13
【範例二:正確輸出】
13
13 worst case
(說明)由於找不到最低及格分,因此第三行須印出「worst case」。
【範例三:輸入】
2
73 65
【範例三:正確輸出】
65 73
best case
65
(說明)由於找不到不及格分,因此第二行須印出「best case」。
【評分說明】
輸入包含若干筆測試資料,每一筆測試資料的執行時間限制(time limit)均為 2 秒, 依正確通過測資筆數給分。
針對實作題,我們分別使用 C、Python 與 Java 來解題,語法如下:
實作題解法#1 - 使用 C 語言(最費時):
#include < stdio.h >
#include < stdbool.h >
int len;
int *scores;
main()
{
int i, j, tmp, highestUnpass, lowestPass;
bool best=false, worst=false;
scanf("%d", &len);
scores = (int *)malloc(sizeof(int) * len);
for (i=0;i < len;i++)
scanf("%d", &scores[i]);
for (i=0;i < len-1;i++)
for(j=i+1;j < len;j++)
if (scores[i] > scores[j])
{
tmp = scores[i];
scores[i] = scores[j];
scores[j] = tmp;
}
for (i=0;i < len;i++)
{
printf("%d", scores[i]);
if (i < len-1)
printf(" ");
}
printf("\n");
if (scores[len-1] < 60)
{
worst = true;
highestUnpass = scores[len-1];
}
if (scores[0] >= 60)
{
best = true;
lowestPass = scores[0];
}
if (worst == false && best == false)
for (i=0;i < len;i++)
if (scores[i] >= 60)
{
highestUnpass = scores[i-1];
lowestPass = scores[i];
break;
}
if (best)
printf("best case\n");
else
printf("%d\n",highestUnpass);
if (worst)
printf("worst case\n");
else
printf("%d\n",lowestPass);
}
實作題解法#2 - 使用 Python 語言(最省時):
nums = int(input())
strScores = input()
scores = strScores.split(" ")
for i in range(len(scores)):
scores[i] = int(scores[i])
scores.sort()
for i in range(len(scores)):
print(scores[i], end="")
if i < len(scores)-1:
print(" ", end="")
print()
best = False
worst = False
if scores[len(scores)-1] < 60:
worst = True
highestUnpass = scores[len(scores)-1]
if scores[0] >= 60:
best = True
lowestPass = scores[0]
if best==False and worst == False:
for i in range(len(scores)):
if scores[i] > 60:
lowestPass = scores[i]
highestUnpass = scores[i-1]
break
if best:
print("best case")
else:
print(highestUnpass)
if worst:
print("worst case")
else:
print(lowestPass)
實作題解法#3 - 使用 Java 語言(所花時間適中):
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class T01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String nouse = scanner.nextLine();
String data = scanner.nextLine();
String[] strScores = data.split(" ");
int len = strScores.length;
int [] intScores = new int[len];
int i;
for (i=0;i < len;i++)
{
intScores[i] = Integer.parseInt(strScores[i]);
}
Arrays.sort(intScores);
boolean best=false, worst=false;
int highestUnpass = 0, lowestPass = 0;
if (intScores[0] >= 60)
{
best = true;
lowestPass = intScores[0];
}
if (intScores[intScores.length-1] < 60)
{
worst = true;
highestUnpass = intScores[intScores.length-1];
}
for (i=0;i < len;i++)
{
System.out.print(intScores[i]);
if (i < len-1)
System.out.print(" ");
}
System.out.println();
if (best == false && worst == false)
{
for (i=0;i < len;i++)
{
if (intScores[i] > 60)
{
highestUnpass = intScores[i];
lowestPass = intScores[i-1];
break;
}
}
}
if (best)
{
System.out.println("best case");
}
else
{
System.out.println(highestUnpass);
}
if (worst)
{
System.out.println("worst case");
}
else
{
System.out.println(lowestPass);
}
}
}
總結一下綜合比較的部分:
- 學習上手速度:Python > Java > C
(但 Python 與其他兩者程式語言差異較大,若一開始就選擇從 Python 語言上手 ,還是必須多花不少時間理解 C 語言,才能解答觀念題。) - 實際作答速度:Python > Java > C
(Python 與 Java 都具備函式庫,在實作題作答時會比 C 語言快速。)
APCS 短期衝刺,從 Java 著手 CP 值最高!
以學習效果與所花時間的比值來說,學習 Java 的 CP 值較高。以下說明為什麼:
雖然 Python 堪稱「程式語言的瑞士刀」,其語法直觀、編寫簡潔快速,比起 C , Java 更容易上手,但由於觀念題是由 C 語言出題,若學 Python 再接觸 C ,對於有時間與其他課業壓力的考生來說,是相當辛苦、費時的。
而 Java 本身是由 C / C++為概念改良而成的語言,在設計之初,考量重點之一便是簡潔,因此學習與 C 語言語法架構相似的 Java ,讓考生有操作基礎後再學習 C 語言,更能在檢測學習之路,更加如魚得水。
綜合以上觀點,投資在能兼顧「理論題」與「實務題」的 Java,才是事半功倍、投報率最高的首選!
最後貼心提醒:109 年第 2 次 APCS 檢測暫訂 2020 年 7 月 4 日!
各位考生可以開始逐步準備 APCS 檢測囉!