プログラミング初心者のピオウネです。
電卓を作ってみます!
文法と使い方を知らない人は、
こちらの記事を読んでからの方が理解しやすいと思います^^
プログラミングの作成手順

一般的なプログラミング全体の開発手順は次のように進めていきます
- 企画:何を作るのかを決める
- 分析:企画内容を分析し、何が必要になるかを考える
- 設計:分析した内容をもとに企画を細分化する
- プログラムを書く:設計内容をプログラミング言語に書き換える
- デバッグ:分析・設計・プログラムの間違いを見つけて修正する
今回は電卓を例に、作成手順を考えてみましょう。
大まかな機能を決めます。
何ができて、何ができないのかも決めましょう。
できること | できないこと |
---|---|
+、−、×、÷ | √(ルート)や2乗など |
小数点以下の計算 | 表示桁数を統一する(計算結果をそのまま表示) |
間違えた数値を消す | メモリ機能 |
間違えた演算子を修正する |
企画を達成するために必要なものを考えます。
- 数値を覚えておく変数が2つ必要
- 前の演算子を覚えておく必要がある
- 直前に押されたボタンの種類を覚えておく必要がある
- ボタンの種類は5つ(数値、演算子、=、C、CE)
分析した内容を変数、定数、プロシージャに分けてみましょう。
- 1つ目(演算子の前)の数値を覚えておく変数
- 2つ目(演算子の後)の数値を覚えておく変数
- 演算子を覚えておく変数
- 直前に押されたキーの種類を覚えておく変数
- 演算子の種類を表す定数
- 直前に押されたキーの種類を表す定数
- 数値が押された時の処理→数値を押す前のキーが数値か演算子どちらかによって処理を変える
- 演算子が押された時の処理
- =が押された時の処理→2つの数値を演算子で計算した数値を表示する
- C(クリアキー)が押された時の処理→すべての変数を消す
- CE(クリアエントリーキー)が押された時の処理→2つ目の変数だけを消す
プロシージャの考え方
以下のような電卓の動きを再現する方法を考えます
3+2=5
演算子を押す前の数字と後の数字を演算子に基づいて計算する
12+45=57
数値を押している間(演算子を押すまで)は、1つの数値を入力することになる
3*-2=1
演算子が2回続けて押された場合、1回目の演算子は無かったことになる
3+5CE7=10
CEを押す直前の数値は無かったことになる
2*3+ 6
2*3+5=11
イコールを押す前でも、演算子が押された段階で数値は計算される
1+2=3
1+2=+6=9
演算子の前がイコールの場合は、イコールまでの計算結果を1つの数値とする
1+2=3
1+2+=6
1+2+=+=12
1+2+. の時点で、1つ目の数値は3になっていてその次にイコールが来た場合は前の計算結果が2つ目の数値になる
1+2+=+. の時点で、1つ目の数値が6、イコールを押すと2つ目の数値が6になる
→イコールの前が演算子の時は前の計算結果を2つ目の数値にする
1+2=3
1+2==5
1+2===7
1+2= の時点で、1つ目の数値は3。イコールが2回続いたときは、前の演算子と2つ目の数値が適用される
プロシージャの演算子が押された時の処理について3つの条件によって処理を切り替えます
①記憶している演算子がない場合
記憶している演算子がなくて、
演算子を押された時は1つ目の数値が入力し終わったことになります。
現在の数値を1つ目の数値の変数にコピーします。
②記憶している演算子があって直前のキーが数値の場合
記憶している2つの数値を記憶している演算子で計算します。
その計算結果を1つ目の数値にコピーし、電卓上に数値を表示します。
演算子を記憶しておく変数に、新たに入力された演算子を記憶します。
③直前のキーが演算子の場合
直前のキー入力を間違いとして、新たに入力された演算子を記憶します。
VBを起動して、プログラムを書いてみましょう。
まずは、電卓のデザインから作ります。
デザインする

VBを起動し、標準EXEを選択します。
まずはフォームのプロパティを変更しましょう。
オブジェクト名:Form1
Caption:電卓
つづいて、電卓の文字盤を作ります。
ツールボックスでラベルを選び、フォーム上でドラッグします。
ラベルのプロパティは以下のように変更します。
オブジェクト名:Label1
Alignment:1-右揃え
Backcolor:好きな色に
BorderStyle:1-実線
Caption:0
次にコマンドボタンを配置します。
各コマンドのCaption(ボタン上に表示される名前)とオブジェクト名は以下のように設定しましょう。
0:cmd0
1:cmd1
2:cmd2
3:cmd3
4:cmd4
5:cmd5
6:cmd6
7:cmd7
8:cmd8
9:cmd9
.:cmdPeriod
=:cmdEqual
+:cmdPlus
-:cmdMinus
*:cmdMultipie
/:cmdDivide
C:cmdC
CE:cmdCE
以上で電卓のデザインが完成しました!
プログラムを書く
プロジェクトエクスプローラでForm1を選択し、コードを表示します。
Const OP_NO As Integer = 0 Integerは整数の型です。
Const OP_EQUAL As Integer = 1
Const OP_PLUS As Integer = 2
Const OP_MINUS As Integer = 3
Const OP_MULTIPLE As Integer = 4
Const OP_DIVIDE As Integer = 5
Const OP_ERROR As Integer = -1
Const KEY_NUMBER As Integer = 1
Const KEY_EQUAL As Integer = 2
Const KEY_OTHER As Integer = 0
Dim dblPrevNumber As Double 前の数字を意味します。
Doubleは小数点以下を含む数字を示す型です。 Doubleをdblと略しています。 Previous(前の)をPrevと略しています。
Dim dblCurrentNumber As Double Current(現在)の数字を意味します。
Dim intPrevOperation As Integer 前のOperation(操作)を意味します。
Dim intLastKey As Integer 最後のキーを意味します。
Private Sub OnNumber(intKey As Integer) OnNumber(intKey As Integer)というプロシージャを定義する
0〜9の数字キーを押した場合の処理をまとめて表記します!
If intPrevOperation = OP_ERROR Then Exit Sub エラーの場合は処理を終える
If intLastKey <> KEY_NUMBER Then 直前のキーが数字ではなく演算子の場合 <>:等しくない
lblNumber.Caption = “0” 電卓の表示(lblNumber.Caption)を0にする
End If
If intKey = -1 Then intKeyに-1が入っている場合
lblNumber.Caption = lblNumber.Caption & “.” 電卓の表示(lblNumber.Caption)をこれまでの電卓の表示+小数点.
Else
If lblNumber.Caption = “0” Then 電卓の表示(lblNumber.Caption)が0の場合
lblNumber.Caption = CStr(intKey) 今回のキー(intKey)だけを表示する
CStrで数字を文字列に変換することで表示することができる。
Else
lblNumber.Caption = lblNumber.Caption & CStr(intKey) 電卓の表示をこれまでの電卓の表示+今回のキー
End If
End If
dblCurrentNumber = CDbl(lblNumber.Caption) 電卓の表示を数値に変換して、2つ目の数値の変数に代入する
CDblで小数点を含む数字に型を変換する。
intLastKey = KEY_NUMBER 押されたキーが数字キーであることを記憶する
End Sub
Private Sub OnOperation(intOp As Integer) OnOperation(intOp As Integer)というプロシージャを定義する
If intPrevOperation = OP_ERROR Then エラーが発生していないかチェック
Exit Sub エラーがある場合はプロシージャを終わる
End If
If intLastKey = KEY_NUMBER Or intOp = OP_EQUAL Then 前に押されたキーが数値か演算子の場合
Select Case intPrevOperation intPrevOperationが次のような条件の場合処理を分岐する
Case OP_PLUS 演算子+が記憶されていた場合
dblPrevNumber = dblPrevNumber + dblCurrentNumber1つ目の数値と2つ目の数値の変数を合わせたものを1つ目の数値にする
Label1.Caption = CStr(dblPrevNumber) 電卓の表示は1つ目の数値だけにする
Case OP_MINUS 演算子-が記録されていた場合
dblPrevNumber = dblPrevNumber – dblCurrentNumber1つ目の数値から2つ目の数値を引いたものを1つ目の数値にする
Label1.Caption = CStr(dblPrevNumber) 電卓の表示は1つ目の数値だけにする
Case OP_MULTIPLE 演算子×が記憶されていた場合
dblPrevNumber = dblPrevNumber * dblCurrentNumber
Label1.Caption = CStr(dblPrevNumber)
Case OP_DIVIDE 演算子÷が記憶されていた場合
If dblCurrentNumber = 0 Then 2つ目の数値が0の場合
lblNumber.Caption = “E” 電卓の表示はEにする
intPrevOperation = OP_ERROR 1つ目の数値をOP_ERRORとする
Exit Sub
Else
dblPrevNumber = dblPrevNumber / dblCurrentNumber 2つ目の数値が0じゃなければ普通に計算
Label1.Caption = CStr(dblPrevNumber)
End If
End Select
End If
dblPrevNumber = CDbl(lblNumber.Caption) 電卓に表示されている数値を1つ目の数値に代入
Select Case intOp intOpが次のような条件の場合処理を分岐する
Case OP_PLUS 今回演算子+を押された場合
intPrevOperation = OP_PLUS +をintPrevOperationに記憶する
dblCurrentNumber = CDbl(Label1.Caption) 電卓の表示を2つ目の数値に代入する
Case OP_MINUS
intPrevOperation = OP_MINUS −をintPrevOperationに記憶する
dblCurrentNumber = CDbl(Label1.Caption) 電卓の表示を2つ目の数値に代入する
Case OP_MULTIPLE
intPrevOperation = OP_MULTIPLE ×をintPrevOperationに記憶する
dblCurrentNumber = CDbl(Label1.Caption) 電卓の表示を2つ目の数値に代入する
Case OP_DIVIDE
intPrevOperation = OP_DIVIDE ÷をintPrevOperationに記憶する
dblCurrentNumber = CDbl(Label1.Caption) 電卓の表示を2つ目の数値に代入する
End Select
If intOp = OP_EQUAL Then 今回演算子=が押された場合
intLastKey = KEY_EQUAL =を intLastKeyに記憶する
Else それ以外は
intLastKey = KEY_OTHER KEY_OTHERをintLastKeyに記憶する
End If
End Sub
Private Sub OnClear() OnClearというプロシージャを定義する
dblPrevNumber = 0 1つ目の数値を0にする
intPrevOperation = OP_NO 前に押されていた演算子を消す
intLastKey = KEY_OTHER 前に押されていたキーを消す
Call OnClearEntry CEの処理をする
End Sub
Private Sub OnClearEntry() OnClearEntryというプロシージャを定義する
If intPrevOperation = OP_ERROR Then Exit Sub 前に押されていた演算子がエラーの場合はCEの処理を終わる
dblCurrentNumber = 0 2つ目の数値を0にする
Label1.Caption = “0” 電卓の表示を0にする
End Sub
Private Sub cmd0_Click()
Call OnNumber(0)
End Sub
Private Sub cmd1_Click()
Call OnNumber(1)
End Sub
Private Sub cmd2_Click()
Call OnNumber(2)
End Sub
Private Sub cmd3_Click()
Call OnNumber(3)
End Sub
Private Sub cmd4_Click()
Call OnNumber(4)
End Sub
Private Sub cmd5_Click()
Call OnNumber(5)
End Sub
Private Sub cmd6_Click()
Call OnNumber(6)
End Sub
Private Sub cmd7_Click()
Call OnNumber(7)
End Sub
Private Sub cmd8_Click()
Call OnNumber(8)
End Sub
Private Sub cmd9_Click()
Call OnNumber(9)
End Sub
Private Sub cmdC_Click()
Call OnClear
End Sub
Private Sub cmdCE_Click()
Call OnClearEntry
End Sub
Private Sub cmdDivide_Click()
Call OnOperation(OP_DIVIDE)
End Sub
Private Sub cmdEqual_Click()
Call OnOperation(OP_EQUAL)
End Sub
Private Sub cmdMinus_Click()
Call OnOperation(OP_MINUS)
End Sub
Private Sub cmdMultiple_Click()
Call OnOperation(OP_MULTIPLE)
End Sub
Private Sub cmdPeriod_Click()
Call OnNumber(-1)
End Sub
Private Sub cmdPlus_Click()
Call OnOperation(OP_PLUS)
End Sub
Private Sub Form_Load()
Call OnClear
End Sub
プログラムを書き終えたら、確認しましょう。
再生ボタンを押して、電卓を使ってみてください。
お疲れ様でした
初心者にいきなり電卓のプログラミングって・・
結構ハードル高いなーというのがピオウネの感想ですw
いかがだったでしょうか・・
プログラミングを作るときは、
細かく細かく、やることを区切って
プログラミングを書いて
試して
直して
書いて
試して
の繰り返しをしていくそうです。
最初が電卓だといきなりながーーーーいコードを書くことになるので
もしミスがあった時に直すのが大変になってしまいますね・・
でも現場で使われているプログラミングは
こんな長さではないそうですよ。
もっと、もーーーっと長いみたいです。
ともに精進していきましょう><