[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 敘述判斷執行該程式時的日期,根據日期回饋訊息到終端機。

    【分享文章】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤網站】
    Facebook Facebook Twitter Plurk