歡迎來到進階編程的世界!
你好!現在你已經掌握了編寫程式的基礎,是時候看看「大局」了。在本章中,我們將探討進階編程 (Further Programming)。我們會學習如何有效地組織數據,以及如何編寫專業、易於修復且可重複使用的程式碼。這就像是從單純拼砌樂高積木,轉變為使用藍圖和專業工具組的建築大師!
如果有些術語起初聽起來有點嚇人,不用擔心。我們會用簡單的類比和分步指南來為大家拆解。讓我們開始吧!
1. 抽象數據類型 (Abstract Data Types, ADTs)
抽象數據類型 (ADT) 是一種組織數據及定義我們可以對其執行哪些操作的方法。想像一個「黑盒」:你知道什麼數據放進去、什麼數據出來,但為了使用它,你不一定需要看到裡面複雜的線路。
A. 堆疊 (Stack)
堆疊 (Stack) 是一種遵循 LIFO (後進先出) 原則的數據集合:Last-In, First-Out。
現實生活類比: 想像自助餐廳裡的一疊托盤。最後放上去的那一個托盤,一定是別人第一個拿走的。你不可能在不把整疊弄倒的情況下,直接抽出最底下的那個!
關鍵操作:
- Push (推入): 在頂部添加一個項目。
- Pop (彈出): 從頂部移除一個項目。
- Peek (查看): 查看頂部的項目而不將其移除。
B. 佇列 (Queue)
佇列 (Queue) 遵循 FIFO (先進先出) 原則:First-In, First-Out。
現實生活類比: 一隊等巴士的人。第一個到達的人第一個上車,這樣才公平嘛!
關鍵操作:
- Enqueue (加入): 在隊伍的末端添加一個項目。
- Dequeue (移出): 從隊伍的前端移除一個項目。
C. 鏈結串列 (Linked List)
鏈結串列 (Linked List) 是一種數據集合,其中每個項目(稱為節點 Node)都指向下一個項目。
現實生活類比: 尋寶遊戲。你找到一個線索,而該線索會確切告訴你下一個線索在哪裡。這些項目在記憶體中不一定需要緊挨著放置,它們只需要「知道」鄰居在哪裡即可。
快速複習: 堆疊使用 LIFO(像盤子),佇列使用 FIFO(像排隊),而鏈結串列使用指標 (Pointers) 來連接數據。
2. 結構化編程:程序與函式
隨著程式變得越來越大,編寫一長串代碼會變成一場惡夢。結構化編程 (Structured Programming) 是一門將程式碼拆分為更小、可重複使用的區塊(稱為子程序 Sub-routines)的藝術。
程序 (Procedures) 與 函式 (Functions)
兩者都是執行任務的程式碼區塊,但有一個主要區別:
- 程序 (Procedures): 執行任務但不會向主程式回傳值。例子:一個顯示「歡迎」訊息的程序。
- 函式 (Functions): 執行計算並必須回傳一個值。例子:一個輸入兩個數字並回傳其總和的函式。
參數傳遞:傳值與傳址
當你將數據傳入子程序時,你會使用參數 (Parameters)。有兩種方式可以做到:
1. 傳值 (Passing by Value, ByVal): 程式會製作一份數據的副本。子程序外部的原始變數保持安全且不被改變。
2. 傳址 (Passing by Reference, ByRef): 程式會將原始變數的地址傳給子程序。如果子程序改變了該數值,原始變數也會隨之改變!
記憶小撇步: ByVal 就像給朋友一張你功課的影印本。他們可以在上面隨便塗寫,但你的原稿是安全的。ByRef 就像把你的筆記本正本給他們。他們做的任何更改都是永久性的!
關鍵要點: 當你需要獲取結果時,請使用函式。如果你想保護原始數據免受意外更改,請使用 ByVal。
3. 程式設計與結構圖
在開始輸入程式碼之前,你需要一個計劃。逐步求精 (Stepwise Refinement) 是一個將複雜問題拆解成越來越小的子問題,直到它們易於編碼的過程。
結構圖 (Structure Charts)
結構圖 (Structure Chart) 是一種顯示這些子問題(模組)如何相互連接的圖表。它使用特定符號來顯示數據如何流動:
- 矩形: 代表一個模組(程序或函式)。
- 帶有空心圓的箭頭: 顯示數據偶對 (Data Couples)(在模組之間傳遞的數據)。
- 帶有實心圓的箭頭: 顯示控制標誌 (Control Flags)(簡單的真/假訊號,例如「已完成」)。
你知道嗎? 將問題分解使得團隊合作更容易。一個人可以編寫「登入」模組,而另一個人編寫「付款」模組!
4. 測試與維護
即使是最優秀的程式設計師也會犯錯!我們稱這些為錯誤 (Bugs)。為了找到它們,我們使用不同的測試方法。
錯誤類型
- 語法錯誤 (Syntax Error): 你違反了程式語言的規則(例如拼字錯誤或漏掉括號)。程式碼無法執行。
- 邏輯錯誤 (Logic Error): 程式碼可以執行,但給出了錯誤的答案。(例如,你使用了 \( + \) 而不是 \( * \))。
- 執行階段錯誤 (Run-time Error): 在程式執行期間發生了無法處理的情況,例如嘗試除以零。
選擇測試數據
測試程式時,你應該使用三種類型的數據:
- 正常數據 (Normal Data): 程式預期會收到的數據(例如,輸入「15」作為年齡)。
- 異常數據 (Abnormal Data): 錯誤類型的數據(例如,輸入「你好」作為年齡)。
- 極端/邊界數據 (Extreme/Boundary Data): 處於允許範圍邊緣的值(例如,如果年齡限制為 18-65,則測試「18」和「65」)。
維護:讓程式保持活躍
一旦程式發布,它仍然需要維護。這稱為維護 (Maintenance):
- 更正性維護 (Corrective): 修復軟體發布後發現的錯誤。
- 適應性維護 (Adaptive): 修改程式以使其能在新的作業系統或新的硬體上運作。
- 完善性維護 (Perfective): 添加新功能或優化程式碼執行速度,使其變得「完美」。
常見錯誤: 許多學生會混淆適應性和完善性。請記住:適應性是關於必要性(否則無法運作),而完善性是關於改進(雖然能運作,但你希望它更好)。
最終快速複習框
- ADTs: 堆疊 (LIFO)、佇列 (FIFO)、鏈結串列 (指標)。
- 結構: 函式回傳值;程序不回傳值。ByVal = 安全副本;ByRef = 存取原始數據。
- 設計: 使用結構圖來規劃模組間如何共享數據。
- 測試: 使用正常、異常和邊界數據來找出語法、邏輯和執行階段錯誤。
- 維護: 更正性(修復)、適應性(變更環境)、完善性(改進)。
你一定做得到的!程式設計是一項通過練習而不斷進步的技能。繼續編碼,繼續探索吧!