歡迎來到程式設計技巧!
在本章中,我們將深入探索每位軟體開發者的「工具箱」。無論你是要開發下一個爆紅的應用程式,還是一個簡單的計算機,你都需要掌握如何結構化你的程式碼,使其具備高效、易讀且運作正確的特性。我們將探討控制程式的邏輯、如何管理數據,以及將程式碼組織成「物件」的現代化方法。
如果現在有些術語聽起來像外星語言,不用擔心——看完這些筆記後,你就能流利地說「電腦語言」了!
1. 三大基礎:程式結構 (Programming Constructs)
世界上每一個程式,無論多麼複雜,都是由三個基本結構組成的。你可以把它們想像成寫程式的「樂高積木」。
A. 順序 (Sequence)
順序是最簡單的結構。它的意思是指電腦按照程式碼編寫的先後順序,一行接一行地執行指令。
範例:泡一杯茶。1. 燒開水,2. 放茶包,3. 倒水。你總不會在燒水之前就把水倒出來吧!
B. 分支 (Branching / Selection)
分支(亦稱為選擇)是程式進行決策的地方。它利用條件(如 IF 語句)來決定該走哪一條路徑。
範例:IF 正在下雨,就帶雨傘。ELSE(否則),把雨傘留在家裡。
C. 迭代 (Iteration)
迭代其實就是迴圈的專業用語。它代表重複執行一段程式碼,直到滿足特定條件為止。
- 計數控制迴圈 (Count-controlled loops):重複設定的次數(例如:FOR i = 1 to 10)。
- 條件控制迴圈 (Condition-controlled loops):重複執行直到某些情況改變(例如:WHILE bag_not_full... 或 REPEAT... UNTIL)。
範例:繼續走(迴圈),UNTIL(直到)你到達巴士站為止。
快速複習:
- 順序:一步接一步。
- 分支:做決策。
- 迭代:重複執行。
重點總結:這三個結構控制了程式的「流程」。如果你能掌握這些,你就能寫出任何邏輯!
2. 遞迴 (Recursion):「鏡像」技巧
遞迴是一種程式設計技巧,其中函數會呼叫自身來解決問題。它將一個大問題分解成與原問題相同但規模較小的子問題。
一個遞迴函數要能運作,必須具備兩樣東西:
1. 基準情況 (Base Case):一個簡單的條件,告訴函數何時該停止。如果沒有這個,程式將會無限迴圈導致當機(稱為「堆疊溢位」Stack Overflow)。
2. 遞迴情況 (General Case):函數再次呼叫自身的部分,但處理的是稍微簡單一點的問題版本。
遞迴 vs. 迭代
你通常可以用遞迴或標準迴圈(迭代)來編寫相同的邏輯。
- 遞迴:通常能寫出更簡潔、「優雅」的程式碼。然而,它會消耗更多記憶體,因為每次函數呼叫自身時,都會在堆疊 (Stack) 上佔用空間。
- 迭代:通常速度較快且消耗較少記憶體,但對於某些數學問題來說,程式碼寫起來可能會比較複雜。
比喻:想像一組俄羅斯套娃。要找到中間的小獎品,你會打開一個娃娃(這是遞迴呼叫)。如果裡面還有另一個娃娃,你就重複這個過程。當你到達那個無法再打開的最小娃娃時,那就是你的基準情況!
常見錯誤:忘記設定基準情況!如果你的遞迴函數永遠不會停止,電腦的記憶體很快就會用盡。
3. 管理數據:變數與範疇 (Variables and Scope)
程式需要儲存數據,但數據「居住」在哪裡非常重要。
區域變數 (Local Variables)
區域變數是在特定的副程式(函數或程序)內宣告的。它只在該副程式執行期間存在,且不能在外部存取。這非常有用,因為它可以保護你的數據,防止程式的其他部分意外更改它。
全域變數 (Global Variables)
全域變數在程式的最開頭宣告,程式的任何部分都可以看到並更改它。雖然這聽起來很方便,但通常應該避免使用,因為這會導致除錯困難——任何函數都可能在更改該數值,讓你很難追蹤錯誤。
重點總結:盡可能使用區域變數,以保持程式碼「簡潔」且「模組化」。
4. 模組化、函數與程序
模組化 (Modularity) 是將龐大的程式拆解成較小、易於管理的區塊,這些區塊稱為副程式 (subroutines)。這使得程式碼更容易測試、撰寫和重複使用。
程序 (Procedures) vs. 函數 (Functions)
- 程序:執行一項任務(例如:ClearScreen 清除螢幕)。
- 函數:執行一項任務並回傳一個值給主程式(例如:CalculateSquareRoot 計算平方根)。
傳遞參數 (Passing Parameters)
當你呼叫副程式時,通常會傳遞稱為參數的數據。傳遞方式有兩種:
1. 傳值 (Passing by Value):電腦製作一份數據的「複本」。原始數據保持安全且不會改變。
2. 傳址 (Passing by Reference):電腦傳遞原始數據的「位址」(記憶體位置)。如果副程式更改了數據,原始版本也會跟著改變!
比喻:傳值就像給別人看你房子的照片——他們可以在照片上畫畫,但你的房子本體完全沒變。傳址就像把房子的鑰匙交給他們——如果他們把牆壁重新粉刷了,你的房子本體真的會改變!
5. 使用整合開發環境 (IDE)
IDE 是你用來寫程式的軟體(例如 PyCharm、Visual Studio 或 IDLE)。它提供了許多工具讓你的生活更輕鬆:
- 編輯器 (Editor):你輸入程式碼的地方(通常有色彩編碼/語法高亮顯示)。
- 錯誤報告 (Error Reporting):明確告訴你程式在哪一行崩潰了。
- 除錯工具 (Debugging Tools):允許你設定中斷點 (Breakpoints)(暫停程式)並逐行執行程式碼,以觀察變數的變化。
6. 物件導向程式設計 (OOP)
物件導向技術是一種現代化的組織程式碼方法,透過將數據和行為組合在一起來實現。與其只寫一行行的指令列表,不如建立「物件」。
OOP 關鍵術語:
- 類別 (Class):藍圖。(例如:關於「汽車」的藍圖)。
- 物件 (Object):藍圖的實例。(例如:「我的紅色法拉利」)。
- 屬性 (Attributes):關於物件的數據。(例如:顏色、最高時速、油量)。
- 方法 (Methods):物件可以採取的行動。(例如:加速、煞車)。
- 封裝 (Encapsulation):隱藏物件的「內部運作方式」,只公開必要的部分。(就像開車時不需要知道引擎活塞具體是如何運作的)。
- 繼承 (Inheritance):基於現有的類別建立新的類別。(例如:「卡車」類別可以繼承「汽車」類別的特性,並增加「拖曳能力」)。
- 多型 (Polymorphism):允許不同的物件被視為同一類型,但表現出不同的行為。(例如:「狗」和「貓」都有「發出聲音」的方法,但一個會汪汪叫,另一個會喵喵叫)。
你知道嗎?大多數現代軟體,從電子遊戲到銀行系統,都是使用 OOP 建構的,因為這讓管理海量的程式碼變得容易多了!
快速複習:
- 類別 = 藍圖。
- 物件 = 真實的東西。
- 繼承 = 傳承特性。
- 封裝 = 保持私密性。
重點總結:OOP 幫助我們在程式碼中模擬真實世界,使其更直觀且井井有條。