前言
利用選擇控制結構,程式設計者可以改變程式運行的順序,決定特定程式碼區塊是否要執行。本文介紹 Pascal 中可用的選擇控制結構。
if
if
的使用方式
if
是 Pascal 的通用選擇性控制結構。以下是 if
的 Pascal 虛擬碼:
if condition then
(* Run code here if condition is true. *)
只有在 condition
為真時,才會執行指令。
我們可以在原有的 if
敘述選擇性地加上 else
敘述,形成二元敘述。如以下 Pascal 虛擬碼:
if condition then
(* Run code here if condition is true. *)
else
(* Run code here if condition is not true. *)
除了前述的二元敘述外,還可以選擇性地加上 else if
敘述,形成多元敘述。如以下 Pascal 虛擬碼:
if condition_a then
(* Run code here if condition_a is true. *)
else if condition_b then
(* Run code here if condition_b is true. *)
else
(* Run code here if neither condition_a nor condition_b is true. *)
由於 else
敘述是選擇性的,所以以下 Pascal 虛擬碼也是可行的:
if condition_a then
(* Run code here if condition_a is true. *)
else if condition_b then
(* Run code here if condition_b is true. *)
if
敘述尾端的分號
如果指令只有單行時,直接撰寫該指令即可。如下例:
if x > 0 then
WriteLn('x is positive');
但指令有多行時,則要放在區塊內。如下例:
if x > y then
begin
max := x;
WriteLn('max is ', x);
end;
在具有多重分支的 if
敘述中,位於中間的分支的最後一行敘述不加分號,但最後一個分支的最後一行敘述會加分號。如下例:
if x mod 2 = 0 then
WriteLn(x, ' is even')
else
WriteLn(x, ' is odd');
如果讀者覺得 if
敘述的分號規則不易理解的話,有一個取巧的方式,就是在每個 if
敘述中一律使用區塊,不論該敘述具有單行指令或多行指令。參考以下片段:
if x mod 2 = 0 then
begin
WriteLn(x, ' is even');
end
else
begin
WriteLn(x, ' is odd');
end;
由於我們使用了區塊,只要在第一個區塊尾端略去分號即可。雖然程式碼會變長,這樣做可讓撰碼的過程變簡單。
實際範例
我們已經看了不少 Pascal 片段,現在來看一個完整的 Pascal 範例程式:
program main;
var
n : integer;
begin
randomize;
n := random(2+1) - 1;
if n > 0 then
writeLn('positive')
else if n < 0 then
writeLn('negative')
else
writeLn('zero')
end.
在此範例中,我們建立了隨機整數型態變數 n
,該變數可能的值為 1
、0
、-1
。此程式會根據 n
的值印出不同的訊息。由於 n
的值會變動,每次印出的訊息可能相異。
case
case
的使用方式
case
敘述只能用於定值,寫起來會比 if
敘述簡單。以下是 case
敘述的 Pascal 虛擬碼:
case value of
a:
(* Run code here if value is a *)
b, c:
(* Run code here if value is either b or c. *)
else
(* Run code here if value is otherwise. *)
end;
當 value
等於 a
時,會執行 a
敘述的區塊。
當 value
等於 b
或 c
時,會執行 b
敘述的區塊。Pascal 的 case
敘述沒有 C 語言的 switch
敘述的直落 (fallthrough) 問題。
當 value
不符合前述值時,會執行 else
敘述的區塊。同樣地,else
區塊是選擇性的。
實際範例
在看完虛擬碼後,我們來看實際的範例程式:
program main;
uses
SysUtils;
var
d : integer;
begin
d := DayOfWeek(Date());
case d-1 of
0, 6:
writeLn('Weekend');
3:
writeLn('Hump day');
5:
writeLn('Thanks God. It''s Friday');
else
writeLn('Week');
end;
end.
該範例程式先以 Date()
函式取得日期物件,再以 DayOfWeek()
函式取得日期 (day of week)。日期的資料型態是整數,由 1
至 7
,從星期日開始計算,至星期六結束。
從 1
開始計算的話,代表星期一的數字為 2
,在撰碼時較不自然。故我們將取得的日期減 1
後用 case
敘述判斷執行該程式時的日期,根據日期回饋訊息到終端機。