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

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

新規登録して質問してみよう
ただいま回答率
85.49%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

19674閲覧

vbnet 電卓作成について

Tomfin555

総合スコア9

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1グッド

0クリップ

投稿2016/06/09 08:24

元文系プログラミング初心者
プログラミング歴
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

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

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 09:40

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomfin555

2016/06/09 09:49

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

0

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

VB

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

投稿2016/06/09 09:13

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomfin555

2016/06/09 09:49

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

0

ヒントだけで良ければ。

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

投稿2016/06/09 09:07

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomfin555

2016/06/09 09:22

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

2016/06/09 09:29 編集

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

2016/06/09 09:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問