前提・実現したいこと
Visual Basic2017を利用している者です。独学で電卓を作成しているのですが分からない点があります。
電卓はほとんど完成状態なのですが最終的な計算が上手くいきません。
発生している問題・エラーメッセージ
同じ演算子同士の計算は問題なくできますが(例、3+5+6)、違う演算子が入ると計算が狂います(例、2×5+8-7等)
本当であれば”9×7+9-6”は66になると思いますが自分の作った電卓では1になります。
どこが間違っているのかを教えて頂ければ幸いです。
### 該当のソースコード Public Class Form1 Private Sub Form_initialize() anser = 0 before = 0 End Sub Private lblAnser As Object Private num As Double ' 今回入力された数値を保存する変数 Private ans As Double Private beforeIn As String = "0" ' 今回押されたボタンの値(0~9,+,=,C)を保存する変数 Private ope As String = "C" ' 今回押されたボタンの数字以外の値(+,=,C)を保存する変数 Private anser As String = "C" Private before As Integer Private m_last_pressed_op As Boolean = False ' Cボタンクリック処理 Private Sub Buttonclear_Click(sender As Object, e As EventArgs) Handles Buttonclear.Click ans = 0 num = 0 beforeIn = "C" ope = "C" Label1.Text = "" Label3.Text = "0" End Sub ' ←ボタンクリック処理 Private Sub Buttonbackspace_Click(sender As Object, e As EventArgs) Handles Buttonbackspace.Click If Label3.Text < " " Then Label3.Text = Mid(Label3.Text, 1, Len(Label3.Text) - 1 + 1) Else Label3.Text = Mid(Label3.Text, 1, Len(Label3.Text) - 1) End If If Len(Label3.Text) = 0 Then Label3.Text = "0" End If End Sub ' +ボタンクリック処理 Private Sub ButtonPlus_Click(sender As Object, e As EventArgs) Handles ButtonPlus.Click If beforeIn >= "0" And beforeIn <= "9" Then If ope = "C" Then ' 最初の入力数値をansに保管 ans = CStr(Label3.Text) Label1.Text = Label1.Text & Label3.Text & "+" Else ' ansに保管されている ' +ボタンクリック前の数値と加算 Label1.Text = Label1.Text & Label3.Text & "+" num = CStr(Label3.Text) ans = ans + num Label3.Text = ans End If Else ' 前回クリックが数字以外の時 Select Case ope Case "C" ' 前回がクリアボタン ans = CInt(Label3.Text) Case "=" ' 前回がイコールボタン ans = ans + num Case "+" num = ans End Select End If beforeIn = "+" ope = "+" End Sub ' .ボタンクリック処理 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles ButtonDot.Click If beforeIn >= "0" And beforeIn <= "9" Then If Label3.Text.Length < 9 Then Label3.Text &= "." End If If ope = "C" Then End If End If End Sub ' =ボタンクリック処理 Private Sub Buttonequal_Click(sender As Object, e As EventArgs) Handles Buttonequal.Click If beforeIn >= "0" And beforeIn <= "9" Then num = CStr(Label3.Text) End If Try If beforeIn = "+" Or beforeIn = "-" Or beforeIn = "*" Or beforeIn = "/" Then Exit Sub If beforeIn >= "0" And beforeIn <= "9" Then num = CStr(Label3.Text) End If Catch ex As Exception End Try Select Case ope Case "+" ans = ans + num Case "-" ans = ans - num Case "*" ans = ans * num Case "/" ans = ans / num End Select Label3.Text = ans beforeIn = "C" End Sub ' -ボタンクリック処理 Private Sub ButtonMinus_Click(sender As Object, e As EventArgs) Handles ButtonMinus.Click If beforeIn >= "0" And beforeIn <= "9" Then If ope = "C" Then ans = CStr(Label3.Text) Label1.Text = Label1.Text & Label3.Text & "-" Else Label1.Text = Label1.Text & Label3.Text & "-" num = CStr(Label3.Text) ans = ans - num Label3.Text = ans End If Else Select Case ope Case "C" ans = CInt(Label3.Text) Case "=" ans = ans - num Case "+" num = ans End Select End If beforeIn = "-" ope = "-" End Sub ' ×ボタンクリック処理 Private Sub ButtonKake_Click(sender As Object, e As EventArgs) Handles ButtonKake.Click If beforeIn >= "0" And beforeIn <= "9" Then If ope = "C" Then ans = CStr(Label3.Text) Label1.Text = Label1.Text & Label3.Text & "×" Else Label1.Text = Label1.Text & Label3.Text & "×" num = CStr(Label3.Text) ans = ans * num Label3.Text = ans End If Else Select Case ope Case "C" ans = CInt(Label3.Text) Case "=" ans = ans * num Case "*" num = ans End Select End If If beforeIn <= "0" Then End If beforeIn = "*" ope = "*" End Sub '÷ボタンクリック処理 Private Sub ButtonWaru_Click(sender As Object, e As EventArgs) Handles ButtonWaru.Click If beforeIn >= "0" And beforeIn <= "9" Then If ope = "C" Then ans = CStr(Label3.Text) Label1.Text = Label1.Text & Label3.Text & "÷" Else Label1.Text = Label1.Text & Label3.Text & "÷" num = CStr(Label3.Text) ans = ans / num Label3.Text = ans End If Else Select Case ope Case "C" ans = CInt(Label3.Text) Case "=" ans = ans / num Case "/" num = ans End Select End If beforeIn = "/" ope = "/" End Sub '数字ボタンクリック処理 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button9.Click, Button8.Click, Button7.Click, Button6.Click, Button3.Click, Button2.Click, Button1.Click, Button5.Click, Button4.Click, Button0.Click If Label3.Text.Length < 9 Then If beforeIn >= "0" Then If Label3.Text = "0" Then Label3.Text = sender.text Else Label3.Text = Label3.Text & sender.text End If ElseIf beforeIn >= "1" And beforeIn <= "9" Then Label3.Text = Label3.Text & sender.text Else Label3.Text = sender.text End If End If beforeIn = sender.text End Sub Private Sub Label3_Click(sender As Object, e As EventArgs) Dim num As String num = Label3.Text MsgBox("9") End Sub ' キーボード(数字)入力ボタン Private Sub Form1_KeyPress(KeyChar As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress Select Case e.KeyChar Case Chr(Keys.D1) Button1.PerformClick() Case Chr(Keys.D2) Button2.PerformClick() Case Chr(Keys.D3) Button3.PerformClick() Case Chr(Keys.D4) Button4.PerformClick() Case Chr(Keys.D5) Button5.PerformClick() Case Chr(Keys.D6) Button6.PerformClick() Case Chr(Keys.D7) Button7.PerformClick() Case Chr(Keys.D8) Button8.PerformClick() Case Chr(Keys.D9) Button9.PerformClick() Case Chr(Keys.D0) Button0.PerformClick() 'Case Chr(Keys.Enter) ' Buttonequal.PerformClick() End Select End Sub ' キーボード(演算子など)入力ボタン Private Sub Form1_KeyDown(KeyChar As Object, e As KeyEventArgs) Handles MyBase.KeyDown Select Case e.KeyCode Case Keys.Add ButtonPlus.PerformClick() Case Keys.Subtract ButtonMinus.PerformClick() Case Keys.Multiply ButtonKake.PerformClick() Case Keys.Divide ButtonWaru.PerformClick() Case Keys.Enter Buttonequal.PerformClick() Case Keys.Back Buttonbackspace.PerformClick() Case Keys.Delete Buttonclear.PerformClick() ' デシマル Case 190 ButtonDot.PerformClick() End Select Label3.Focus() End Sub ```ここに言語名を入力 Visual Studio2017 ### 試したこと ここに問題に対して試したことを記載してください。 インターネット検索 ### 補足情報(FW/ツールのバージョンなど) 電卓の機能としては数字0~9,演算子、バックスペース、クリアボタン、キーボード入力、小数点です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。