プログラミング言語
Python、C、C++、Java、JavaScript、TypeScript、Go、R、Haskellのチュートリアル — 入門から上級テクニックまで。
Lecture 06B:子型別、繼承與 Liskov 替換原則
上一節我們把 new PointsAccount() 交給一個型別為 Account 的參數,編譯器欣然接受。 這背後的規則叫子型別。本節把它講清楚,再介紹 Java 重用程式碼的機制——繼承, 最後用 Liskov 替換原則回答一個關鍵問題:什麼時候「A 繼承 B」是正確的設計?
記事を読む →Week 6 Workshop 導讀:設計聊天協定
網際網路本身就是靠協定運作的:HTTP(網頁)、SMTP(寄信)、IRC(最早的聊天室)都以 RFCRequest for Comments文件公開規格。 它們有幾個共同的設計選擇,值得我們直接借用:
記事を読む →Lab 導讀:遞迴與排序
Week 6 的 Lab 回頭鞏固兩個 Week 4–5 的核心技巧:遞迴與排序。 它們在本週的位置並不突兀——第 節的鏈結串列天生適合遞迴處理, 第 節的 Collections.sort 與 TreeMap 都建立在排序之上, 而「把演算法當參數傳」正是介面的又一個應用。 隨附程式在 code/ 底下的 04_lab_recursion_sorting 資料夾。
記事を読む →Lecture 07A(上):JUnit 測試與測試驅動開發
到目前為止我們用 assert 加一個 main 來檢查程式。它能用,但有三個問題: 所有檢查擠在一個方法裡,第一個失敗就會讓後面的全部跳過;沒有統一的報告; 而且很難「對同一份契約測多種實作」。JUnit 是 Java 世界的標準測試框架,正好解決這三件事。
記事を読む →Lecture 07A(下):轉型、泛型與 Collections
第 節的 SimpleList 用 Object 當元素型別,「什麼都能放」——但代價是取出來時只剩 Object, 得自己轉型回去,而且編譯器無法阻止你把 Integer 塞進一個「應該只放 String」的串列。 本節先把轉型講清楚,再介紹 Java 的解法:泛型,最後導覽建立在泛型之上的 Collections 框架。 隨附程式在 code/06_generics_collections。
記事を読む →Lecture 07B:雜湊函數、雜湊表與攤銷複雜度
上一節說 HashSet.contains 與 HashMap.get 平均只要 1——不管裡面有一百個還是一億個元素。 這聽起來像魔法:在 ArrayList 裡找東西要 n,在排序好的 TreeSet 裡要 n, 怎麼可能不看幾乎所有元素就知道某個鍵在不在?答案是雜湊。隨附程式在 code/07_hashing。
記事を読む →Week 7 Workshop 導讀:設計聊天客戶端的介面
Week 6 Workshop 決定了網路上跑什麼(協定);Week 7 Workshop 決定程式內部怎麼切: 把「跟伺服器講話」的程式碼(客戶端程式庫)與「跟使用者互動」的程式碼(UI)分成兩塊,中間用一個介面隔開。 目標是——任何人寫的 UI 都能接上任何人寫的客戶端程式庫。這是 Lecture 06A「介面即契約」與 Lecture 07A「對介面測試」的綜合演練。
記事を読む →總複習:觀念地圖、常見錯誤與自我測驗
@lL0.40 L0.36 @ 觀念 & 一句話 & 關鍵字/範例 封裝 & 欄位 private,只透過公開方法改狀態,藉此守住資料不變量並分離介面與實作 & BankAccount.balance;IllegalArgumentException vs IllegalStateException 介面 & 只有簽名與規格、沒有實作的契約;實作類別必須提供每個方法 & implements、@Override、不能 new ADT &
記事を読む →練習題與詳解 — 單元 01:C 語言入門(Getting Started)
本檔提供本單元練習題的完整詳解。強烈建議先自己動手做:每題先只看「題目」段落, 自己寫完、編譯、執行之後,再回來對照「解題思路」與「參考解答」。 所有解答的完整程式碼也放在 exercises/ 資料夾中,可直接編譯:
記事を読む →單元 01:C 語言入門(Getting Started)
C 語言由 Dennis Ritchie 於 1972 年前後在貝爾實驗室(Bell Labs)開發,最初的目的是重寫 UNIX 作業系統。 它的前身是 Ken Thompson 的 B 語言,而 B 又源自 BCPL。1978 年 Kernighan 與 Ritchie 出版了第一版 《The C Programming Language》(俗稱 K&R),1988 年的第二版對應 ANSI C(C89)標準,也就是本教程的主軸。
記事を読む →練習題與詳解 — 單元 02:變數與基本型別(Variables & Types)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 02:變數與基本型別(Variables & Types)
變數是「有名字的記憶體位置」。使用前必須先宣告,讓編譯器知道它的名字與型別:
記事を読む →練習題與詳解 — 單元 03:運算子與運算式(Operators & Expressions)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 03:運算子與運算式(Operators & Expressions)
重點:: 整數除法向零截斷:7 / 2 == 3、-7 / 2 == -3(C99 起明確定義)。 % 的結果符號跟隨被除數:-7 % 2 == -1。 % 不能用在浮點數;浮點取餘要用 <math.h> 的 fmod。
記事を読む →練習題與詳解 — 單元 04:控制流程——分支(Control Flow: Branching)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 04:控制流程——分支(Control Flow: Branching)
建議:一律加大括號。 歷史上多次重大安全漏洞(如 Apple 的 goto fail)都與省略大括號有關。
記事を読む →練習題與詳解 — 單元 05:迴圈(Loops)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 05:迴圈(Loops)
條件一開始就不成立的話,本體一次都不會執行。 while 適合「事先不知道要跑幾次」的情況(例如:讀到 EOF 為止)。
記事を読む →練習題與詳解 — 單元 06:函式(Functions)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 06:函式(Functions)
函式把「一段有名字的計算」封裝起來:寫一次、到處呼叫。好處:: 消除重複:同樣的邏輯不必複製貼上。 隱藏細節:呼叫者只需知道「做什麼」,不必知道「怎麼做」。 可獨立測試:小函式可以逐一驗證。
記事を読む →練習題與詳解 — 單元 07:陣列(Arrays)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 07:陣列(Arrays)
重點:: 陣列長度必須是編譯期已知的常數(C89 規則;C99 的 VLA 本教程先不使用)。 部分初始化時,剩餘元素保證補 0——這是 { 0 } 全清技巧的原理。 沒有初始化的區域陣列內容是垃圾值,跟普通變數一樣。
記事を読む →練習題與詳解 — 單元 08:字元與字串基礎(Characters & Strings Basics)
本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:
記事を読む →單元 08:字元與字串基礎(Characters & Strings Basics)
char 存的是字元的編碼值。ASCII 是最通行的編碼:
記事を読む →