input
関数の動作についてif
文if-else
文
$num1 = input("1つめの数字を入力して下さい。","0");↓ |
7.1 input 関数の動作について
|
message input("","1");↓ |
input
関数が返す文字列が
そのままメッセージボックスに表示されます。
ではエディットボックスに何か文字が入力されている状態で
[キャンセル] ボタンを押してみましょう。
すると、メッセージボックスには
何も文字が表示されていないことが分かります。
この結果から分かるように(*1)、
input
関数は
[キャンセル] ボタンが押された場合は
(エディットボックスに何かが入力されていても)
""
(空文字列)を返します。input
関数が返す文字列
($num1
, $num2
)が
""
(空文字列)に等しいかそうでないか
(*1) |
細かいツッコミですが(^^;、
このままだと何も文字が返ってこなかったのか、
空白文字が返ってきたのか区別がつきませんね(^^;。 (→演習問題) |
(*2) |
またまた(^^;細かいツッコミですが、
これだけでは エディットボックスに何も入力していない状態で
[OK] ボタンを押した場合 と区別ができていません。 なお、この2つのケースは関数を実行した後の result キーワードの値を調べれば区別できます。 |
7.2 if 文
|
if (条件)
条件が成り立つ場合に実行する処理
|
if
という単語の後に、
丸括弧で条件を括ったものを書き、
その後に条件が成り立つ場合に実行したい処理を書きます。
今「条件」とか「処理」とかいった言葉で表現した部分には
実際には式やコマンドが入りますが、
それらの具体的な例を以下で紹介します。$num1
($num2
)
に入っている文字列が ""
に等しければマクロを終了する」
を考えてみましょう。endmacro
コマンドを使います。
このコマンドを使えばマクロ中のどこででも処理を中止することができます。$num1
($num2
)
に入っている文字列が ""
に等しい」ですが、
これを表すためには(文字列に対する)等価演算子「==」を使います。
この演算子の両辺の文字列が
全角・半角の違いも考慮して一字一句同じ場合に限り、
条件が成り立つものと見なされます。
if ($num1 == "")
endmacro;
|
$msg = input("メッセージを入力して下さい。","");↓ |
$num1 = input("1つめの数字を入力して下さい。","0");↓ |
if ($num1 == "") message "マクロを終了します"; endmacro;
|
if (...)
の後に2つの文を並べて書く事で、
条件が成り立つ場合に2つの文を実行させるつもりなのですが、
実際に実行してみると以下のような動作をしてしまいます。message
コマンドが実行されるかどうか)
に関わらず、
endmacro
コマンドが実行されているようです??
この予想が正しいことは、
上のマクロは以下のように書いても同じ、
ということを見れば明らかでしょう。
if ($num1 == "") message "マクロを終了します";↓ |
if (...)
で、
条件によって実行するかしないかが決まるのは
その直後の1つの文だけなのです。
では、条件が成り立った場合に
複数の文を実行することはできないのでしょうか?"{"
と "}"
で囲みます。
if ($num1 == "") { message "マクロを終了します"; endmacro; }
|
if ($num1 == "") {↓ |
(*1) | この空白や改行の位置に関しては (本当に(^^;)様々な流儀が存在しますが、 結局の所は自分が読みやすいと思った流儀を使うのが一番です。 |
7.3 if-else 文
|
#sho
, #amari
への代入を
#num2
が0かそうでないかで変える部分にいきましょう。
今度は数値を別の数値(今の場合は0)と比較するわけですが、
この場合も文字列の場合に使った演算子「==」や「!=」が使えます
(同じ記号ですが比較される対象が異なることに注意!)。
最初の例から以下のような書き方がすぐに思い浮かんだでしょうか?
#sho = 0;↓ |
#num2
の値が0なら、
#sho
, #amari
には
最初の2行で代入された値(=0)がそのまま残りますが、
そうでなければ改めて商と余りが代入されます(ブロックの内部)。
if (#num2 != 0)↓ |
// まず共通部分を変数 $msg に代入↓ |
#num2
の値が0かそうでないかで追加する文字列を変える部分は、
よくよく考えると冗長な比較をしていることが分かります。
具体的にはif
文:#num2
が0でなければ
計算結果を $msg に追加する#num2
が0ならば何もしないif
文:#num2
が0ならば
「計算不可能」を $msg に追加する#num2
が0でなければ何もしない#num2
が0でなければ
計算結果を $msg に追加する#num2
が0ならば)
「計算不可能」を $msg に追加する
if (条件)
条件が成り立つ場合に実行する処理 |
// 変数 #num2 が0かそうでないかで $msg に追加する文字列を変える↓ |
$num1 = input("1つめの数字を入力して下さい。","0");↓ |
(*1) |
message コマンド以下4行を
中括弧で囲っていませんが、
これは(長いですが(^^;)1つの文 なので
ブロックにする必要はありません。
|
演習問題 |
input
関数の返す文字列を
メッセージボックスに表示するマクロを、
文字列が空白のみからなるものであっても
見た目にそれとわかるように改良せよ。"["
と "]"
で囲んだものを表示させよ)$str
の中身が ""
でなければ
その文字列を現在のカーソル位置に挿入するマクロ(の一部分)を書け。
$str
の中身が ""
だった場合は、
文字を入力するダイアログを表示して
そこに入力された文字を挿入するようにせよ。
但し、[キャンセル] ボタンが押されるか何も入力されなければ
マクロを終了するようにせよ。