前回は、[はい][いいえ]の分岐によって、処理がどんどん分かれていく例を見てみました。
今回は、以前に作った計算機を条件分岐をつかって便利にしてみましょう。
毎度のことですがメモ帳でプログラムを記述します。今回のプログラムも前回と同じくらいの長さです。
Dim x, y, op
x = InputBox("Xの値を入力してください")
op = InputBox("+.足し算 -.引き算 *.掛け算 /.割り算 どれにしますか?記号を入力してください")
y = InputBox("Yの値を入力してください")
If op = "+" Then
MsgBox x+y
Else
If op = "-" Then
MsgBox x-y
Else
If op = "*" Then
MsgBox x*y
Else
If op = "/" Then
MsgBox x/y
Else
MsgBox "わかりません"
End If
End If
End If
End If
間違いなく入力されたら、calc.vbsというファイル名で保存しましょう。
このアプリケーションは、電卓です。
実際に試してみましょう。
んじゃ、簡単なところから、12-8でもやってもらいましょうか。
ダブルクリックして実行すると、
んじゃ、12と入力して、
OKを押します。
と、聞いてくるので、-と答えます。
すると、
ここで、8と入力して、
OKを押すと、
無事に、12-8の答え、4が表示されました。
んじゃ同様に足し算も試してみましょう。
12+8でもやってみましょうか。
ダブルクリックして、12を入力して、
+を入力して、
8と入力して、
答えが出ます。
128と答えが出ました。って、おいおい。まちがってるやん。
12+8=128じゃないです。20です。128って。。。パソコンが計算間違っています。おーーーーい。
なにが起こったんでしょう。
プログラムの仕組みは前回とほとんど同じです。一行づつ追いかけたら、すぐに理解できると思います。
Dim x, y, op
x = InputBox("Xの値を入力してください")
op = InputBox("+.足し算 -.引き算 *.掛け算 /.割り算 どれにしますか?記号を入力してください")
y = InputBox("Yの値を入力してください")
ここは、x,y,opという変数を使いますよ。という宣言と、それぞれの値を、InputBox関数をつかって取り出しているところです。特に問題はありません。
If op = "+" Then
MsgBox x+y
Else
'だーーーっと処理がいっぱい
End If
ここも前回と同じパターンですね。
もし、opが+だったら、
MsgBox x+y
んじゃなかったら、
(だーっと処理がいっぱい)
ってことです。
同様に、-だったら、*だったら、/だったら、と処理が続いています。
どこにも問題はなさそうです。
なにが起こったんでしょう。。。。
実は、+には二つの意味があります。
算数の足し算
という意味と、
文字をくっつける
という意味です。
文字をくっつけるというのは、
ABC+DEFは、ABCDEF ってなるってことです。
言われてみれば、12+8が128になったのは、文字をくっつける。。。。ってされてしまったようです。
うーん。頭がいいというか、悪いというか。。。。
なぜ、こんなことになってしまったのでしょう。
実は、InputBoxに問題があります。
このInputBoxってのは数字を入力するだけでなく、文字も入力できます。文字と数字との区別が無いんです。
ですから、文字だと思ってしまったわけですね。だから、文字をくっつけるという処理がなされてしまったわけです。
うーーん。頭悪すぎる。。。
以下のプログラムを実行してみてください。メモ帳で打ち込んで、name.vbsとでも保存して実行してみてください。
Dim name,post
name = InputBox("あなたの名前を入れてください")
post = "さん、こんにちは"
MsgBox name+post
名前を聞かれるので、名前を入力して、
挨拶してくれます。
プログラムを見てみると、入力された名前は、nameという変数に割り当てられています。
これがMsgBoxの後ろのname+postというところで、postという変数に割り当てられている、”さん、こんにちは”という文字に張り付いて表示されているわけです。
うーーーん。確かにこうゆうときは、+は、文字をくっつけるって意味でいいんだけど。。。。
先の計算機のプログラムの場合は、
MsgBox x+y
この行を
MsgBox CDbl( x)+CDbl( y)
というように書き換えます。
CDblというのも関数です。なんでもかんでも、数字に変換する関数です。この関数を呼び出すと、括弧でくくった中身が数字に変換されます。こうやって強制的に数字に変換してしまえば大丈夫です。
これで正しく、動きます。試してみてください。ちゃんと、12+8は20と答えてくれましたか?
このように、プログラムが予想外の動きをすることを、バグと言います。日本語に訳すと虫です。虫が食ってたんです。
これは、昔のコンピュータで、予想外の動きをしていたときに、中を調べたら、蛾が挟まってた、ってことからコンピュータが予想外の動きをするときに、虫がいる。。。というようになったんです。
プログラマは、プログラムを作るときに、予想外の動きが起こらないように、いろんな状況を想像します。こんな状況もありえるんじゃないか。あんな状況もありえるんじゃないかと。
んでも、どうやっても、実際に試すまで、想像できないことっていっぱいあるんです。やってみて、ありゃ、こんなこともありえるんだ。。。ってことがよくあります。そのために、プログラマは、プログラムを作ると、テストを必ずやります。テストが十分じゃないってことは、いろんな状況を試してないってことなので、あとで問題がおこります。自分が使っているときは大丈夫でも、他人が使い始めると、思いもよらないことをやってくれるんです。そうゆう状況を想定しながら、いろいろテストをやっていきます。
実際、プログラムを書く作業というのは、プログラムができあがる過程の中で20%くらいしか時間がかかりません。どんなプログラムを作るのかを想像するのに、30%くらいの時間を費やします。また50%くらいの時間をテストとその後の修正に費やします。プログラマというのは、実は、プログラムを作るのが仕事なんではなくて、プログラムを直すのが仕事なんですねぇ。
実は、本日のプログラムだけではなく、以前のプログラムにもバグがいっぱいいます。
以前、0で割るという計算をやらせて、コンピュータに怒られました。これも、ひとつのバグですね。予想外の動きをしたわけですから。
今回の計算機も、0で割ると怒られます。また、以前試したように、数字の代わりに、’こんにちは’とか文字を入れても怒られたりするでしょう。
本当は、それらの状況が発生しても、コンピュータに怒られるのではなく、[そんな文字いれちゃだめよーん]ってメッセージを出してあげなくては、親切な製品とはいえません。
一般の人が、製品を使っていて、コンピュータに怒られたら、このプログラムは使いにくい。不親切だ。ってことになるでしょう。
これまで出てきたプログラムにも、いっぱいいっぱいバグがいます。どんなバグがいるのか、いろいろ試してみてください。また、そのバグを回避するにはどうしたらいいのかを考えてみましょう。
今日のまとめ
- コンピュータって頭がいいのか、悪いのかよくわからない。
- 人間もコンピュータも、僕の思いもよらない行動を取るらしい。