單一運算式多分支判斷
若需依據同一個運算式的不同數值執行對應邏輯,case .. of .. end 敘述會非常適合使用。
case SomeValue of
0: DoSomething;
1: DoSomethingElse;
2: begin
IfItsTwoThenDoThis;
AndAlsoDoThis;
end;
3..10: DoSomethingInCaseItsInThisRange;
11, 21, 31: AndDoSomethingForTheseSpecialValues;
else
DoSomethingInCaseOfUnexpectedValue;
end;Code language: JavaScript (javascript)
else 分支為選填,功能等同 C 系列語言 switch 內的 default。
若所有分支皆不匹配且未撰寫 else,則不會執行任何程式碼。
如果你熟悉 C 類語言,拿它和 switch 敘述對照會發現:Pascal 的 case 沒有自動穿透(fall-through),這是 Pascal 刻意設計的優點。你不需要手動加上 break;每次最多只會進入一組 case 分支,執行完直接離開整個 case 結構。
5 種合法匹配寫法
case num of
5: Writeln('等於5'); // 單一數值
1,3,5: Writeln('匹配1、3、5其中任一'); // 多數值以逗號分隔
10..20: Writeln('10到20數值區間'); // 連續數值範圍
'a'..'z': Writeln('小寫英文字母'); // 亦支援字元區間
else
Writeln('無符合的匹配值');
end;Code language: JavaScript (javascript)
多行程式碼分支必須包裹 begin..end
case n of
2: begin
Writeln('分支2');
Writeln('執行多行程式');
end;
end;Code language: JavaScript (javascript)
以下範例可輸入 1–128 的 ASCII 數字,並依輸入數值判斷對應的 ASCII 字元類型。
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program AsciiJudge;
// 封裝程序:直接傳入 0–128 的 ASCII 數值判斷分類
procedure JudgeAsciiCode(code: Integer);
begin
case code of
// 1. 單數值匹配 + 多行 begin end(Enter 換行 ASCII=13)
13: begin
Writeln('======== 特殊換行鍵 ========');
Writeln('ASCII 編碼:13 回車控制字元');
Writeln('============================');
end;
// 2. 多離散數值逗號匹配:0–12、14–31 所有一般控制字元
0,1,2,3,4,5,6,7,8,9,10,11,12,14,15..31:
Writeln('類型:控制字元');
// 3. 區間匹配:數字 0~9 對應 ASCII 48~57
48..57: Writeln('類型:數字 0-9');
// 區間:大寫英文字母 A-Z
65..90: Writeln('類型:大寫英文字母 A-Z');
// 區間:小寫英文字母 a-z
97..122: Writeln('類型:小寫英文字母 a-z');
// 4. else 預設分支 + 多行 begin end(標點符號)
else
begin
Writeln('類型:標點/符號');
Writeln('本次輸入 ASCII 編碼:', code);
end;
end;
end;
var
asciiNum: Integer;
begin
Write('請輸入介於 0~128 的 ASCII 數字:');
ReadLn(asciiNum);
// 限制輸入範圍
if (asciiNum >= 0) and (asciiNum <= 128) then
JudgeAsciiCode(asciiNum)
else
Writeln('輸入超出 0~128 範圍,無效!');
ReadLn;
end.Code language: PHP (php)
關於 ASCII 編碼,讀者可參閱下列文章查詢:ASCII table – Table of ASCII codes, characters and symbols
多值條件判斷(case 敘述)
Previous: 邏輯、關係與位元運算子