Tcl – プログラムの命令を条件により変える -条件分岐 –

プログラムの命令が実行される順番には、順次構造選択構造(条件分岐)反復構造(繰り返し)の3つの基本的な制御構造があります。

Tclでは、この制御構造もTclコマンドで実装されています。

この記事では、選択構造(条件分岐)にあたるifコマンドについて説明します。

ifコマンド

ifコマンドは条件によって処理を分岐します。
条件式の評価はifコマンド内部でexprコマンドを呼び出して評価しています。

[書式]

if expr1 ?then? body1 elseif expr2 ?then? body2  elseif ... ?else? ?bodyN?

ifコマンドの書式は以下のように3つのパターンがあります。

if 条件 本体
if 条件 本体1 else 本体2
if 条件 本体1 elseif 条件2 本体2…else 本体N

パターン1:if 条件 本体

if 条件 本体

条件を評価し、その結果が真(0以外)の場合、本体を実行します。偽(0)の場合は本体を実行しません。

[サンプル:odd.tcl] 奇数の判定

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
puts -nonewline stdout "数字を入力してください:" flush stdout
set num [gets stdin]
if {$num % 2} {
puts "入力した数字は奇数です。" exit } puts "入力した数字は奇数以外です。"

[実行例]

$ ./odd.tcl
数字を入力してください:23
入力した数字は奇数です。
$ ./odd.tcl 数字を入力してください:24 入力した数字は奇数以外です。

[説明]

「%」演算子は剰余(ジョウヨ)を求めます。剰余とは、割り算で割り切れなかった余りです。

a % b はaをbで割った余りを返します。

「$num % 2」は変数numが奇数であれば、必ず余りが発生します。よって、結果が真(0以外)為、本体が実行されます。偶数であれば2で割切れるので、余りが0(結果が偽)となり、本体は実行されません。

exitコマンドは、プログラムを終了します。

入力した数字が奇数の場合、奇数判定後にプログラムを終了させる必要があります。exitコマンドを忘れると、次のコマンドも実行するので、以下のような出力結果になります。

[exitコマンドを忘れた時の結果]

$ ./odd.tcl
数字を入力してください:23
入力した数字は奇数です。
入力した数字は奇数以外です。

パターン2:if 条件 本体1 else 本体2

if 条件 本体1 else 本体2

条件を評価し、その結果が真(0以外)の場合、本体1を実行します。偽(0)の場合は本体2を実行します。

[サンプル:odd2.tcl] 奇数の判定

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
puts -nonewline stdout "数字を入力してください:" flush stdout
set num [gets stdin]
if {$num % 2} { puts "入力した数字は奇数です。" } else { puts "入力した数字は奇数以外です。" }

[実行例]

$ ./odd.tcl
数字を入力してください:23
入力した数字は奇数です。

$ ./odd.tcl 数字を入力してください:24 入力した数字は奇数以外です。

[説明]

パターン2の書式は条件により本体1または本体2のどちらか1つが実行されます。

パターン3:if 条件 本体1 elseif 条件2 本体2…else 本体N

if 条件 本体1 elseif 条件2 本体2…else 本体N

条件1を評価し、その結果が真(0以外)の場合、本体1を実行します。

偽(0)の場合は条件2を評価し、その結果が真(0以外)の場合、本体2を実行します。

以降、条件式があれば、繰り返し評価します。いずれの条件にも合わない場合は、本体Nを実行します。

[サンプル:odd_even.tcl] 奇数と偶数とゼロの判定

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

puts -nonewline stdout "数字を入力してください:" flush stdout

set num [gets stdin]
if {$num == 0} { puts "入力した数字はゼロです。" } elseif {$num % 2} { puts "入力した数字は奇数です。" } else { puts "入力した数字は偶数です。" }

[実行例]

$ ./odd_even.tcl
数字を入力してください:0
入力した数字はゼロです。

$ ./odd_even.tcl 数字を入力してください:23 入力した数字は奇数です。
$ ./odd_even.tcl 数字を入力してください:24 入力した数字は偶数です。

[説明]

odd_even.tclは、ゼロとゼロ以外の奇数と偶数の3つを判定する為に3分岐します。

メモ

多分岐する場合のifコマンドの使い方を説明する為に、ゼロとゼロ以外の奇数と偶数の判定を例に使いましたが、数学的観点で見るとゼロも偶数です。

[参考]
https://ja.wikipedia.org/wiki/偶数
https://ja.wikipedia.org/wiki/ゼロの偶奇性

パターン3の書式は、elseifで任意の数の条件節をつなげることができます。

   } elseif {条件1} {
        コマンド・・・
    } elseif {条件2} {
        コマンド・・・
    }
       ・
       ・
       ・
    } elseif {条件n} {
        コマンド・・・
    } else {
        コマンド・・・
    }

その他の制御構造に関連するコマンドは、必要に応じて以下の記事を参考にしてください。

コメント

タイトルとURLをコピーしました