複数値条件判定(case文)

単一式による複数分岐判定

同じ式の値に応じて異なる処理を実行したい場合、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 を記述する必要はなく、実行される分岐は最大で1つだけで、処理完了後直ちに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(改行キー 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文)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です