언어공부/Visual Basic

[Visual Basic] 사칙연산 계산기(기본계산기)

zzerou 2022. 5. 18. 07:20

완벽하지는 않지만 5/2일부터 5/13일까지 나름 열심히 만들어 본 계산기

Public Class Form1
    Dim first As Double = 0 '첫번째수
    Dim second As Double = 0 '두번째수
    Dim answer As Double = 0  '정답
    Dim oper As String = "0"  '연산자 기억

    Dim heyNum As Double = 0 '자릿수 표시를 위한 변수 => 사용안함

    Dim oper_check As Boolean = False '연산자 변경을 위한 검사 변수 
    Dim setFirstNum As Boolean = False '첫번째 수 입력 후 Label 초기화용 변수
    Dim result As Boolean = False

    Private Sub btn0_click(sender As Object, e As EventArgs) Handles Btn_0.Click
        If Label1.Text = "0" Then   '초기값이 없을때
            Label1.Text = "0"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "0"
        Else
            Label1.Text = Label1.Text + "0" '첫값을 입력할때
        End If
    End Sub

    Private Sub btn1_click(sender As Object, e As EventArgs) Handles Btn_1.Click
        If Label1.Text = "0" Then
            Label1.Text = "1"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "1"
        Else
            Label1.Text = ""
            Label1.Text = Label1.Text + "1"
        End If

    End Sub

    Private Sub btn2_click(sender As Object, e As EventArgs) Handles Btn_2.Click
        If Label1.Text = "0" Then
            Label1.Text = "2"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "2"
        Else
            Label1.Text = Label1.Text + "2"
        End If
    End Sub

    Private Sub btn3_click(sender As Object, e As EventArgs) Handles Btn_3.Click
        If Label1.Text = "0" Then
            Label1.Text = "3"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "3"
        Else
            Label1.Text = Label1.Text + "3"
        End If
    End Sub

    Private Sub btn4_click(sender As Object, e As EventArgs) Handles Btn_4.Click
        If Label1.Text = "0" Then
            Label1.Text = "4"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "4"
        Else
            Label1.Text = Label1.Text + "4"
        End If
    End Sub

    Private Sub btn5_click(sender As Object, e As EventArgs) Handles Btn_5.Click
        If Label1.Text = "0" Then
            Label1.Text = "5"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "5"
        Else
            Label1.Text = Label1.Text + "5"
        End If
    End Sub

    Private Sub btn6_click(sender As Object, e As EventArgs) Handles Btn_6.Click
        If Label1.Text = "0" Then
            Label1.Text = "6"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "6"
        Else
            Label1.Text = Label1.Text + "6"
        End If
    End Sub

    Private Sub btn7_click(sender As Object, e As EventArgs) Handles Btn_7.Click
        If Label1.Text = "0" Then
            Label1.Text = "7"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "7"
        Else
            Label1.Text = Label1.Text + "7"
        End If
    End Sub

    Private Sub btn8_click(sender As Object, e As EventArgs) Handles Btn_8.Click
        If Label1.Text = "0" Then
            Label1.Text = "8"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "8"
        Else
            Label1.Text = Label1.Text + "8"
        End If
    End Sub

    Private Sub btn9_click(sender As Object, e As EventArgs) Handles Btn_9.Click
        If Label1.Text = "0" Then
            Label1.Text = "9"
        ElseIf setFirstNum = True Then
            Label1.Text = ""
            setFirstNum = False
            Label1.Text = Label1.Text + "9"
        Else
            Label1.Text = Label1.Text + "9"
        End If

    End Sub

    Private Sub btn_dot(sender As Object, e As EventArgs) Handles Button10.Click
        If Label1.Text.Contains(".") Then
        Else
            Label1.Text = Label1.Text + "."
        End If
    End Sub

    Private Sub btn_plus(sender As Object, e As EventArgs) Handles Button14.Click

        oper = "+" '결과 함수에서 if문에 사용될 기호 정의
        first = Val(Label1.Text)

        '첫번째로 입력된 숫자를 + 버튼 클릭 이후의 숫자와 더함. 
        Label2.Text = CStr(first) + oper '입력했던 값 Label2에 출력 / 계산 완료 이후는 Result에서 처리
        Label1.Text = CStr(first) '입력했던 값 유지
        setFirstNum = True '첫번 째 수 입력 후 Label 초기화용 변수
        'oper_check = True '연산자 선택 True

        'if oper_check = true then '연산자가 선택되었고,
        '    if second = 0 then 'second이 입력된상태가 아니며
        '        second = label1.text 'second이 label1.text에 입력된 후에는 label1.text값을 second에 저장
        '    end if
        'end if

        If oper_check = False Then
            If Label2.Text.Contains("+") Then
                ' +선택시 아무동작하지않음
            ElseIf Label2.Text.Contains("-") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1) '기존의 부호를 지운다
                Label1.Text = Label2.Text  '다른부호에서 작업할 수 있게 문자를 원래대로 옮긴다.
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("*") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("/") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            Else
                first = Label1.Text  '첫 출력위치
                Label2.Text = Label1.Text ' 연산자 클릭시 첫값의 이동
                Label2.Text = Label2.Text + " " + oper  ' label2에서 나타낼표현
                Label1.Text = ""  '처음 입력했던 위치에서 이동 후 기존 위치의 값의 초기
            End If

        End If

        Btn_equal.Focus()
    End Sub

    Private Sub btn_mins(sender As Object, e As EventArgs) Handles Button13.Click

        oper = "-" '결과 함수에서 if문에 사용될 기호 정의
        first = Val(Label1.Text)

        Label2.Text = CStr(first) + oper
        Label1.Text = CStr(first)

        'oper_check = True
        setFirstNum = True

        If oper_check = False Then
            If Label2.Text.Contains("-") Then

            ElseIf Label2.Text.Contains("+") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("*") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("/") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            Else
                first = Label1.Text
                Label2.Text = Label1.Text
                Label2.Text = Label2.Text + " " + oper
                Label1.Text = ""
            End If
        End If

        Btn_equal.Focus()
    End Sub

    Private Sub btn_double(sender As Object, e As EventArgs) Handles Button18.Click
        oper = "*"
        first = Val(Label1.Text)

        Label2.Text = CStr(first) + oper
        Label1.Text = CStr(first)

        setFirstNum = True

        If oper_check = False Then
            If Label2.Text.Contains("*") Then
            ElseIf Label2.Text.Contains("+") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("-") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("/") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            Else
                first = Label1.Text
                Label2.Text = Label1.Text
                Label2.Text = Label2.Text + " " + oper
                Label1.Text = ""
            End If
        End If

        Btn_equal.Focus()
    End Sub

    Private Sub btn_div(sender As Object, e As EventArgs) Handles Button17.Click

        oper = "/" '결과 함수에서 if문에 사용될 기호 정의
        first = Val(Label1.Text)

        Label2.Text = CStr(first) + oper
        Label1.Text = CStr(first)
        setFirstNum = True

        If oper_check = False Then
            If Label2.Text.Contains("/") Then
            ElseIf Label2.Text.Contains("+") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("-") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            ElseIf Label2.Text.Contains("*") Then
                Label2.Text = Label2.Text.Remove(Label2.Text.Length - 1, 1)
                Label1.Text = Label2.Text
                Label2.Text = Label2.Text + oper
                Label1.Text = ""
            Else
                first = Label1.Text
                Label2.Text = Label1.Text
                Label2.Text = Label2.Text + " " + oper
                Label1.Text = ""
            End If
        End If

        Btn_equal.Focus()
    End Sub

    Private Sub btn_ee(sender As Object, e As EventArgs) Handles Btn_equal.Click
        second = Val(Label1.Text)   ' 두번째 값 label1에 출력

        If Label2.Text.Contains("0") Then
        ElseIf oper = "+" Then
            Label2.Text = CStr(first) + oper + CStr(second) + " =" 'Label2 에 표시되는것 / second은 +버튼에서 받아온 값

            first = first + second '가산역할
            Label1.Text = first '최종 결과값 표기
            oper = "0"
            'first = 0 '삭제해야 가산이 작동됨. -> 구런데 지금은 안됨
            'oper_check = False

        ElseIf oper = "-" Then
            Label2.Text = CStr(first) + oper + CStr(second) + " ="

            first = first - second
            Label1.Text = CStr(first)
            oper = "0"
            oper_check = False

        ElseIf oper = "*" Then
            Label2.Text = CStr(first) + oper + CStr(second) + " ="

            first = first * second
            Label1.Text = first
            oper = "0"

        ElseIf oper = "/" Then
            Label2.Text = CStr(first) + oper + CStr(second) + " ="

            first = first / second
            Label1.Text = first
            oper = "0"
        End If

    End Sub
  End Class

+) 키보드의 함수를 각각 제어하기 위해 하나하나 숫자나 연산자에 대한 카테고리를 만들었지만

이러한 경우가 아니라면 핸들러와 키를 사용해서 코드들을 간결하고 단순하게 만들수도 있다.

 

!) 아쉬운점

1. 계산이 연산자만으로 계속해서 더해지지 못한다.(stack)

2. 엔터로 두번째로 입력한 값으로 계속되서 연산되지 못한다.

3. 자리수를 표현하기 실패(실행했을때 표현은 가능하지만 수가 변하고 소수점 계산에 실패함