언어공부/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. 자리수를 표현하기 실패(실행했을때 표현은 가능하지만 수가 변하고 소수점 계산에 실패함