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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

2561閲覧

Visual Basic VB 電卓のイコール後の計算が上手くいきません。

natsumi_087

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/05/07 04:34

前提・実現したいこと

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,演算子、バックスペース、クリアボタン、キーボード入力、小数点です。

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

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

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

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

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

guest

回答1

0

四則演算キーの処理において、考え方が間違っています。

ご提示のコードでは、+を押された場合、暫定結果(ans)と直前の入力値(num)で足し算をしていますが、ここで行われるべき計算は、前回の演算キーの演算なので、=と同じように、ope毎に異なる計算をする必要があります。

例として、質問文にある、9*7+9-6=を挙げます。
の処理では、ansが9になります。
次の+の処理では、9
7ではなく、9+7を計算し、ansが16となります。
同様に、-の処理で、+9ではなく、-9を行い、ansが7。
最後の=、-6が計算されて、7-6で、結果が1になります。

このような想定と異なる状態になったら、実際の動作を確認するようにしてください。
ブレークポイントを設定し、実行と変数の変化を行実行して調べるとか。
全四則演算キーの処理の最初と最後で、ansの値を出力して、変遷を調べるとか。
Visual Studio デバッグ辺りで検索すれば、有用な情報が得られるかと思います。

投稿2021/05/07 14:12

YT0014

総合スコア1750

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問