電腦基本運作:程式語言
電腦的運作,必須靠程式語言來溝通。
程式語言是一種用來與電腦溝通的「演算法」。
所謂「演算法」是指:
由一連串的指令,來告訴電腦如何採取行動。
更精確來說,是一連串指示電腦的動作跟順序的系列安排。
在理解演算法之前,我們先來看看底下這個簡單的遊戲。
遊戲目標:交換黑棋和白棋的位置
遊戲規則一:每個棋子可以滑動至相鄰的空格內。
遊戲規則二:也可跳過相鄰的棋子至下一個空格。
如果這盤棋要由你(妳)來指揮電腦下,
你要如何來下指令呢?
底下這兩群指令,你會選用哪一個?
★2號格白棋移到3號格內
★4號格黑棋跳到2號格內
★白棋移一格
★黑棋跳一格
你(妳)覺得哪群指令比較適合來指揮電腦運作呢?
如果你還不曉得怎麼分,再試試看下面這兩個:
【逃生門緊急使用步驟】
1. 拉開蓋子
2. 將門把推到開啟位置並鬆手
3. 向外把門推開
【飛機洗手間使用規則】
*禁止吸煙
*禁止飲食
*當安全帶警示燈亮起時請勿使用洗手間
比較好的指令是能讓人(或電腦)一步一步的執行動作,
這就是我們上面所提到的「演算法」。
演算法告訴你如何一步一步執行任務,
而不是只是告訴你什麼可以做,什麼不能做。
因此「演算法」是在談論「如何」做,而不是做「什麼」。
人類的語言,常常存在著模擬兩可的狀況,
但電腦的程式語言,則要具體精確,不能有模糊空間。
程式語言基本上可分為:
1. 低階「機器碼(machine code)」和
2. 「高階語言(high-level languages)」。
以這兩種程式語言來說,
電腦真正「看」得懂的,只有機器碼。
機器碼是一種非常簡單的語言,它只使用兩種字母:0 和 1。
因此機器碼中的所有字都是由 0 和 1 組成的序列,
例如,00000100 可能代表一個字,而 10101010 代表的意思就完全不同。
在這裡順便介紹一個概念—位元組(byte)
在電腦普遍使用的初期,電腦每次能處理的位元數,是8位元(bits)。
因此,我們把8位元(bits)合成1個位元組(byte)。
當時的電腦也因而被稱成8位元電腦。
隨後由於電腦中央處理器技術的進步,
慢慢的又發展到16位元,32位元,甚至現在到達64位元的運算單位。
高階程式語言,是一種為了讓人類比較容易理解而設計的語言,
比較接近人類語言的用法。例如:
10 INPUT name '輸入姓名
20 PRINT "Hello," name '輸出 Hello + 姓名
30 FOR i = 1 to 10 '重覆執行10次, i 計數從 1 到 10
40 PRINT i '輸出 i 的值
50 NEXT '執行下一次循環
60 END '結束
或是
void main(void) {
int inv=0; /*計數用變數*/
double sum=0; /*計算總和*/
float Data; /*輸入值存在Data變數*/
do {
printf("輸入實數:"); /*在螢幕上顯示字串*/
scanf("%f", &Data); /*由鍵盤輸入數值*/
sum = sum + Data; /*將輸入值加到sum */
inv = inv+1;
} while(inv < 5); /*若inv小於5,繼續執行*/
printf( "平均值= %f ",sum/5.0); /*印出平均值*/
printf( "\n"); /*換行*/
}
這樣一來,人們在進行程式設計時,可以用較直覺的方式來進行,
但是這些高階語言電腦是看不懂的,
所以必須要透過一個編譯器(Compilers)或直譯器(interpreter),
將高階語言先轉換(翻譯)成低階機器碼,
再由電腦根據機器碼來運作執行程式。
雖然高階語言比起機器碼更人性化,
但在編輯上,仍然可能因拼錯語法或指令,
造成程式執行的錯誤。
因此,最近又有積木式的程式語言發展出來,
像我們六年級所學的Scratch 3.0 及 AppInventor II,就屬於這一類。
積木式的程式語言,基本上都可以轉換成高階語言,
一樣藉由編譯器,再轉為機器碼。
一個完整的演算法(或稱程式),
其實就是一組用來完成某件工作的有程序和指令,
也因此它涵蓋了以下兩件事:
1. 必須被執行的動作方式
2. 動作必須要遵循的順序
任何演算法都可以用這三種程序寫出來:
順序(Sequence)、
選擇(Selection)、
迭代(Iteration)。
一、順序:包含一連串先後順序動作,例如:
【緊急逃生門開啟】
1. 拉開蓋子
2. 推槓桿打開艙門
3. 將門往外推
底下有個著名的遊戲—農夫過河,也能來體驗一下順序的重要性。
有個農夫帶著心愛的狐狸,去市場買了一隻活雞和一條玉米。
回家時必須搭乘小竹筏渡河。
小竹筏很小,最多只夠讓農夫和他所帶的一項物品或動物乘坐。
而且只有農夫才能控制竹筏航行。
但農夫碰到了一些問題:
1.雞會找機會偷吃玉米,狐狸也伺機想吃雞。
2.如果農夫與狐狸和雞同時在場(同在岸邊或竹筏上),動物就不敢造次。
3.如果農夫遠離了動物(農夫和動物分別在岸邊或竹筏上),有機會時,
雞肯定會把玉米吃掉,而狐狸也會吃雞。
那麼,農夫要如何安排渡河,才能讓這三項都完整無缺的渡河到家呢?
這個問題,先留給同學們來嘗試解題,先不公佈答案。
同學們可以把解題的步驟與程序寫下來,
看看你總共用了多少個步驟,來幫農夫解決這個難題。
你會發現動作的選項與順序,是很重要的。
【疫情警戒三級的停、復課選擇】
如果 疫情警戒降為二級 (條件)
那麼 學校就復課,學生回校上課。 (條件為真)
否則 繼續停課,學生進行線上學習。 (條件為假)
在選擇的條件裡,有時不只有單一條件,
這時我們就會用到邏輯判斷 and(且) 、or(或)來作真假的運算,
例如:
【疫情警戒三級時違規罰則】
如果 人在街上 且 未戴口罩 (需兩個條件均符合才成立)
那麼 依傳染病防治法,裁罰3千元以上1萬5千元以下罰鍰。
否則 未違規,不予裁罰。
如果 室內群聚超過5人 或 室外群聚超過10人 (兩個條件只要一個符合即成立)
那麼 依傳染病防治法,處新台幣6萬元以上、30萬元以下罰鍰。
否則 未違規,不予裁罰。
三、迭代:在程式中,重複性的工作是非常重要的一環,
「重複」這檔事,又就叫作迴圈(loop)或遞迴。
當我們下達「重複」指令時,須設定「終止條件」,
否則重複執行的程式會永不停止。
底下以兩個例子,來說明「重複」語法。
例如:
【撲克牌重複抽牌遊戲一】
重複抽牌直到抽中紅心A為止
如果 抽中紅心A
那麼 停止抽牌。
否則 繼續抽牌。
【撲克牌重複抽牌遊戲二】
重複抽10張撲克牌
將 每次抽中的點數加總。
第一種狀況,可稱為條件控制迴圈(Sentinel-controlled loops),
第二種狀況,可稱為計數控制迴圈(Counter-controlled loops)。
條件控制迴圈可視實際執行的情況,決定重複執行的次數;
而計數控制迴圈,則事先就已律定好重複執行的次數。
至於要採用哪一種迴圈,則取決於重複執行的需要。
以上是我們簡單介紹有關程式設計的基本概念,
實際上,真正程式設計所需的知能,還不止上面這些。
有興趣的小朋友,可以利用畢業後的空閒時間,
多利用 Scratch 3.0 或 AppInventor II 來進行練習,
對你將來的各項學習,都會很有幫助的。
隨堂測驗網址