歡迎來到程式設計的世界!

歡迎!你即將深入探索電腦科學中最令人興奮的領域之一:程式設計概論 (Introduction to Programming)。你可以把程式設計想像成學習一種與電腦溝通的新語言。就像跟著食譜做蛋糕一樣,程式其實就是一系列告訴電腦該做什麼的指令。

在本章中,我們將探討程序式程式設計 (Procedural Programming)(編寫程式碼的標準方式)以及組合語言 (Assembly Language)(我們如何更直接地與電腦硬體溝通)。如果一開始覺得內容很多,不用擔心——我們會把它拆解成小塊,一步步攻克!

1. 程序式程式設計技巧

大多數現代程式語言,如 Python、Java 或 C++,都支援程序式程式設計。這是一種程式設計風格,透過一系列指令,一步一步地指導電腦執行任務。

程式流程(三大支柱)

幾乎所有編寫過的程式都依賴三種基本結構來控制其「流程」:

1. 順序 (Sequence):這是最簡單的結構。意思是電腦由上而下,逐一執行指令。
例子:1. 起床 -> 2. 刷牙 -> 3. 吃早餐。

2. 選擇 (Selection / Branching):這是電腦進行決策的地方。它會檢查一個條件(通常是 IF 陳述式),然後選擇要執行的路徑。
例子:如果正在下雨,就帶雨傘。否則,就戴太陽眼鏡。

3. 迭代 (Iteration / Looping):這是電腦多次重複執行一段程式碼的情況。我們使用 FOR 迴圈(當我們知道要重複執行多少次時)或 WHILE 迴圈(直到條件改變為止)。
例子:只要你的盤子還沒空,就繼續吃。

變數與常數

想像電腦的記憶體是一面掛滿便利貼或儲存盒的巨大牆壁。

變數 (Variables):這些是「盒子」,用來儲存程式執行過程中可以改變的資料。例如,遊戲中的 playerScore(玩家分數)從 0 開始,隨後會不斷增加。
常數 (Constants):這些是用於存放程式一旦開始後就不能更改的資料的「盒子」。例如,圓周率 PI (\( \pi \)) 永遠是 3.14159。

運算子:邏輯工具

為了執行任何有用的操作,我們需要運算子:

算術運算子 (Arithmetic Operators):標準數學運算,如 +(加)、-(減)、*(乘)和 /(除)。
賦值運算子 (Assignment Operators):即 = 符號。在程式設計中,它不代表「等於」;它意味著「取右邊的值,並放進左邊的盒子裡」。
布林運算子 (Boolean Operators):這些有助於做出決定。AND(兩者皆須為真)、OR(至少有一個為真)以及 NOT(相反結果)。

程序與函式

有時候我們會有想要重複使用的程式碼區塊。與其重複輸入十次,我們將其封裝成一個「子程序」。

程序 (Procedures):執行一項任務但不會將值傳回主程式的程式碼區塊。
函式 (Functions):執行一項任務並回傳 (return) 一個值回主程式的程式碼區塊。

類比:程序就像吸塵器——它完成了工作,但在完成時不會交給你任何東西。函式就像果汁機——你給它水果,它會回傳給你果汁。

字串與檔案處理

字串處理 (String Handling):這是我們處理文字的方式。我們可以找出單字的長度、將兩個字串連接起來(串接/Concatenation),或是截取字串的一部分(切片/Slice)。
檔案處理 (File Handling):程式通常需要永久儲存資料。我們使用三個主要步驟:開啟 (Open) 檔案、讀取/寫入 (Read/Write) 檔案,最重要的一步是關閉 (Close) 檔案以儲存變更。

快速回顧:程序式程式設計的核心在於「如何做」。它使用變數來儲存資料,並利用順序、選擇和迭代來控制事件的順序。

2. 組合語言與小人電腦 (LMC)

高階語言(如 Python)對人類來說很容易閱讀。然而,電腦只懂 1 和 0。組合語言 (Assembly Language) 是一種位於中間的「低階」語言——它是機器碼的人類可讀版本。

什麼是小人電腦?

小人電腦 (Little Man Computer, LMC) 是一個簡化的電腦模型,用來幫助你理解 CPU 的運作原理。想像一個小人待在一個房間裡,裡面有 100 個郵箱(記憶體)、一台計算機(累加器,Accumulator)和一個計數器(程式計數器,Program Counter)。

LMC 關鍵助憶碼 (指令)

LMC 不使用二進位,而是使用稱為助憶碼 (mnemonics) 的短單字。以下是你考試需要知道的指令:

ADD:將郵箱中的值加到計算機(累加器)中。
SUB:從計算機中減去郵箱中的值。
STA (Store):將計算機中的值儲存到郵箱中。
LDA (Load):將郵箱中的值載入到計算機中。
INP (Input):接收來自使用者的輸入
OUT (Output)輸出計算機中當前的值。
HLT (Halt)停止程式。
BRA (Branch Always)無條件跳轉(跳到另一個指令)。
BRZ / BRP (Branch if Zero / Positive)若為零 / 若為正數則跳轉(僅當計算機數值為 0 或正數時才跳轉)。

簡單的 LMC 程式範例

讓我們看看一個將兩個數字相加的程式:

1. INP (取得第一個數字)
2. STA FIRST (將其儲存在名為 'FIRST' 的郵箱中)
3. INP (取得第二個數字)
4. ADD FIRST (將第一個數字加到第二個數字上)
5. OUT (顯示結果)
6. HLT (停止)

你知道嗎?儘管現今我們大多使用高階語言編寫程式,但組合語言仍被用於編寫高效能顯示卡或微型醫療裝置等領域,因為它能讓程式設計師完全掌控硬體!

3. 常見陷阱與技巧

如果一開始覺得棘手,請別擔心!許多學生都會在以下幾點感到困惑:

= 與 ==:在許多語言中,單一個 = 是將值放入盒子(賦值),而雙等號 == 則是檢查兩個東西是否相同(比較)。
無限迴圈:務必確保你的 WHILE 迴圈有終止條件,否則程式將永遠卡住!
函式回傳值:請記得 函式 (Function) 必須總是使用 return 這個字將答案傳回。如果你忘了,結果就會消失!
LMC 記憶體:在 LMC 中,請記住 STALDA 指令會變更郵箱或計算機的值,但它們不會刪除之前的內容——它們只是將其覆蓋!

複習重點

程序式 (Procedural) 程式碼是一系列步驟的順序。
選擇 (Selection) 是決策 (IF),迭代 (Iteration) 是重複 (WHILE/FOR)。
變數 (Variables) 會改變;常數 (Constants) 不會。
函式 (Functions) 回傳值;程序 (Procedures) 不回傳值。
LMC 使用助憶碼如 ADD、SUB、STA、LDA 來代表低階指令。
分支 (Branching) 在 LMC 中(BRA、BRZ、BRP)是我們在組合語言中實現 IF 陳述式和迴圈的方式。