質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

vbnet 電卓作成について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 11K+

Tomfin555

score 9

元文系プログラミング初心者
プログラミング歴
java2ヶ月、vbnet一週間のものです。
初歩的なことかもしれませんが、
ヒントでも良いので、教えてくだされば
ありがたいです。宜しくお願いします。

前提・実現したいこと

VBNETで電卓を作っています。  
割り算機能を実装している中で分からない事が発生しました。

発生している問題・エラーメッセージ

例えば9/=とすると、ゼロ除算の+∞
が出るようになっているのですが、
これを9/=という事が出来ないようにしたいと思っております。
厳密に言うと、+,-,*,/の後に=を押しても何も起こらない
仕様にしたいと思っているのですが、
どのようにすればよいでしょか。

該当のソースコード

Public Class Form1
'////////// 整数の電卓画面クラス //////////

'----------<< 変数宣言 >>----------
' 今回押されたボタンの数字以外の値(+,=,C)を保存する変数
Private ope As String = "C"

' 今回押されたボタンの値(0~9,+,=,C)を保存する変数
Private beforeIn As String = "C"

' 演算結果を保存する変数
Private ans As Double = 0

' 今回入力された数値を保存する変数
Private num As Long = 0
' 数字1ボタンクリック処理
Private Sub BtnOne_Click(sender As Object, e As EventArgs) Handles Button1.Click

If beforeIn >= "0" And beforeIn <= "9" Then
' 直前の押されたのが数字ボタンのとき
' かつ、8桁未満の数値が入力されているとき
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "1"
End If
Else
' 直前の押されたのが数字以外のボタンのとき
LblAnser.Text = "1"
End If
beforeIn = "1"

End Sub
' 数字2ボタンクリック処理
Private Sub BtnTwo_Click(sender As Object, e As EventArgs) Handles Button2.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "2"
End If
Else
LblAnser.Text = "2"
End If
beforeIn = "2"

End Sub
' 数字3ボタンクリック処理
Private Sub BtnThree_Click(sender As Object, e As EventArgs) Handles Button3.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "3"
End If
Else
LblAnser.Text = "3"
End If
beforeIn = "3"

End Sub
' 数字4ボタンクリック処理
Private Sub BtnFour_Click(sender As Object, e As EventArgs) Handles Button4.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "4"
End If
Else
LblAnser.Text = "4"
End If
beforeIn = "4"

End Sub
' 数字5ボタンクリック処理
Private Sub BtnFive_Click(sender As Object, e As EventArgs) Handles Button5.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "5"
End If
Else
LblAnser.Text = "5"
End If
beforeIn = "5"

End Sub
' 数字6ボタンクリック処理
Private Sub BtnSix_Click(sender As Object, e As EventArgs) Handles Button6.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "6"
End If
Else
LblAnser.Text = "6"
End If
beforeIn = "6"

End Sub
' 数字7ボタンクリック処理
Private Sub BtnSeven_Click(sender As Object, e As EventArgs) Handles Button7.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "7"
End If
Else
LblAnser.Text = "7"
End If
beforeIn = "7"

End Sub
' 数字8ボタンクリック処理
Private Sub BtnEight_Click(sender As Object, e As EventArgs) Handles Button8.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "8"
End If
Else
LblAnser.Text = "8"
End If
beforeIn = "8"

End Sub
' 数字9ボタンクリック処理
Private Sub BtnNine_Click(sender As Object, e As EventArgs) Handles Button9.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "9"
End If
Else
LblAnser.Text = "9"
End If
beforeIn = "9"

End Sub
' 数字0ボタンクリック処理
Private Sub BtnZero_Click(sender As Object, e As EventArgs) Handles BtnZero.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "0"
End If
beforeIn = "0"
Else
LblAnser.Text = "0"
End If
End Sub
' .ボタンクリック処理
Private Sub BtnPoint_Click(sender As Object, e As EventArgs) Handles BtnPoint.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If LblAnser.Text.Length < 8 Then
LblAnser.Text &= "."
End If
beforeIn = "."
Else
LblAnser.Text = "."
End If
End Sub
' +ボタンクリック処理
Private Sub BtnPlus_Click(sender As Object, e As EventArgs) Handles BtnPlus.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If ope = "C" Then
' 最初の入力数値をansに保管
ans = CInt(LblAnser.Text)
Else
' ansに保管されている
' +ボタンクリック前の数値と加算
num = CInt(LblAnser.Text)
ans = ans + num
LblAnser.Text = ans
End If
Else
' 前回クリックが数字以外の時
Select Case ope
Case "C"
' 前回がクリアボタン
ans = CInt(LblAnser.Text)
Case "="
' 前回がイコールボタン
ans = ans + num
Case "+"
num = ans
End Select
End If
beforeIn = "+"
ope = "+"

End Sub
' -ボタンクリック処理
Private Sub BtnMinus_Click(sender As Object, e As EventArgs) Handles BtnMinus.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If ope = "C" Then
' 最初の入力数値をansに保管
ans = CInt(LblAnser.Text)
Else
' ansに保管されている
' -ボタンクリック前の数値と加算
num = CInt(LblAnser.Text)
ans = ans - num
LblAnser.Text = ans
End If
Else
' 前回クリックが数字以外の時
Select Case ope
Case "C"
' 前回がクリアボタン
ans = CInt(LblAnser.Text)
Case "="
' 前回がイコールボタン
ans = ans - num
Case "+", "-"
num = ans
End Select
End If
beforeIn = "-"
ope = "-"

End Sub
' ×ボタンクリック処理
Private Sub BtnMulti_Click(sender As Object, e As EventArgs) Handles BtnMulti.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If ope = "C" Then
' 最初の入力数値をansに保管
ans = CInt(LblAnser.Text)
Else
' ansに保管されている
' ×ボタンクリック前の数値と乗算
num = CInt(LblAnser.Text)
ans = ans * num
LblAnser.Text = ans
End If
Else
' 前回クリックが数字以外の時
Select Case ope
Case "C"
' 前回がクリアボタン
ans = CInt(LblAnser.Text)
Case "="
' 前回がイコールボタン
ans = ans * num
Case "*"
num = ans
End Select
End If
beforeIn = "*"
ope = "*"

End Sub
' ÷ボタンクリック処理
Private Sub BtnDiv_Click(sender As Object, e As EventArgs) Handles BtnDiv.Click

If beforeIn >= "0" And beforeIn <= "9" Then
If ope = "C" Then
' 最初の入力数値をansに保管
ans = CInt(LblAnser.Text)
Else
' ansに保管されている
' ÷ボタンクリック前の数値と乗算
num = CInt(LblAnser.Text)
ans = ans / num
LblAnser.Text = ans
End If
Else
' 前回クリックが数字以外の時
Select Case ope
Case "C"
' 前回がクリアボタン
ans = CInt(LblAnser.Text)
Case "="
' 前回がイコールボタン
ans = ans / num
Case "/"
num = ans
End Select
End If
beforeIn = "/"
ope = "/"

End Sub
' =ボタンクリック処理
Private Sub BtnEqual_Click(sender As Object, e As EventArgs) Handles BtnEqual.Click
Try
If beforeIn >= "0" And beforeIn <= "9" And Not beforeIn = "+""-""*""/" Then
num = CInt(LblAnser.Text)

End If
' 演算子を判定して処理を振分
Select Case ope
Case "+"
ans = ans + num

Case "-"
ans = ans - num
Case "*"
ans = ans * num
Case "/"
ans = ans / num

End Select
LblAnser.Text = ans
beforeIn = "C"
Catch ex As DivideByZeroException
End Try
End Sub
Private Sub BtnClear_Click(sender As Object, e As EventArgs) Handles BtnClear.Click

ans = 0
num = 0
beforeIn = "C"
ope = "C"
LblAnser.Text = "0"

End Sub

Private Sub Label1_Click(sender As Object, e As EventArgs) Handles LblAnser.Click

End Sub
End Class

試したこと

ネットでの検索(4時間)

補足情報(言語/FW/ツール等のバージョンなど)

IDE:VS2015

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

まず質問に対する回答ですが、これは他の方も書かれている通り、単純に=ボタンクリック処理の中で最初に直前の入力(beforeIn)を判定し、四則演算であれば処理を抜けるようにしてあげればいいと思います。

Private Sub BtnEqual_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnEqual.Click
    Try
        If (beforeIn = "+" Or beforeIn = "-" Or beforeIn = "*" Or beforeIn = "/") Then Exit Sub

        If beforeIn >= "0" And beforeIn <= "9" Then
        '・・・以下略

その他のアドバイスとして、同じような処理を何度も記述しているので、やりたいこと以上にコードが長く、メンテナンス性も悪くなっていると思います。
参考までに、例えば数字ボタン(0-9)のクリックイベントであれば以下のようにまとめられます。
※事前に各ボタンのプロパティ設定でTagプロパティに0-9の値をセットしておき、クリック時にその値から処理を分岐します

' 数字ボタンクリック処理 
Private Sub BtnNumber_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, _
                                                                      Button4.Click, Button5.Click, Button6.Click, _
                                                                      Button7.Click, Button8.Click, Button9.Click, BtnZero.Click 
    Dim strNum As String
    strNum = Directcast(sender, Button).Tag  'ボタンのTagプロパティから押したボタンの数値を取得する

    If beforeIn >= "0" And beforeIn <= "9" Then 
        ' 直前の押されたのが数字ボタンのとき 
        ' かつ、8桁未満の数値が入力されているとき 
        If LblAnser.Text.Length < 8 Then 
            ' 現在値の後に追記
            LblAnser.Text &= strNum 
            ' 値をセットしたら前回値として保管
            beforeIn = strNum
        End If 
    Else 
        ' 直前の押されたのが数字以外のボタンのとき 
        ' 値にセット
        LblAnser.Text = strNum
        ' 値をセットしたら前回値として保管
        beforeIn = strNum
    End If 

End Sub


四則演算ボタンなども同様で、他にもたくさん簡潔にできる部分があると思います。
コードを整理すると問題点も見つけやすくなりますので頑張ってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/09 18:49

    回答と、今後へのアドヴァイス
    までして頂きありがとうございます。
    ベストアンサーとさせていただきます。

    キャンセル

0

ヒントだけで良ければ。

いろいろやり方はあると思いますが、一番簡単なのは直前の入力を記憶しておいて演算記号(+,-,×,/)の時は=の入力を無視するようにする方法だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/09 18:22

    回答ありがとう御座います!
    すいませんそこまではわかっているのですが、もう少し
    ヒント頂いても宜しいですか。。。?
    ググる際のキーワードだけでもいいので。。。

    キャンセル

  • 2016/06/09 18:26 編集

    ttyp03さんの回答がそのものだと思います。つまり、Instrメソッドで直前の入力(breforeIn)が"+-*/"のどれかならInstrは0以上を返すのでそれを判定とします。
    それと、プログラムコードを載せる時は```のブロックで囲うと見やすくなります。
    ```vb.net
    コード
    ```
    という感じです。

    キャンセル

  • 2016/06/09 18:49

    ありがとうございます!
    がんばります!

    キャンセル

0

BtnEqual_Clicknoイベントで、beforeInが +,-,*,/ のいずれかなら、即イベントを抜けるようにすればよろしいかと。

Private Sub BtnEqual_Click(sender As Object, e As EventArgs) Handles BtnEqual.Click 
  Try 
    If InStr("+-*/", beforeIn) >= 1 Then
      Exit Sub
    End If

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/09 18:49

    やってみます。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る