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

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

ただいまの
回答率

89.72%

VBで電卓。=後の計算が上手くいかない。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 7,400

mbcajkt

score 6

VB・プログラミング初心者です。
練習でVBで電卓を作成してみています。
「数字ボタン0~9」+「演算子」+「数字ボタン0~9」+「=」でテキストボックスに結果を表示することはできますが、
「=」で計算結果を出した後、「計算結果」+「演算子」+「数字ボタン」+「=」で結果を表示しようとすると、前に計算した結果の最後の演算子を記憶したまま計算してしまうようで、
1+2-3=-1 は正しく結果が出るのですが、
1+2-3=-1+4=-5 になってしまいます。
ちなみに1+2×3=9+4=36 と+4が×4と計算されているようです。

色々考え試してみたのですが上手くいきません。
作成したコードを下記に記載します。
お知恵を御貸し頂ければ幸いです。

Public Class Dentaku

    Dim ans As Single '演算子の前に入力された数値
    Dim kei As Integer '計算式
    Dim entstr As String '直前のボタンを記憶する変数
    Dim num As Integer '演算子の後に入力された数値

    '「1」ボタン
    Private Sub btn1_click(sender As Object, e As EventArgs) Handles Btn1.Click

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

    '「2」ボタン
    Private Sub btn2_click(sender As Object, e As EventArgs) Handles Btn2.Click

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

    End Sub

    '「3」ボタン
    Private Sub btn3_click(sender As Object, e As EventArgs) Handles Btn3.Click

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

    End Sub

    '「4」ボタン
    Private Sub btn4_click(sender As Object, e As EventArgs) Handles Btn4.Click

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

    End Sub

    '「5」ボタン
    Private Sub btn5_click(sender As Object, e As EventArgs) Handles Btn5.Click

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

    End Sub

    '「6」ボタン
    Private Sub btn6_click(sender As Object, e As EventArgs) Handles Btn6.Click

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

    End Sub

    '「7」ボタン
    Private Sub btn7_click(sender As Object, e As EventArgs) Handles Btn7.Click

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

    End Sub

    '「8」ボタン
    Private Sub btn8_click(sender As Object, e As EventArgs) Handles Btn8.Click

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

    End Sub

    '「9」ボタン
    Private Sub btn9_click(sender As Object, e As EventArgs) Handles Btn9.Click

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

    End Sub

    '「0」ボタン
    Private Sub btn0_click(sender As Object, e As EventArgs) Handles Btn0.Click

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

    End Sub

    '+ボタン
    Private Sub Btn_Add_click(sender As Object, e As EventArgs) Handles Btn_Add.Click

        If IsNumeric(entstr) = True Then 'entstrが数値の時trueを返します
            num = CSng(entstr) 'entstrをsingleに変換
        Else
            Exit Sub
        End If

        entstr = ""
        Select Case kei
            Case 1
                ans = ans + num
            Case 2
                ans = ans - num
            Case 3
                ans = ans * num
            Case 4
                If num = 0 Then Exit Sub
                ans = ans / num
            Case Else
                ans = num
        End Select

    kei = 1 '加算

    End Sub

    '-ボタン
    Private Sub Btn_Sub_click(sender As Object, e As EventArgs) Handles Btn_Sub.Click

        If IsNumeric(entstr) = True Then 'entstrが数値の時trueを返します
            num = CSng(entstr) 'entstrをsingleに変換
        Else
            Exit Sub
        End If

        entstr = ""
        Select Case kei
            Case 1
                ans = ans + num
            Case 2
                ans = ans - num
            Case 3
                ans = ans * num
            Case 4
                If num = 0 Then Exit Sub
                ans = ans / num
            Case Else
                ans = num
        End Select

        kei = 2 '減算

    End Sub

    '*ボタン
    Private Sub Btn_Mult_click(sender As Object, e As EventArgs) Handles Btn_Mult.Click

        If IsNumeric(entstr) = True Then 'entstrが数値の時trueを返します
            num = CSng(entstr) 'entstrをsingleに変換
        Else
            Exit Sub
        End If

        entstr = ""
        Select Case kei
            Case 1
                ans = ans + num
            Case 2
                ans = ans - num
            Case 3
                ans = ans * num
           Case 4
                If num = 0 Then Exit Sub
                ans = ans / num
            Case Else
                ans = num
        End Select

        kei = 3 '乗算

    End Sub

    '/ボタン
    Private Sub Btn_Division_click(sender As Object, e As EventArgs) Handles Btn_Division.Click

        If IsNumeric(entstr) = True Then 'entstrが数値の時trueを返します
            num = CSng(entstr) 'entstrをsingleに変換
        Else
            Exit Sub
        End If

        entstr = ""
        Select Case kei
            Case 1
                ans = ans + num
            Case 2
                ans = ans - num
            Case 3
                ans = ans * num
            Case 4
                If num = 0 Then Exit Sub
                ans = ans / num
            Case Else
                ans = num
        End Select

        kei = 4 '除算

    End Sub

    '=ボタン
    Private Sub Btn_Equal_click(sender As Object, e As EventArgs) Handles Btn_Equal.Click

        Dim num As Single

        If IsNumeric(entstr) = True Then
            num = CSng(entstr)
        Else
            Exit Sub
        End If

        entstr = ""


        Select Case kei
            Case 1
                ans = ans + num
            Case 2
                ans = ans - num
            Case 3
                ans = ans * num
            Case 4
                If num = 0 Then Exit Sub
                ans = ans / num
            Case Else
                ans = num
        End Select


        LblAnser.Text = CStr(ans) 'テキストボックスに結果を表示


    End Sub

    'C(クリア)ボタン
    Private Sub Btn_Clear_click(sender As Object, e As EventArgs) Handles Btn_Clear.Click
        LblAnser.Text = 0
        kei = 0
        entstr = ""
        ans = 0
    End Sub

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

演算子入力時の、keiに値を設定するタイミングをもう一度確認してみましょう。

1 + 2は
1に2を足す
のです。

今の処理だと
1を足して2
になっていませんか?


(ans=0,kei=0,entstr="")
1
(ans=0,kei=0,entstr="1")  ここはok
+
(ans=0,kei=1,entstr="") ここでans=1,kei=1,entstr=""になってないとおかしい
2
(ans=0,kei=1,entstr="2")
-
(ans=2,kei=2,entstr="") 
3
(ans=2,kei=2,entstr="3")
=
(ans=-1,kei=2,entstr="")
+
(ans=-1,kei=2,entstr="")
4
(ans=-1,kei=2,entstr="4")
=
(ans=-5,kei=2,entstr="")

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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