プログラムの命令が実行される順番には、順次構造、選択構造(条件分岐)、反復構造(繰り返し)の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 { コマンド・・・ }
その他の制御構造に関連するコマンドは、必要に応じて以下の記事を参考にしてください。
コメント