不会堆,用土办法写了个表达式计算程序,支持三角涵数和括号

gc0322 2008-08-08 02:58:04
Public Function GcG(ByVal S As String) As String '主程序
Dim St As String
St = S
Dim i, I1, I2 As Integer



'把减号换成#号
For i = 1 To Len(St)

If Mid(St, i, 1) = "-" Then
St = Mid(St, 1, i - 1) + "#" + Mid(St, i + 1, Len(St) - i)
End If
Next
Do
If InStr(1, St, ")") = 0 Then
'如果计算式里没有括号就调用括号计算程序然后退出循环
St = Gc(St)
Exit Do
End If
I1 = 1 '初始化I1以防I1=0

I2 = InStr(1, St, ")") '得到后括号的位置
''得到前括号的位置
For i = I2 To 0 Step -1
If Mid(St, i, 1) = "(" Then
I1 = i
Exit For
End If
Next i
'计算括号内的表达式
St = Left(St, I1 - 1) + Gc(Mid(St, I1 + 1, I2 - I1 - 1)) + Right(St, Len(St) - I2)
Loop

GcG = St




End Function


...全文
76 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanlongwuhui 2008-08-08
  • 打赏
  • 举报
回复
MARK
gc0322 2008-08-08
  • 打赏
  • 举报
回复
STRING类型有多少字就支持多少括号。
希望五楼的写出后和大家分享一下。
CloneCenter 2008-08-08
  • 打赏
  • 举报
回复
楼主不错!

最近我也写一个类似的东西,只是分析的对象不同而已。现在还木有眉目呢……
pjagz 2008-08-08
  • 打赏
  • 举报
回复
能支持多少重括号?
gc0322 2008-08-08
  • 打赏
  • 举报
回复
方法有点不入流效果还是有的
gc0322 2008-08-08
  • 打赏
  • 举报
回复
'tan运算
Do
If InStr(1, St, "tan") = 0 Then Exit Do
n = InStr(1, St, "tan")

For j = n + 3 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

'A = Mid(St, 1, n - 1)

'C = Mid(St, n + 3, j - n - 3)
'D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, n - 1) + Trim(Str(Math.Tan(Val(Mid(St, n + 3, j - n - 3))))) + Mid(St, j, Len(St) - j + 1)
Loop

'atn运算
Do
If InStr(1, St, "atn") = 0 Then Exit Do
n = InStr(1, St, "atn")

For j = n + 3 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

'A = Mid(St, 1, n - 1)

'C = Mid(St, n + 3, j - n - 3)
'D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, n - 1) + Trim(Str(Math.Atan(Val(Mid(St, n + 3, j - n - 3))))) + Mid(St, j, Len(St) - j + 1)
Loop


'sqr运算
Do
If InStr(1, St, "sqr") = 0 Then Exit Do
n = InStr(1, St, "sqr")

For j = n + 3 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

'A = Mid(St, 1, n - 1)

'C = Mid(St, n + 3, j - n - 3)
'D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, n - 1) + Trim(Str(Math.Sqrt(Val(Mid(St, n + 3, j - n - 3))))) + Mid(St, j, Len(St) - j + 1)
Loop



'^运算
Do
If InStr(1, St, "^") = 0 Then Exit Do
n = InStr(1, St, "^")
For i = n - 1 To 1 Step -1
Select Case Mid(St, i, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
For j = n + 1 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
St = Mid(St, 1, i) + Trim(Str(Val(Mid(St, i + 1, n - i - 1)) ^ Val(Mid(St, n + 1, j - n - 1)))) + Mid(St, j, Len(St) - j + 1)

Loop

'/运算
Do
If InStr(1, St, "/") = 0 Then Exit Do
n = InStr(1, St, "/")
For i = n - 1 To 1 Step -1
Select Case Mid(St, i, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
For j = n + 1 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

A = Mid(St, 1, i)
B = Mid(St, i + 1, n - i - 1)
C = Mid(St, n + 1, j - n - 1)
D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, i) + Trim(Str(Val(Mid(St, i + 1, n - i - 1)) / Val(Mid(St, n + 1, j - n - 1)))) + Mid(St, j, Len(St) - j + 1)
Loop

'*运算
Do
If InStr(1, St, "*") = 0 Then Exit Do
n = InStr(1, St, "*")
For i = n - 1 To 1 Step -1
Select Case Mid(St, i, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
For j = n + 1 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

A = Mid(St, 1, i)
B = Mid(St, i + 1, n - i - 1)
C = Mid(St, n + 1, j - n - 1)
D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, i) + Trim(Str(Val(Mid(St, i + 1, n - i - 1)) * Val(Mid(St, n + 1, j - n - 1)))) + Mid(St, j, Len(St) - j + 1)
Loop


'+运算
Do
If InStr(1, St, "+") = 0 Then Exit Do
n = InStr(1, St, "+")
For i = n - 1 To 1 Step -1
Select Case Mid(St, i, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
For j = n + 1 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

A = Mid(St, 1, i)
B = Mid(St, i + 1, n - i - 1)
C = Mid(St, n + 1, j - n - 1)
D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, i) + Trim(Str(Val(Mid(St, i + 1, n - i - 1)) + Val(Mid(St, n + 1, j - n - 1)))) + Mid(St, j, Len(St) - j + 1)
Loop

'-运算
Do
If InStr(1, St, "#") = 0 Then Exit Do
n = InStr(1, St, "#")
For i = n - 1 To 1 Step -1
Select Case Mid(St, i, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next
For j = n + 1 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

A = Mid(St, 1, i)
B = Mid(St, i + 1, n - i - 1)
C = Mid(St, n + 1, j - n - 1)
D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, i) + Trim(Str(Val(Mid(St, i + 1, n - i - 1)) - Val(Mid(St, n + 1, j - n - 1)))) + Mid(St, j, Len(St) - j + 1)
Loop







Gc = St


End Function
gc0322 2008-08-08
  • 打赏
  • 举报
回复
Public Function Gc(ByVal S As String) As String '无括号计算
Dim St As String
St = S
Dim i, j, n As Integer

Dim A, B, C, D As String


'sin运算
Do
If InStr(1, St, "sin") = 0 Then Exit Do
n = InStr(1, St, "sin")

For j = n + 3 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

'A = Mid(St, 1, n - 1)

'C = Mid(St, n + 3, j - n - 3)
'D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, n - 1) + Trim(Str(Math.Sin(Val(Mid(St, n + 3, j - n - 3))))) + Mid(St, j, Len(St) - j + 1)
Loop


'cos运算
Do
If InStr(1, St, "cos") = 0 Then Exit Do
n = InStr(1, St, "cos")

For j = n + 3 To Len(St)
Select Case Mid(St, j, 1)
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "-"
Case Else
Exit For
End Select
Next

'A = Mid(St, 1, n - 1)

'C = Mid(St, n + 3, j - n - 3)
'D = Mid(St, j, Len(St) - j + 1)
St = Mid(St, 1, n - 1) + Trim(Str(Math.Cos(Val(Mid(St, n + 3, j - n - 3))))) + Mid(St, j, Len(St) - j + 1)
Loop

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧