ど素人でもできた!Visual Basic6.0で電卓を作る

プログラミング初心者のピオウネです。

電卓を作ってみます!

文法と使い方を知らない人は、

こちらの記事を読んでからの方が理解しやすいと思います^^

プログラミングの作成手順

一般的なプログラミング全体の開発手順は次のように進めていきます

  1. 企画:何を作るのかを決める
  2. 分析:企画内容を分析し、何が必要になるかを考える
  3. 設計:分析した内容をもとに企画を細分化する
  4. プログラムを書く:設計内容をプログラミング言語に書き換える
  5. デバッグ:分析・設計・プログラムの間違いを見つけて修正する

今回は電卓を例に、作成手順を考えてみましょう。

企画

大まかな機能を決めます。

何ができて、何ができないのかも決めましょう。

できることできないこと
+、−、×、÷√(ルート)や2乗など
小数点以下の計算表示桁数を統一する(計算結果をそのまま表示)
間違えた数値を消すメモリ機能
間違えた演算子を修正する

分析

企画を達成するために必要なものを考えます。

  • 数値を覚えておく変数が2つ必要
  • 前の演算子を覚えておく必要がある
  • 直前に押されたボタンの種類を覚えておく必要がある
  • ボタンの種類は5つ(数値、演算子、=、C、CE)

設計

分析した内容を変数、定数、プロシージャに分けてみましょう。

変数
  • 1つ目(演算子の前)の数値を覚えておく変数
  • 2つ目(演算子の後)の数値を覚えておく変数
  • 演算子を覚えておく変数
  • 直前に押されたキーの種類を覚えておく変数
定数
  • 演算子の種類を表す定数
  • 直前に押されたキーの種類を表す定数
プロシージャ
  • 数値が押された時の処理→数値を押す前のキーが数値か演算子どちらかによって処理を変える
  • 演算子が押された時の処理
  • =が押された時の処理→2つの数値を演算子で計算した数値を表示する
  • C(クリアキー)が押された時の処理→すべての変数を消す
  • CE(クリアエントリーキー)が押された時の処理→2つ目の変数だけを消す

プロシージャの考え方

以下のような電卓の動きを再現する方法を考えます

3+2=5

演算子を押す前の数字と後の数字を演算子に基づいて計算する

12+45=57

数値を押している間(演算子を押すまで)は、つの数値を入力することになる

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(ボタン上に表示される名前)とオブジェクト名は以下のように設定しましょう。

コマンドボタン 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

プロシージャ③Cが押された時の処理

Private Sub OnClear() OnClearというプロシージャを定義する

    dblPrevNumber = 0 1つ目の数値を0にする

    intPrevOperation = OP_NO 前に押されていた演算子を消す

    intLastKey = KEY_OTHER 前に押されていたキーを消す

    Call OnClearEntry CEの処理をする

End Sub

プロシージャ④CEが押された時の処理

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

いかがだったでしょうか・・

プログラミングを作るときは、

細かく細かく、やることを区切って

プログラミングを書いて

試して

直して

書いて

試して

の繰り返しをしていくそうです。

最初が電卓だといきなりながーーーーいコードを書くことになるので

もしミスがあった時に直すのが大変になってしまいますね・・

でも現場で使われているプログラミングは

こんな長さではないそうですよ。

もっと、もーーーっと長いみたいです。

ともに精進していきましょう><

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA