位元詩人 [Pascal] 程式設計教學:選擇控制結構 (Selection Control Structure)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

利用選擇控制結構,程式設計者可以改變程式運行的順序,決定特定程式碼區塊是否要執行。本文介紹 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,該變數可能的值為 10-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 等於 bc 時,會執行 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)。日期的資料型態是整數,由 17,從星期日開始計算,至星期六結束。

1 開始計算的話,代表星期一的數字為 2,在撰碼時較不自然。故我們將取得的日期減 1 後用 case 敘述判斷執行該程式時的日期,根據日期回饋訊息到終端機。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。