大 學 程 式 能 力 檢 定 (CPE) 考 生 使 用 手 冊 2016 年 5 月 24 日 這 份 手 冊 提 供 給 參 加 CPE 檢 定 考 試 的 考 生 內 容 包 含 考 試 環 境 的 使 用, 以 及 解 題 時 所 使 用 I/O 的 基 本 知 識 1. 如 欲 報 名 參 加 CPE 考 試, 請 先 於 CPE 網 站 完 成 帳 號 註 冊, 然 後 再 報 名 該 次 考 試 若 已 有 帳 號, 可 免 註 冊, 但 仍 需 報 名, 才 能 參 加 考 試 報 名 時, 請 慎 選 考 場, 並 於 指 定 時 間 前 往 報 到 考 試 2. 自 2013/10/1 起 的 CPE 考 試, 採 用 新 的 評 判 系 統 瘋 狂 程 設 : http://coding-frenzy.arping.me/ 考 生 可 至 瘋 狂 程 設 另 外 註 冊 後, 自 行 上 網 練 習 ( 注 意 :CPE 帳 號 與 瘋 狂 程 設 帳 號 不 同, 參 加 CPE 考 試 須 使 用 CPE 帳 號, 在 瘋 狂 程 設 練 習 須 使 用 瘋 狂 程 設 帳 號 ) 3. CPE 網 站 http://cpe.cse.nsysu.edu.tw/ 內, 環 境 與 教 材 有 更 詳 細 資 料 1
1. CPE 考 試 環 境 1.11 瘋 狂 程 設 : 系 統 註 冊 與 登 入 請 點 選 同 意 以 下 各 授 權 規 定 進 入 瘋 狂 程 設 系 統 的 登 入 畫 面, 如 圖 1.1.1 ( 圖 1.1.1) 進 入 後, 請 填 寫 身 分 證 與 准 考 碼 ( 准 考 碼 於 考 前 由 監 考 人 員 發 放 ) 完 成 登 入 動 作, 如 圖 1.1.2 ( 圖 1.1.2) 2
完 成 登 入 後 的 畫 面 如 圖 1.1.3, 考 生 可 看 到 考 生 功 能, 現 在 時 間, 以 及 考 試 題 目 列 表 ( 圖 1.1.3) 1.2 考 生 功 能 包 括 問 題 提 問, 觀 看 考 官 問 題 回 應 成 績 欄 英 漢 字 典 和 一 些 額 外 的 工 具, 如 圖 1.2.1 ( 圖 1.2.1) 1.2. 1 電 子 發 問 3
點 擊 後 出 現 一 張 發 問 單, 請 填 寫 欲 詢 問 的 問 題, 與 相 關 資 訊 ( 題 號 問 題 描 述 ), 如 圖 1.2.2 問 題 送 出 後, 只 有 被 監 考 官 回 答 的 問 題 才 會 顯 示 出 來, 如 圖 1.2.3 中 文 輸 入 法 : 在 考 場 中, 應 該 已 經 設 定 快 捷 鍵 左 ALT+SHIFT+1 左 ALT+SHIFT+2 左 ALT+SHIFT+3 來 切 換 輸 入 法 中 文 輸 入 法 : 如 果 未 設 定, 則 需 透 過 額 外 的 視 窗 輸 入, 按 住 CTRL 鍵 與 滑 鼠 左 擊 欲 輸 入 的 欄 位, 在 產 生 的 視 窗 中 利 用 新 注 音 輸 入 考 場 上 ( 圖 1.2.2) ( 圖 1.2.3) 1.2. 2 練 習 成 績 展 示 本 次 CPE 練 習 的 考 生 即 時 成 績 ( 解 題 數 所 花 時 間 ), 範 圍 包 含 全 部 考 場 的 考 生 此 成 績 每 五 分 鐘 更 新 一 次 4
1.2. 3 聯 賽 成 績 展 示 本 次 CPE 考 試 的 考 生 即 時 成 績 ( 解 題 數 所 花 時 間 ), 如 圖 1.2.4, 範 圍 包 括 全 部 考 場 的 考 生 此 成 績 每 五 分 鐘 更 新 一 次 ( 圖 1.2..4) 1.2. 4 教 室 成 績 僅 包 括 應 考 生 當 前 所 在 的 考 場 的 即 時 成 績, 此 成 績 隨 時 更 新 1.2. 5 Java 參 考 資 料 可 查 詢 Java 語 法 資 料 型 態 類 別 成 員 函 式 等, 如 圖 1.2.5 資 料 來 源 : http://docs.oracle.com/javase/7/docs/api/ 5
( 圖 1.2.5) 1.2. 6 C++ 參 考 資 料 可 查 詢 C+ ++ 語 法 資 料 型 態 類 別 成 員 函 式 等, 如 圖 1.2.6 資 料 來 源 : http://en.cppreference.com/w/ ( 圖 1.2.6) 1.2. 7 英 漢 字 典 可 以 查 詢 英 文 單 字 的 意 義, 但 是 題 目 中 的 英 文 單 字 無 法 直 接 複 製 貼 上 1.2. 8 剩 餘 時 間 考 試 的 剩 餘 時 間 會 顯 示 在 視 窗 的 右 上 角, 如 圖 1.2.7 ( 圖 1.2.7) 1.2. 9 結 束 評 量 結 束 本 次 考 試 如 果 不 小 心 按 到, 請 跟 監 考 官 反 映 6
1.3 考 試 題 目 如 圖 1.3.1, 點 選 正 式 考 題 下 方 的 解 題, 即 可 進 入 解 題 視 窗 若 下 方 沒 有 顯 示 考 題, 請 重 新 刷 新 頁 面 ( 圖 1.3.1) 1.4 考 題 介 面 ( 圖 1.4.1) (1) (2) (3) (4) 進 入 題 目 後, 視 窗 如 圖 1.4.1, 依 照 視 窗 各 方 匡 的 編 號, 各 部 分 功 能 如 下 : 題 目 的 介 紹 與 描 述 撰 寫 程 式 的 視 窗 ( 請 在 此 撰 寫 程 式 ) 程 式 輸 出 與 使 用 測 資 的 正 確 輸 出 顯 示 考 生 的 身 分 證 姓 名 准 考 碼 7
(5) 題 目 資 料 語 法 規 範 語 量 規 範 語 意 檢 測 語 法 規 範 會 顯 示 編 譯 錯 誤 的 資 訊, 語 量 規 範 是 顯 示 程 式 碼 中 出 現 不 允 許 的 語 法, 語 意 檢 測 則 需 要 輸 入 測 試 資 料 (6) 根 據 語 意 檢 測 的 輸 入 資 料 以 及 考 生 的 程 式 碼 所 產 生 的 輸 出 資 料, 左 半 邊 為 考 生 程 式 碼 的 輸 出, 右 半 邊 為 題 目 正 確 的 輸 出 (7) 功 能 選 項, 與 剩 餘 時 間 以 下 介 紹 功 能 選 項 的 各 項 功 能 1.4..1 正 式 評 判 這 是 考 試 的 正 式 評 判, 評 判 的 結 果 將 列 入 考 試 的 正 式 紀 錄, 也 會 顯 示 於 所 有 考 生 的 成 績 表 上 如 果 評 判 的 結 果 是 不 通 過, 將 會 依 照 計 分 規 則, 進 行 罰 扣 分 考 生 應 於 進 行 各 項 測 試 後, 再 執 行 正 式 評 判 點 選 正 式 評 判 後, 會 出 現 確 認 視 窗 在 確 認 視 窗 中 點 選 是 (Y), 則 可 以 正 式 評 判 考 生 的 程 式, 如 圖 1.4.2 ( 圖 1.4.2) 考 生 進 行 評 判 後, 如 果 考 生 通 過 此 題 的 暗 中 測 試 資 料 ( 不 公 開 ), 則 系 統 會 顯 示 通 過, 反 之 顯 示 不 通 過, 如 圖 1.4.3 ( 圖 1.4.3) 1.4..2 檔 案 如 圖 1.4.4, 這 選 項 的 功 能 有 提 檔 續 答 封 卷 存 檔 另 存 新 檔 8
( 圖 1.4.4) 另 存 新 檔 : 可 以 將 目 前 程 式 碼 依 照 考 生 選 擇 的 檔 名 存 檔, 如 圖 1.4.5 ( 圖 1.4.5) 提 檔 續 答 : 將 已 經 儲 存 的 檔 案 ( 例 如,CPE_TEST) 開 啟 後 繼 續 編 寫, 如 圖 1.4..6 ( 圖 1.4.6) 封 卷 存 檔 : 將 目 前 的 程 式 碼 儲 存, 存 檔 方 式 依 照 時 間 先 後 儲 存, 檔 名 則 由 系 統 隨 機 產 生 之 後, 亦 可 以 在 提 檔 續 答 中 選 擇 所 儲 存 的 檔 案, 如 圖 1.4.7 9
( 圖 1.4.7) 1.4..3 編 輯 此 功 能 可 以 將 程 式 碼 字 形 放 大 縮 小, 也 可 以 在 貼 上 範 例 程 式 碼 供 考 生 參 考 貼 上 範 例 會 以 註 解 的 形 式 產 生 在 編 輯 視 窗 的 最 下 面, 如 圖 1.4.8 ( 圖 1.4.8) 1.4..4 視 窗 10
考 生 可 以 依 照 喜 好 將 目 前 不 需 要 資 訊 視 窗 關 閉, 如 題 目 建 置 測 試 正 確 輸 出 你 的 輸 出 這 四 種 視 窗 如 要 恢 復 相 關 視 窗, 再 按 一 下 即 可 恢 復 視 窗, 如 圖 1.4. 9 ( 圖 1.4.9) 1.4..5 編 譯 器 考 生 在 此 選 項 可 以 選 擇 自 己 熟 悉 的 語 言 編 譯 器 (compiler) 來 編 譯 程 式 碼, 但 前 提 必 須 是 題 目 所 允 許 使 用 的 語 言, 如 圖 1.4.10 ( 圖 1.4.10) 11
1.4..6 編 譯 測 試 ( 圖 1.4.11) 編 譯 測 試 為 檢 驗 考 生 程 式 碼 之 各 功 能, 如 圖 1.4.11 所 示, 功 能 介 紹 如 下 : (1) 題 目 預 設 測 試 資 料 : 考 生 可 使 用 此 功 能 來 執 行 並 驗 證 程 式 碼, 測 試 資 料 是 由 系 統 產 生 ( 難 度 較 低 ) 此 項 測 試 不 列 入 考 試 成 績 紀 錄 (2) 使 用 自 訂 測 試 資 料 : 考 生 可 使 用 此 功 能 來 執 行 並 驗 證 程 式 碼, 測 試 資 料 是 由 考 生 自 行 輸 入, 如 圖 1.4. 12 此 項 測 試 不 列 入 考 試 成 績 紀 錄 ( 圖 1.4. 12) (3) 人 工 公 開 測 試 資 料 : 考 生 可 使 用 此 功 能 來 執 行 並 驗 證 程 式 碼, 測 試 資 料 是 由 選 命 題 老 師 根 據 題 意 所 擬 定 的 測 試 資 料, 其 困 難 度 與 系 統 內 的 暗 中 測 試 資 料 大 約 相 同 此 項 測 試 不 列 入 考 試 成 績 紀 錄 建 議 考 生 在 進 行 正 式 評 判 之 前, 先 通 過 此 人 工 公 開 測 試 資 料 之 測 試 1.4..7 換 題 續 答 考 生 若 要 回 到 最 初 視 窗 選 擇 題 目, 可 以 將 所 有 題 目 視 窗 縮 小 或 關 閉 即 可 回 到 12
選 擇 題 目 視 窗, 如 圖 1.4.13 ( 圖 1.4.13) 1.5 測 試 後 的 訊 息 考 生 進 行 測 試 或 評 判, 系 統 將 顯 示 相 關 訊 息, 如 下 表 : COMPILER-ERRORR 程 式 碼 未 通 過 編 譯 ( 點 入 連 結 可 以 查 閱 編 譯 器 所 產 生 的 錯 誤 訊 息 ) CORRECT 程 式 已 經 正 確, 並 通 過 測 試 NO-OUTPUT 程 式 沒 有 輸 出 任 何 資 料 PENDING 送 出 的 程 式 碼 仍 在 處 理 中 PRESENTATION-ERROR 輸 出 的 結 果 正 確, 但 格 式 錯 誤, 例 如 未 依 規 定 空 格 或 換 行 ( 多 空 格 或 少 空 格, 多 換 行 或 少 換 行 ) RUN-ERROR 無 法 順 利 將 程 式 執 行 完 畢, 亦 即 程 式 執 行 過 程 發 生 錯 誤, 例 如 記 憶 體 存 取 錯 誤 TIMELIMIT 程 式 執 行 所 花 費 的 時 間 超 過 題 目 限 制 程 式 可 能 落 入 無 窮 迴 圈, 或 是 必 須 改 進 解 題 方 法 WRONG-ANSWER 輸 出 的 結 果 錯 誤 ( 若 輸 出 的 格 式 產 生 過 大 錯 誤, 也 可 能 造 成 此 結 果 ) 13
2. C/C++ 基 本 輸 入 與 輸 出 CPE 考 試 的 程 式 設 計, 所 有 輸 入 與 輸 出 均 採 取 標 準 輸 入 (stdin) 與 標 準 輸 出 (stdout), 不 可 使 用 檔 案 讀 寫 撰 寫 程 式 時, 於 C 語 言, 可 使 用 如 scanf 與 printf 函 式 ; 於 C++, 可 使 用 如 cin 與 cout 物 件 輸 入 與 輸 出 資 料 全 為 純 文 字 資 料, 必 須 完 全 依 照 題 目 的 輸 入 與 輸 出 格 式 撰 寫 程 式 而 且 題 目 的 隱 藏 測 試 資 料 之 輸 入 資 料, 保 證 依 照 題 目 所 描 述 的 格 式, 因 此 考 生 不 必 檢 查 輸 入 資 料 的 正 確 性 如 果 考 生 不 知 如 何 讀 取 資 料, 並 進 一 步 嘗 試 撰 寫 題 目 所 要 求 的 功 能, 將 是 很 可 惜 的 這 裡 將 介 紹 一 些 常 見 的 測 試 資 料 型 式, 以 及 讀 取 的 方 式, 並 附 上 實 際 題 目 的 範 例, 希 望 能 夠 帶 領 你 快 速 進 入 解 題 的 狀 況 每 小 節 後 面 還 有 相 關 的 練 習 題, 嘗 試 作 些 練 習, 對 CPE 考 試 成 績 一 定 有 所 助 益 2.1 C 語 言 的 scanf 與 printf 談 到 輸 入 與 輸 出, 對 C 語 言 來 說 便 是 scanf 與 printf 兩 個 函 式 其 中,scanf 的 書 寫 格 式 如 下 : int scanf(const char *format,...); 函 式 第 一 個 參 數 是 個 字 串, 裡 面 你 敘 述 要 如 何 讀 取 接 下 來 的 輸 入 對 於 你 所 打 算 讀 取 的 資 料 格 式 與 型 態, 依 序 填 入 對 應 的 符 號, 如 以 下 的 表 格 : 字 元 char* %c 字 串 char* %s 整 數 正 整 數 八 進 位 十 六 進 位 (unsigned) char* %hhd %hhu %hho %hhx (unsigned) short* %hd %hu %ho %hx (unsigned) int* %d %u %o %x (unsigned) long* %ld %lu %lo %lx (unsigned) long long* %lld %llu %llo %llx 浮 點 數 float* %f 浮 點 數 double* %lf 接 下 來 的 參 數 便 依 序 填 入 存 放 對 應 資 料 變 數 的 位 址, 即 變 數 名 稱 前 面 加 上 & 符 號 特 別 注 意, 字 串 變 數 名 稱 本 身 已 代 表 是 位 址, 所 以 唯 有 字 串 不 必 再 加 上 & 符 號 例 如, 下 列 的 程 式 : char ch,str[64]; 14
int num; float value; scanf("%c%s%d%f",&ch,str,&num,&value); 除 了 %c 以 外, 各 種 輸 入 方 式 皆 會 忽 略 前 方 多 餘 的 空 白 字 元, 即 space tab 與 enter 因 此 輸 入 列 中, 只 要 資 料 的 順 序 相 同, 其 間 如 何 空 隔 或 有 多 少 空 隔, 其 實 都 是 無 所 謂 的 像 是 下 面 這 些 情 況, 都 能 以 scanf("%d%f%f%f",...) 的 方 式 正 確 讀 取, 因 此 對 我 們 來 說 都 是 一 樣 的 3 1.10 2.20 3.30 3.1.10.2.20.3.30 3 1.10.2.20.3.30 3..1.10.2.20...3.30 2.2 C++ 語 言 的 cin 與 cout 對 於 C++ 而 言, 輸 入 與 輸 出 就 是 cin 與 cout cin 會 根 據 你 給 它 的 變 數 型 態, 讀 取 相 應 的 資 料, 使 用 的 運 算 元 是 指 向 變 數 的 >> 相 對 來 說, 簡 單 且 直 覺 2.3 讀 入 n 筆 資 料 測 試 資 料 最 常 見 的 就 是 這 種 型 式 了 處 理 方 式 就 是 讀 進 這 個 n, 然 後 跑 n 次 的 迴 圈 C language int n; scanf("%d",&n); while (n ) { /* 讀 取 每 筆 資 料 */ C++ 15
int n; cin>>n; while (n ) { // 讀 取 每 筆 資 料 範 例 : UVA10406: Vito's family 黑 道 老 大 Vito 搬 來 街 上 住, 希 望 與 每 位 親 戚 家 的 距 離 總 和 要 最 短 C Language #include <stdio.h> #define MAX_R 100 int num[max_r]; int n,r,s,i; int sum; scanf("%d",&n); while (n ) { scanf("%d",&r); for (i=0;i<r;i++) { scanf("%d",&s); num[i]=s; /* 剩 下 的 留 給 你 完 成, 提 示 : 中 位 數 */ printf("%d\n",sum); 16
C++ #include <iostream> #include <vector> using namespace std; vector<int> num; int n,r,s; cin>>n; while (n ) { cin>>r; num.clear(); for (int i=0;i<r;i++) { cin>>s; num.push_back(s); // 剩 下 的 留 給 你 完 成, 提 示 : 中 位 數 cout<<endl; 其 實, 不 同 題 目, 可 能 有 很 多 層 的 讀 入 n 筆 資 料 練 習 : UVA10401: Fibonaccimal Base UVA10403: Funny Encryption Method UVA10408: What is the Probability? 17
2.4 讀 至 檔 案 結 束 這 種 測 試 資 料 不 會 告 訴 你 有 多 少 筆 資 料, 你 必 須 一 直 處 理 到 沒 有 資 料 為 止 C language 檢 查 scanf 函 式 的 回 傳 值 可 以 知 道 資 料 是 否 結 束 平 常 scanf 會 回 傳 它 成 功 讀 進 的 元 素 個 數 ; 當 讀 到 檔 案 結 束 時,scanf 則 回 傳 EOF 把 它 整 合 在 while 的 判 斷 條 件 裡 就 成 如 下 的 程 式 : int x; while (scanf("%d",&x)!=eof) { /* 處 理 目 前 這 筆 資 料 */ C++ 若 把 cin 放 進 while 的 判 斷 條 件 裡,cin 會 自 動 轉 型 成 void* 而 當 檔 案 結 束 時, 其 值 會 變 成 NULL, 也 就 是 0, 代 表 false 所 以 我 們 寫 誠 如 下 的 程 式 : int x; while (cin>>x) { // 處 理 目 前 這 筆 資 料 範 例 : UVA10407: Hashmat the brave warrior 算 出 敵 方 軍 隊 與 我 方 人 數 的 差 距 C Language #include <stdio.h> 18
long long a,b; /* 可 能 等 於 2^32, 所 以 unsigned int 還 不 夠 */ while (scanf("%lld%lld",&a,&b)!=eof) { /* 試 著 完 成 它 吧! */ 請 注 意,scanf 對 於 long long 要 使 用 %lld C++ #include <iostream> using namespace std; long long a,b; // 可 能 等 於 2^32, 所 以 unsigned int 還 不 夠 while (cin>>a>>b) { // 試 著 完 成 它 吧! 練 習 : 10400: The 3n + 1 problem 10405: Jolly Jumpers ( 混 合 兩 種 方 式 ) 10411: Back to High School Physics 2.5 讀 至 0 結 束 這 種 類 型 也 是 時 常 出 現 的 型 式, 只 要 簡 單 地 加 個 判 斷 跳 出 迴 圈 即 可 C language int n; while (scanf("%d",&n)!=eof) { if (n==0) break; 19
/*... */ C++ int n; while (cin>>n) { if (n==0) break; //... 範 例 : UVA10404: Primary Arithmetic 計 算 進 行 加 法 時 進 位 的 次 數 C Language #include <stdio.h> int a,b; while (scanf("%d%d",&a,&b)!=eof) { if (a==0&&b==0) break; /* 留 給 你 完 成 */ C++ #include <iostream> using namespace std; 20
int a,b; while (cin>>a>>b) { if (a==0&&b==0) break; /* 留 給 你 完 成 */ 練 習 : 10416: Last Digit 10418: Minesweeper 2.6 一 次 讀 取 一 列 資 料 直 到 檔 案 結 束 一 列 的 資 料 中 可 能 包 含 空 白, 無 法 當 一 般 字 串 處 理, 因 此 需 要 一 次 將 一 整 列 資 料 進 行 讀 取 可 以 使 用 C 語 言 的 fgets, 或 C++ 語 言 的 getline C language #include <stdio.h> char s[100]; while ( fgets(s,100,stdin)!= NULL ) { // 100 為 一 列 的 size /*... */ C++ #include <cstring> string s; while ( getline(cin,s) ) { /*... */ 21
範 例 : UVA272: TEX Quotes 將 配 對 的 雙 引 號 " 和 " 替 換 成 `` 與 C language char s[100005]; while ( fgets(s,100005,stdin)!= NULL ) { /* 留 給 你 完 成 */ C++ string s; while ( getline(cin,s) ) { /* 留 給 你 完 成 */ 22