S SmartDocs

编程语言

Python、C、C++、Java、JavaScript、TypeScript、Go、R 与 Haskell 教程,从入门语法到高级技巧。

Angelia 更新于 2026-08-13

Java Lab 3:登山演算法完全教材

想像你是一位在「數位山脈」中工作的測量員。你手上有一張高度圖 (heightmap):一個 2D 的整數格子,每個數值代表該座標的海拔高度。 地圖裡藏著一個黃金山頂(golden peak)——全地圖的最高點。 你的任務是寫出一系列演算法,讓程式自己「爬」上這座山: 從一個格子移動到另一個格子、分析周圍的坡度來判斷哪個方向是上坡, 最後還要最佳化路線,用最少的步數登頂。

阅读文章 →
Angelia 更新于 2026-09-27

這份教材要教你什麼

前五週你已經學會了 Java 的「動詞」:變數、迴圈、陣列、函式、遞迴、例外處理, 也初步認識了類別(class)與物件(object)。 從第 6 週開始,課程的重心轉向如何把程式組織成可以長大、可以測試、可以被別人安心使用的形狀 ——這就是物件導向設計object-oriented design的核心, 也是 Week 5 測驗之後、期末專案之前最關鍵的兩週。

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 06A(上):封裝——把狀態藏起來

先想想數字 5。你把它加 1,並不是「改變了 5」,而是得到一個全新的值 6。 5 本身不可變(immutable),除了它的值之外沒有任何「身分」。 Week 5 學過的 record 也是這樣:兩個欄位相同的 record 就是「同一個值」,可以放心用 equals 比較。

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 06A(下):介面與抽象資料型別

於是 handleAccount(new BankAccount(0)) 與 handleAccount(new PointsAccount()) 都合法, 而 PointsAccount 的內部長得完全不一樣(它有 points 欄位、開戶送 10000 點、每次存入加送 1%)。 執行結果:

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 06B:子型別、繼承與 Liskov 替換原則

上一節我們把 new PointsAccount() 交給一個型別為 Account 的參數,編譯器欣然接受。 這背後的規則叫子型別。本節把它講清楚,再介紹 Java 重用程式碼的機制——繼承, 最後用 Liskov 替換原則回答一個關鍵問題:什麼時候「A 繼承 B」是正確的設計?

阅读文章 →
Angelia 更新于 2026-09-27

Week 6 Workshop 導讀:設計聊天協定

網際網路本身就是靠協定運作的:HTTP(網頁)、SMTP(寄信)、IRC(最早的聊天室)都以 RFCRequest for Comments文件公開規格。 它們有幾個共同的設計選擇,值得我們直接借用:

阅读文章 →
Angelia 更新于 2026-09-27

Lab 導讀:遞迴與排序

Week 6 的 Lab 回頭鞏固兩個 Week 4–5 的核心技巧:遞迴與排序。 它們在本週的位置並不突兀——第 節的鏈結串列天生適合遞迴處理, 第 節的 Collections.sort 與 TreeMap 都建立在排序之上, 而「把演算法當參數傳」正是介面的又一個應用。 隨附程式在 code/ 底下的 04_lab_recursion_sorting 資料夾。

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 07A(上):JUnit 測試與測試驅動開發

到目前為止我們用 assert 加一個 main 來檢查程式。它能用,但有三個問題: 所有檢查擠在一個方法裡,第一個失敗就會讓後面的全部跳過;沒有統一的報告; 而且很難「對同一份契約測多種實作」。JUnit 是 Java 世界的標準測試框架,正好解決這三件事。

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 07A(下):轉型、泛型與 Collections

第 節的 SimpleList 用 Object 當元素型別,「什麼都能放」——但代價是取出來時只剩 Object, 得自己轉型回去,而且編譯器無法阻止你把 Integer 塞進一個「應該只放 String」的串列。 本節先把轉型講清楚,再介紹 Java 的解法:泛型,最後導覽建立在泛型之上的 Collections 框架。 隨附程式在 code/06_generics_collections。

阅读文章 →
Angelia 更新于 2026-09-27

Lecture 07B:雜湊函數、雜湊表與攤銷複雜度

上一節說 HashSet.contains 與 HashMap.get 平均只要 1——不管裡面有一百個還是一億個元素。 這聽起來像魔法:在 ArrayList 裡找東西要 n,在排序好的 TreeSet 裡要 n, 怎麼可能不看幾乎所有元素就知道某個鍵在不在?答案是雜湊。隨附程式在 code/07_hashing。

阅读文章 →
Angelia 更新于 2026-09-27

Week 7 Workshop 導讀:設計聊天客戶端的介面

Week 6 Workshop 決定了網路上跑什麼(協定);Week 7 Workshop 決定程式內部怎麼切: 把「跟伺服器講話」的程式碼(客戶端程式庫)與「跟使用者互動」的程式碼(UI)分成兩塊,中間用一個介面隔開。 目標是——任何人寫的 UI 都能接上任何人寫的客戶端程式庫。這是 Lecture 06A「介面即契約」與 Lecture 07A「對介面測試」的綜合演練。

阅读文章 →
Angelia 更新于 2026-09-27

總複習:觀念地圖、常見錯誤與自我測驗

@lL0.40 L0.36 @ 觀念 & 一句話 & 關鍵字/範例 封裝 & 欄位 private,只透過公開方法改狀態,藉此守住資料不變量並分離介面與實作 & BankAccount.balance;IllegalArgumentException vs IllegalStateException 介面 & 只有簽名與規格、沒有實作的契約;實作類別必須提供每個方法 & implements、@Override、不能 new ADT &

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 01:C 語言入門(Getting Started)

本檔提供本單元練習題的完整詳解。強烈建議先自己動手做:每題先只看「題目」段落, 自己寫完、編譯、執行之後,再回來對照「解題思路」與「參考解答」。 所有解答的完整程式碼也放在 exercises/ 資料夾中,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-01

單元 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)標準,也就是本教程的主軸。

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 02:變數與基本型別(Variables & Types)

本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-01

單元 02:變數與基本型別(Variables & Types)

變數是「有名字的記憶體位置」。使用前必須先宣告,讓編譯器知道它的名字與型別:

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 03:運算子與運算式(Operators & Expressions)

本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-01

單元 03:運算子與運算式(Operators & Expressions)

重點:: 整數除法向零截斷:7 / 2 == 3、-7 / 2 == -3(C99 起明確定義)。 % 的結果符號跟隨被除數:-7 % 2 == -1。 % 不能用在浮點數;浮點取餘要用 <math.h> 的 fmod。

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 04:控制流程——分支(Control Flow: Branching)

本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-02

單元 04:控制流程——分支(Control Flow: Branching)

建議:一律加大括號。 歷史上多次重大安全漏洞(如 Apple 的 goto fail)都與省略大括號有關。

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 05:迴圈(Loops)

本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-01

單元 05:迴圈(Loops)

條件一開始就不成立的話,本體一次都不會執行。 while 適合「事先不知道要跑幾次」的情況(例如:讀到 EOF 為止)。

阅读文章 →
C Programming Language 更新于 2026-08-02

練習題與詳解 — 單元 06:函式(Functions)

本檔提供本單元練習題的完整詳解。先自己動手做:每題先只看「題目」, 寫完、編譯、執行後再對照「解題思路」與「參考解答」。 完整程式碼都在 exercises/ 資料夾,可直接編譯:

阅读文章 →
C Programming Language 更新于 2026-08-01

單元 06:函式(Functions)

函式把「一段有名字的計算」封裝起來:寫一次、到處呼叫。好處:: 消除重複:同樣的邏輯不必複製貼上。 隱藏細節:呼叫者只需知道「做什麼」,不必知道「怎麼做」。 可獨立測試:小函式可以逐一驗證。

阅读文章 →