📄 form1.frm
字号:
Precedence = 2
Case "\"
Precedence = 2
Case "^"
Precedence = 3 '平方符号
Case "&"
Precedence = 3 '开方符号
Case Else
Precedence = 0
End Select
End Function
Sub Calculate()
Dim stacknum(30) As Double '利用栈stacknum(30)计算队列sqeuestr(30)中的后缀表达式
Dim num As String
Dim top As Integer
Dim i As Integer
top = 0
For i = 0 To lastsqeue
num = Val(sqeuestr(i))
If num <> 0 Then
stacknum(top) = num
top = top + 1
ElseIf num = 0 And sqeuestr(i) <> "0" Then
If top < 1 Then
MsgBox (" 表达式错误!!!")
End If
Select Case sqeuestr(i)
Case "+"
top = top - 1
stacknum(top - 1) = stacknum(top - 1) + stacknum(top)
Case "-"
top = top - 1
stacknum(top - 1) = stacknum(top - 1) - stacknum(top)
Case "/"
top = top - 1
If stacknum(top) = 0 Then
MsgBox (" 除数不能为零!!!")
Else
stacknum(top - 1) = stacknum(top - 1) / stacknum(top)
End If
Case "*"
top = top - 1
stacknum(top - 1) = stacknum(top - 1) * stacknum(top)
Case "\"
stacknum(top - 1) = 1 / stacknum(top - 1)
Case "^"
stacknum(top - 1) = stacknum(top - 1) * stacknum(top - 1)
Case "&"
stacknum(top - 1) = Sqr(stacknum(top - 1))
End Select
Else
stacknum(top) = 0
top = top + 1
End If
Next i
Text1.Text = stacknum(0) '将最后结果输出
For i = 0 To 20
sqeuestr(i) = "" '为方便继续计算,清空队列
Next i
End Sub
Sub input_stack() '将text1.text中值表达式的型式转化为后值表达式的型式,并放放入sqeuestr中
Dim stackstr(20) As String 'stackstr用来将中缀表达式转化为后缀表达式,并将后缀表达式放进sqeuestr中
Dim top As Integer 'top为指向stackstr的顶部,top总指向栈中的上一个元素
Dim str2 As String
Dim text1_text As String
Dim text_length As Integer
Dim i, currentprior, stackprior As Integer
Dim sign As Boolean '定义标记来标记开是否为负号
Dim tempStr As String
sign = False
top = 0
lastsqeue = 0
text1_text = Text1.Text
text_length = Len(text1_text)
tempStr = Left(text1_text, 1)
If tempStr = "-" Then
sign = True
text_length = text_length - 1
text1_text = Right(text1_text, text_length)
End If
Do While (text_length > 0)
str2 = Left(text1_text, 1)
text_length = text_length - 1
text1_text = Right(text1_text, text_length)
If (str2 = "(") Then '当当前字符为‘(’时直接入栈
stackstr(top) = str2
top = top + 1
ElseIf str2 = ")" Then '当当前字符为‘)’时出栈直到‘(’
Do While (stackstr(top - 1) <> "(")
sqeuestr(lastsqeue) = stackstr(top - 1)
lastsqeue = lastsqeue + 1
top = top - 1
Loop
top = top - 1
ElseIf str2 >= "0" And str2 <= "9" Or str2 = "." Then '当当前字符为数或小数进直接入队列
Do While (str2 >= "0" And str2 <= "9" Or str2 = ".")
sqeuestr(lastsqeue) = sqeuestr(lastsqeue) + str2
str2 = Left(text1_text, 1)
If text_length > 0 Then
text_length = text_length - 1
text1_text = Right(text1_text, text_length)
End If
Loop
text1_text = str2 + text1_text
text_length = text_length + 1
lastsqeue = lastsqeue + 1
ElseIf str2 = "+" Or str2 = "-" Or str2 = "/" Or str2 = "*" Or str2 = "^" Or str2 = "&" Or str2 = "\" Then '当当前运算符时
If top = 0 Then '当前栈顶为空时,栈顶符运算符优先级为零,当前运算符优先级为运算符优级
stackprior = 0
currentprior = Precedence(str2)
Else
stackprior = Precedence(stackstr(top - 1)) '当前栈顶不为空时,栈顶符运算符优先级为栈顶运算符的优先级
currentprior = Precedence(str2) '当前运算符优先级为运算符优级
End If
If currentprior > stackprior Then
stackstr(top) = str2
top = top + 1
Else
Do While stackprior >= currentprior '当栈顶的运算符优先级高于当前运算符优先级时,出栈
sqeuestr(lastsqeue) = stackstr(top - 1)
top = top - 1
lastsqeue = lastsqeue + 1
If top = 0 Then
stackprior = 0
Else
stackprior = Precedence(stackstr(top - 1))
End If
Loop
stackstr(top) = str2 '当前运算符入栈
top = top + 1
End If
End If
Loop
For i = top - 1 To 0 Step -1
sqeuestr(lastsqeue) = stackstr(i) '栈中的运算符入队列
lastsqeue = lastsqeue + 1
Next i
If sign = True Then
sqeuestr(0) = "-" + sqeuestr(0)
sign = False
End If
End Sub
Private Sub aboutAuthoury_Click()
frmAbout1.Show
End Sub
Private Sub aboutMachinery_Click()
frmAbout.Show
End Sub
Private Sub Command1_Click(Index As Integer)
Text1.Text = Text1.Text + "1"
End Sub
Private Sub Command10_Click()
Text1.Text = Text1.Text + "6"
End Sub
Private Sub Command11_Click()
Text1.Text = Text1.Text + "-"
End Sub
Private Sub Command12_Click()
Text1.Text = Text1.Text + "&"
End Sub
Private Sub Command13_Click()
Text1.Text = Text1.Text + "^"
End Sub
Private Sub Command14_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = 1 / Tan(num * 3.14159265358979 / 180)
End Sub
Private Sub Command15_Click()
Text1.Text = Text1.Text + "7"
End Sub
Private Sub Command16_Click()
Text1.Text = Text1.Text + "8"
End Sub
Private Sub Command17_Click()
Text1.Text = Text1.Text + "9"
End Sub
Private Sub Command18_Click()
Text1.Text = Text1.Text + "0"
End Sub
Private Sub Command19_Click()
Text1.Text = Text1.Text + "("
End Sub
Private Sub Command2_Click(Index As Integer)
Text1.Text = Text1.Text + "2"
End Sub
Private Sub Command20_Click()
Text1.Text = Text1.Text + ")"
End Sub
Private Sub Command21_Click()
Text1.Text = Text1.Text + "/"
End Sub
Private Sub Command22_Click()
Text1.Text = Text1.Text + "*"
End Sub
Private Sub Command23_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Log(num)
End Sub
Private Sub Command24_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Exp(num)
End Sub
Private Sub Command25_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Sin(num * 3.14159265358979 / 180)
End Sub
Private Sub Command26_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Cos(num * 3.14159265358979 / 180)
End Sub
Private Sub Command27_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Tan(num * 3.14159265358979 / 180)
End Sub
Private Sub Command28_Click()
Text1.Text = Text1.Text + "\"
End Sub
Private Sub Command29_Click()
Text1.Text = 3.14159265358979
End Sub
Private Sub Command3_Click()
Text1.Text = Text1.Text + "3"
End Sub
Private Sub Command30_Click()
Dim num As Double
num = Val(Text1.Text)
Text1.Text = Log(num)
End Sub
Private Sub Command31_Click()
Dim i As Integer
Text1.Text = ""
For i = 0 To 20
sqeuestr(i) = ""
Next i
End Sub
Private Sub Command32_Click()
Dim num, i As Integer
Dim total As Double
num = Val(Text1.Text)
total = 1
For i = 2 To num
total = total * i
Next i
Text1.Text = total
End Sub
Private Sub Command33_Click()
Dim num1, num2, span As Integer
Dim i, total As Integer
total = 0
num1 = InputBox("请输入第一个数:", "输入框")
num2 = InputBox("请输入最后一个数:", "输入框")
span = InputBox("请输入公差:", "输入框")
If (num2 - num1) Mod span <> 0 Then
MsgBox ("输入有误!!!")
Else
For i = num1 To num2 Step span
total = total + i
Next i
Text1.Text = total
End If
End Sub
Private Sub Command4_Click()
Text1.Text = Text1.Text + "+"
End Sub
Private Sub Command5_Click()
Text1.Text = Text1.Text + "."
End Sub
Private Sub Command6_Click()
Call input_stack
If Judge1() = True Then
Call Calculate
Else
MsgBox ("表达式错误,括号不配对!!!")
End If
End Sub
Private Sub Command7_Click()
Dim text1_length As Integer
text1_length = Len(Text1.Text)
If text1_length = 0 Then
MsgBox (" 输出框为空,没有可删除的!!!")
Else
Text1.Text = Left(Text1.Text, text1_length - 1)
End If
End Sub
Private Sub Command8_Click()
Text1.Text = Text1.Text + "4"
End Sub
Private Sub Command9_Click()
Text1.Text = Text1.Text + "5"
End Sub
Private Sub copy_Click()
copyStr = Text1.Text
End Sub
Private Sub exit_Click()
End
End Sub
Private Sub paste_Click()
Text1.Text = Text1.Text + copyStr
End Sub
Private Sub sienceCal_Click()
chooseDialog.Visible = True
End Sub
Private Sub Timer1_Timer()
TimeDialog.Text = Time
DataDialog.Text = Date
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
If (KeyCode >= 65 And KeyCode <= 90) Then 'Or (KeyCode >= 97 And KeyCode <= 122)
MsgBox ("表达式中不能为字母!!!")
Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)
ElseIf KeyCode = 13 Or KeyCode = 10 Then
Call input_stack
Call Calculate
End If
'Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -