誰でもプログラマ(WSH編)(その8-応用編2 計算機で計算機)

 前回は、[はい][いいえ]の分岐によって、処理がどんどん分かれていく例を見てみました。
今回は、以前に作った計算機を条件分岐をつかって便利にしてみましょう。

毎度のことですがメモ帳でプログラムを記述します。今回のプログラムも前回と同じくらいの長さです。


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でもやってもらいましょうか。
ダブルクリックして実行すると、
1-8-1
んじゃ、12と入力して、
1-8-2
OKを押します。
1-8-3
と、聞いてくるので、-と答えます。
1-8-4
すると、
1-8-5
ここで、8と入力して、
1-8-6
OKを押すと、
1-8-7
無事に、12-8の答え、4が表示されました。

んじゃ同様に足し算も試してみましょう。
12+8でもやってみましょうか。
ダブルクリックして、12を入力して、
1-8-2
+を入力して、
1-8-8
8と入力して、
1-8-6
答えが出ます。
1-8-9
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

名前を聞かれるので、名前を入力して、
1-8-10
挨拶してくれます。
1-8-11
プログラムを見てみると、入力された名前は、nameという変数に割り当てられています。
これがMsgBoxの後ろのname+postというところで、postという変数に割り当てられている、”さん、こんにちは”という文字に張り付いて表示されているわけです。
うーーーん。確かにこうゆうときは、+は、文字をくっつけるって意味でいいんだけど。。。。

先の計算機のプログラムの場合は、


MsgBox x+y

この行を


MsgBox CDbl( x)+CDbl( y)

というように書き換えます。
CDblというのも関数です。なんでもかんでも、数字に変換する関数です。この関数を呼び出すと、括弧でくくった中身が数字に変換されます。こうやって強制的に数字に変換してしまえば大丈夫です。

これで正しく、動きます。試してみてください。ちゃんと、12+8は20と答えてくれましたか?

このように、プログラムが予想外の動きをすることを、バグと言います。日本語に訳すと虫です。虫が食ってたんです。
これは、昔のコンピュータで、予想外の動きをしていたときに、中を調べたら、蛾が挟まってた、ってことからコンピュータが予想外の動きをするときに、虫がいる。。。というようになったんです。

プログラマは、プログラムを作るときに、予想外の動きが起こらないように、いろんな状況を想像します。こんな状況もありえるんじゃないか。あんな状況もありえるんじゃないかと。
んでも、どうやっても、実際に試すまで、想像できないことっていっぱいあるんです。やってみて、ありゃ、こんなこともありえるんだ。。。ってことがよくあります。そのために、プログラマは、プログラムを作ると、テストを必ずやります。テストが十分じゃないってことは、いろんな状況を試してないってことなので、あとで問題がおこります。自分が使っているときは大丈夫でも、他人が使い始めると、思いもよらないことをやってくれるんです。そうゆう状況を想定しながら、いろいろテストをやっていきます。
実際、プログラムを書く作業というのは、プログラムができあがる過程の中で20%くらいしか時間がかかりません。どんなプログラムを作るのかを想像するのに、30%くらいの時間を費やします。また50%くらいの時間をテストとその後の修正に費やします。プログラマというのは、実は、プログラムを作るのが仕事なんではなくて、プログラムを直すのが仕事なんですねぇ。
実は、本日のプログラムだけではなく、以前のプログラムにもバグがいっぱいいます。
以前、0で割るという計算をやらせて、コンピュータに怒られました。これも、ひとつのバグですね。予想外の動きをしたわけですから。
今回の計算機も、0で割ると怒られます。また、以前試したように、数字の代わりに、’こんにちは’とか文字を入れても怒られたりするでしょう。
本当は、それらの状況が発生しても、コンピュータに怒られるのではなく、[そんな文字いれちゃだめよーん]ってメッセージを出してあげなくては、親切な製品とはいえません。
一般の人が、製品を使っていて、コンピュータに怒られたら、このプログラムは使いにくい。不親切だ。ってことになるでしょう。

これまで出てきたプログラムにも、いっぱいいっぱいバグがいます。どんなバグがいるのか、いろいろ試してみてください。また、そのバグを回避するにはどうしたらいいのかを考えてみましょう。

今日のまとめ

  • コンピュータって頭がいいのか、悪いのかよくわからない。
  • 人間もコンピュータも、僕の思いもよらない行動を取るらしい。

 

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください