關於這份筆記
本文依據國立中山大學資工系 CSE123「C 程式設計」(授課老師:柯正雯 副教授)與其對應實驗課 1151 學期的公開進度表寫成。講解、範例程式與雷區整理是筆者自己寫的,不轉載教科書 Absolute C++ (Walter Savitch, 6/e) 的內文、圖片與習題原文,也不轉載老師或助教的投影片。練習題的來源分三種,每一題都有標示:(1)配合當週講解出的基本題,其中有些是照課本勾選題要練的技能出的(各篇的「對應課本習題」表有寫);(2)「實驗課題型加練」——今年已公布的課堂練習是實驗課的題目、不是我出的,這裡只用自己的話重述、給思路不給程式;去年的題型則改成同類型的變化題,敘述、規則、資料與解答都重寫過,不是原題;(3)標明「取自歷年考古題」的題型(模擬考與部分加練題),來自學長姐流傳的歷年考卷,題目敘述、資料與解答同樣是重寫的。若讀者希望取得完整原文與課本習題,仍請透過正版管道取得該書;課堂練習題以當週實驗課公布的為準。文中所有程式碼都在
g++ -std=c++11 -Wall -Wextra下實際編譯執行過,零警告(課程以 C++11 為準)。
這份筆記是什麼
修過中山資工「C 程式設計」的同學都知道兩件事:課本是 Pearson 的原文書 Absolute C++,一章動輒五六十頁;而這門課雖然叫「C 程式設計」,實際教的是 C++。對第一次寫程式的人來說,光是看懂課本就先耗掉大半力氣。
這個系列依照 1151 學期的公開進度表,把每一週該會什麼、為什麼這樣寫、哪裡會踩雷用中文講清楚,讓你不用天天翻原文書也跟得上。內容包含:
- 每週一篇:觀念講解 + 可以直接複製編譯的範例 + 常見雷區 + 練習題與參考解答。每篇練習題分兩段:前半是配合講解出的基本題,後半「實驗課題型加練」照實驗課課堂練習與考古題的題型出變化題(題目每年會換、題型很固定;每篇都有標來源)
- 環境與 Makefile:從 VirtualBox 裝到模組化 Makefile,寫成可以照抄的流程
- 模擬考:主課的期中模擬上機考、期末筆試模擬題、期末模擬上機考,加上實驗課上機考題型的兩組練習(Ch 1–6、全範圍),都附解答
怎麼讀
- 不要一次讀完。每週上課前讀當週那篇(約 15 分鐘),上課後把練習題做完(60–90 分鐘),是最有效率的用法。
- 完全沒寫過程式的話,請從環境設置照順序讀下來,看到不懂的名詞就查附錄的名詞速查表。
- 已經寫過其他語言的話,可以只看每篇的「常見雷區」與練習題,遇到不熟的語法再回頭看講解。
- 每題練習都有參考解答(點開「參考解答」展開)。請先自己寫過再看。
目錄與進度
課本是 Absolute C++, Walter Savitch, 6/e(Global Edition)。先弄清楚一件事:這其實是兩門課——早上的 C 程式設計(主課)和下午的 C 程式設計實驗(實驗課),各自算分、各自考試。
- 主課:期中上機 30% + 期末筆試 30% + 期末上機 40%(沒有作業分數、不點名,但考試沒到就是 0 分;期末上機比期中進步 30 分以上可加 1–3 分,期中考砸了不是世界末日)。老師第一堂課講明:主課的上機考幾乎全部從下表「課本指定習題」那些題目出(期中 100%、期末約六成),題號照第 6 版——那幾題一定要自己寫過。
- 實驗課:課堂實作 60%(每週練習題做完當場檢查)+ 實驗課自己的期末上機考 40%,題型就是每週練習題那種(連續輸入、格式一字不差)。
本系列每週的練習題分兩段就是為了這個:前半配合講解、對應主課與課本,後半「實驗課題型加練」對應實驗課。
章節標題就是上課日期,可以直接對照進度:
| 章節 | 這篇在講什麼 | 課本指定習題 |
|---|---|---|
| 環境設置:把工具鏈準備好 | VirtualBox、Ubuntu 20.04、g++、終端機指令、Makefile 從零到模組化 | — |
| 09/10|課程介紹與環境暖身 | C 與 C++ 的差別、整學期地圖、第一週驗收流程、第一次編譯失敗怎麼讀訊息 | — |
| 09/17|C++ 基礎(Ch 1) | 型別、變數、輸入輸出、算術與整數除法陷阱、比較運算、if/switch(第一週實驗課就要用) |
Ch1: 6, 8, 13;Ch2: 2, 4, 7, 8 |
| 09/24|流程控制與函式基礎(Ch 2、Ch 3) | 三元運算子、enum、三種迴圈、自訂函式、作用域 |
Ch3: 1, 5, 10, 11, 13 |
| 10/01|參數傳遞與函式重載(Ch 4) | 傳值 vs 傳參考、const 參考、重載、預設引數 | Ch4: 3, 7, 8, 9, 14, 17 |
| 10/08|陣列(Ch 5) | 一維與二維陣列、越界、陣列傳參、搜尋與排序 | Ch5: 4, 8, 10, 14, 17 |
| 10/15|結構與類別(Ch 5–6) | struct、class、封裝、public / private、const 成員函式 | Ch6: 1, 7, 10, 12 |
| 10/22|類別與建構子(Ch 6–7) | 建構子、初始化列表、預設建構子、static 成員 | — |
| 10/29|vector 與運算子重載入門(Ch 7) | vector 常用操作、傳參、運算子重載的概念 | — |
| 11/05|期中上機考(範圍 Ch 1–6) | 主課期中:複習清單+一份 90 分鐘模擬上機考;另附實驗課上機考題型(Ch 1–6 的部分) | Ch7: 1, 5, 6, 8, 11 |
| 11/12|運算子重載、friend 與 string(Ch 8、Ch 9) | 成員 vs 非成員、friend、重載 << >>、string 類別 | Ch8: 1, 4, 5, 8, 9 |
| 11/19|指標、動態記憶體與 C 風格字串(Ch 9、Ch 10) | 指標、new / delete、深拷貝與三法則、C-string | Ch9: 2, 4, 6, 10;Ch10: 1, 3, 4, 8 |
| 11/26|分離編譯與命名空間(Ch 11) | header / 實作檔、include guard、多檔案 Makefile、namespace | Ch11: 1, 3 |
| 12/03|檔案輸入輸出(Ch 12) | ifstream / ofstream、讀到檔尾、格式化、stringstream | Ch12: 2, 3, 5 |
| 12/10|繼承(Ch 14) | 衍生類別、protected、覆寫、建構解構順序、is-a vs has-a | Ch14: 4, 6, 8 |
| 12/17|期末筆試(範圍 Ch 1–12、Ch 14) | 全學期複習表+13 題模擬題(看程式答輸出、找錯)+觀念快問快答 | — |
| 12/24|期末上機考(範圍 Ch 1–12、Ch 14) | 主課期末上機:應考流程+一份 120 分鐘模擬上機考;另附實驗課期末上機考模擬 | — |
| 附錄:編譯選項、Makefile、錯誤訊息與名詞速查 | g++ 選項、通用 Makefile、常見錯誤訊息對照表、名詞速查表、範圍外補充(遞迴) | — |
三個從這張表就能讀出來的重點:
- 期中只考到 Ch6,也就是基礎語法、函式、陣列、struct / class,不含建構子。很多人考前拚命讀建構子,方向錯了。
- Ch13(Recursion)與 Ch15 之後(多型、template、STL、例外處理)都不在考試範圍。所以這份筆記不教遞迴(只在附錄留一小段範圍外的補充),
virtual也不會考。 - Ch7(建構子、vector、運算子重載)的習題到期中考那週才發,代表這塊是期末的重點。
幾個提醒
- 練習題不要拖:實驗課的分數是當場檢查給的,補不回來。
- 每次交檔前
make clean && make:確認在乾淨狀態下能編過。很多人是舊的執行檔還在,Makefile 早就壞了卻不知道。 - 把 warning 當 error:平常就用
-Wall -Wextra編譯。上機考一個警告 2 分,五個就是 10 分。 - 保留自己寫過的程式:期末複習時拿自己的舊 code 來練,比重看範例快得多。
- 搜資料要用 C++ 的關鍵字(
class、vector、ifstream),搜到 C 語言的printf、malloc教學會愈看愈亂。
結語
這個系列不是要取代上課或教科書,而是提供一份中文、可以照著跑的自學骨幹。
真的只記得一件事的話,請記這個:每寫完一小段就編譯一次、跑一次測資。 這個習慣可以解決這門課九成的痛苦。
內容如果有錯誤或可以補充的地方,歡迎在下方留言告訴我,我會即時修正。
說些什麼吧!