
问世间、情是何物,直教生死相许?
天南地北双飞客,老翅几回寒暑。
欢乐趣,离别苦,就中更有痴儿女。
君应有语,渺万里层云,千山暮雪,只影向谁去?
欢迎访问infoheader的Blog——年华似水浪淘沙 E-mail:infoheader@gmail.com来自fanfou:
GTalk:infoheader@gmail.com



今天大概没有什么收获。如果有,那么可能就是去穿石坡湖看了看,看到一个老师带着孩子爬山,两个都人很用力,都把大衣脱下拿在手里,满脸通红。还看到一个老教授跑步上山,那样子似乎比我还年轻,还有活力。如果还有,那么就是右边这张爱晚亭的照片。 虽然位置不好,右边有人所以往左移了一些,但是总算是拍摄到大体上没人(其实有,被我有意挡在树后了)的风景图了。一个景点,如果人多了,就不再是风景了。
V8 是 Google 的开源 JavaScript 引擎。
V8 采用 C++ 编写,可在 Google Chrome(来自 Google 的开源浏览器)中使用。
V8 根据 ECMA-262 第三版中的说明使用 ECMAScript,并在使用 IA-32 或 ARM 处理器的 Windows XP 和 Vista、Mac OS X 10.5 (Leopard) 以及 Linux 系统中运行。
V8 可以独立运行,也可以嵌入任何 C++ 应用程序中。
'函数:Calc(Exp As String) As Double
'用于计算包含括号、四则运算的字符串表达式
'infoheader版权所有,转载、使用请注明出处
'Blog:infoheader.blogspot.com
'E-mail:infoheader@gmail.com
'仅供技术交流使用,严禁用于商业用途
'叠代深度(调试用)
'Public Deep As Integer
Public CalcErr As String
Public Function Calc(ByVal Exp As String) As Double
CalcErr = ""
'去空格
Exp = Replace(Exp, " ", "")
'去掉最外括号
While Left(Exp, 1) = "(" And Right(Exp, 1) = ")"
Exp = Mid(Exp, 2, Len(Exp) - 2)
Wend
'括号配对检查
Dim I As Integer, CountL As Integer, CountR As Integer, Chr As String
For I = 1 To Len(Exp)
Chr = Mid(Exp, I, 1)
If Chr = "(" Then
CountL = CountL + 1
ElseIf Chr = ")" Then
CountR = CountR + 1
End If
Next
If CountL <> CountR Then
CalcErr = "括号不匹配"
Exit Function
End If
'计算
Calc = CalcA(Exp)
End Function
Public Function CalcA(ByVal Exp As String) As Double
'Deep = Deep + 1
'(1+2)*3+4*5+2=?
'(1+2)*(3+4)+5=?
'(1+2)*((3+4)*5)+3=?
'11111012222211100
DoEvents '防止死机
Dim LvS As Integer
'循环变量
Dim I As Integer, J As Integer
'对于纯数值
Dim Temp As String, Temp2 As String
Temp = Str(Val(Exp))
Temp2 = Replace(Temp, ".", "0.")
Exp = Trim(Exp)
If Trim(Temp) = Exp Or Trim(Temp2) = Exp Then
CalcA = Val(Exp)
GoTo LAB_END
ElseIf Exp = "" Then '对于空(负号)
CalcA = 0
GoTo LAB_END
End If
'Dim AscN As Integer
'For I = 1 To Len(Exp)
' AscN = Asc(Mid(Exp, I, 1))
' If AscN > 57 Or AscN < ascn =" 47" ascn =" 44" calca =" Val(Exp)" i =" 1" lvs =" I" currentlv =" 0:" lvmb =" False" i =" LvS" currentlv =" CurrentLv"> LvM Then
LvM = CurrentLv
LvMS = I '最大级别启始点
LvMB = True
End If
ElseIf Mid(Exp, I, 1) = ")" Then
CurrentLv = CurrentLv - 1
If LvMB Then
LvME = I '最大级别结束点
LvMB = False
End If
End If
'Lv(I) = CurrentLv '存储级别(优化备用)
Next
'计算最高级括号
Exp = Left(Exp, LvMS - 1) & CalcA(Mid(Exp, LvMS + 1, LvME - LvMS - 1)) & Right(Exp, Len(Exp) - LvME)
CalcA = CalcA(Exp)
GoTo LAB_END
LAB_A2:
'对于没有括号的表达式
'加减法跳转
Dim AscS As Integer
For I = 1 To Len(Exp)
If Mid(Exp, I, 1) = "+" Then GoTo LAB_B1
If Mid(Exp, I, 1) = "-" And I > 1 Then
AscS = Asc(Mid(Exp, I - 1, 1))
If AscS >= Asc("0") And AscS < i =" 1" exp =" CalcA(Left(Exp," calca =" CalcA(Exp)" exp =" Str(CalcA(Left(Exp," calca =" CalcA(Exp)" i =" 1" exp =" Str(CalcA(Left(Exp," calca =" CalcA(Exp)" exp =" Str(CalcA(Left(Exp," calca =" CalcA(Exp)" deep =" Deep">
今天自己写的一个函数,没想到会用了将近两个小时……
还没有进行优化,估计这个函数的效率不怎么样。
没有错误检查功能。如果表达式有问题,那么结果是不可预知的。
写完后调试了半天,检查出多处错误。
如果发现还存在问题请告诉我。
感谢声明:感谢Aegisys[0GiNr]发现未检查减法运算的错误
'函数:Calc(Exp As String) As Double
'用于计算包含括号、四则运算的字符串表达式
'infoheader版权所有,转载、使用请注明出处
'Blog:infoheader.blogspot.com
'E-mail:infoheader@gamil.com
'仅供技术交流使用,严禁用于商业用途
Public Function Calc(Exp As String) As Double
'去空格
Exp = Replace(Exp, " ", "")
'去掉最外括号
While Left(Exp, 1) = "(" And Right(Exp, 1) = ")"
Exp = Mid(Exp, 2, Len(Exp) - 2)
Wend
Calc = CalcA(Exp)
End Function
Public Function CalcA(Exp As String) As Double
'Deep = Deep + 1
'(1+2)*3+4*5+2=?
'(1+2)*(3+4)+5=?
'(1+2)*((3+4)*5)+3=?
'11111012222211100
DoEvents '防止死机
Dim LvS As Integer
'循环变量
Dim I As Integer, J As Integer
'对于纯数值
If Trim(Str(Val(Exp))) = Trim(Exp) Then
CalcA = Val(Exp)
GoTo LAB_END
ElseIf Exp = "" Then '对于空(负号)
CalcA = 0
GoTo LAB_END
End If
'Dim AscN As Integer
'For I = 1 To Len(Exp)
' AscN = Asc(Mid(Exp, I, 1))
' If AscN > 57 Or AscN < 43 Or AscN = 47 Or AscN = 44 Then GoTo LAB_NUM
'Next
'CalcA = Val(Exp)
'GoTo LAB_END
'LAB_NUM:
'括号跳转
For I = 1 To Len(Exp)
If Mid(Exp, I, 1) = "(" Then
LvS = I
GoTo LAB_A1
End If
Next
GoTo LAB_A2
LAB_A1:
'对于有括号的表达式
'存储级别(优化备用)
'Dim Lv() As Integer
'ReDim Lv(Len(Exp)) As Integer
'当前级别,最大级别,最大级别启始,结束,判定
Dim CurrentLv As Integer, LvM As Integer, LvMS As Integer, LvME As Integer, LvMB As Boolean
CurrentLv = 0: LvMB = False
'定级
For I = LvS To Len(Exp)
If Mid(Exp, I, 1) = "(" Then
CurrentLv = CurrentLv + 1
If CurrentLv > LvM Then
LvM = CurrentLv
LvMS = I '最大级别启始点
LvMB = True
End If
ElseIf Mid(Exp, I, 1) = ")" Then
CurrentLv = CurrentLv - 1
If LvMB Then
LvME = I '最大级别结束点
LvMB = False
End If
End If
'Lv(I) = CurrentLv '存储级别(优化备用)
Next
'计算最高级括号
Exp = Left(Exp, LvMS - 1) & CalcA(Mid(Exp, LvMS + 1, LvME - LvMS - 1)) & Right(Exp, Len(Exp) - LvME)
CalcA = CalcA(Exp)
GoTo LAB_END
LAB_A2:
'对于没有括号的表达式
'加减法跳转
Dim AscS As Integer
For I = 1 To Len(Exp)
If Mid(Exp, I, 1) = "+" Then GoTo LAB_B1
If Mid(Exp, I, 1) = "-" And I > 1 Then
AscS = Asc(Mid(Exp, I - 1, 1))
If AscS >= Asc("0") And AscS < Asc("9") Then GoTo LAB_B1
End If
Next
GoTo LAB_B2
LAB_B1:
'对于有加减法的表达式
For I = 1 To Len(Exp)
'计算加减法
If Mid(Exp, I, 1) = "+" Then
Exp = CalcA(Left(Exp, I - 1)) + CalcA(Right(Exp, Len(Exp) - I))
CalcA = CalcA(Exp)
GoTo LAB_END
ElseIf Mid(Exp, I, 1) = "-" Then
Exp = Str(CalcA(Left(Exp, I - 1)) - CalcA(Right(Exp, Len(Exp) - I)))
CalcA = CalcA(Exp)
GoTo LAB_END
End If
Next
LAB_B2:
'对于没有加减法的表达式
For I = 1 To Len(Exp)
'计算乘除法
If Mid(Exp, I, 1) = "*" Then
Exp = Str(CalcA(Left(Exp, I - 1)) * CalcA(Right(Exp, Len(Exp) - I)))
CalcA = CalcA(Exp)
GoTo LAB_END
ElseIf Mid(Exp, I, 1) = "/" Then
Exp = Str(CalcA(Left(Exp, I - 1)) / CalcA(Right(Exp, Len(Exp) - I)))
CalcA = CalcA(Exp)
GoTo LAB_END
End If
Next
LAB_END:
'Deep = Deep - 1
End Function