
已解决问题
谷歌lenovobears用户在2018.10.30提交了关于“希灵帝国vb四则运算式”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-01T21:10:20。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,谢了,下次有事儿别忘了找我 !
详细问题描述及疑问:期待您的答案,谢了,下次有事儿别忘了找我 !
'这个程序是表达式运算程序,支持0-9数字输入,小数点,+,-,*,、四则运算及括号
'expression函数式调用程序,输入为表达式字符串,返回值为结果字符串,在你的程序中只需要在等号处理程序中调用。若满意请及时采纳,谢谢
DimMYNAME$(100)
Dimtrack$(100),oper$(100)
Dimtrackp,operpAsInteger
'按钮计算表达式
PrivateSubCommand1_Click()
Text2=expression(Text1)'调用实例
EndSub
PrivateFunctionexpression(a$)AsString
p=1:c$=""
trackp=0:operp=0'栈初始化
MYNAME$(p)="":plag=0
Fori=1ToLen(a$)'扫描全输入
b$=Mid$(a$,i,1)'取一字符
Ifb$="+"Orb$="-"Orb$="*"Orb$="/"Orb$="("Orb$=")"Then'运算符
Ifplag=0Thenp=p+1:plag=1'第一次遇到运算符则指针后移,并记录标志
MYNAME$(p)=b$:p=p+1'记录运算符,指针后移
MYNAME$(p)=""'初始化下一段记录
Else
MYNAME$(p)=MYNAME$(p)+b$:plag=0'是数字,则记录,并复制标志
EndIf
Nexti
p=p+1'加入#作为结束标志
MYNAME$(p)="#"
s$=""
PUSh**TRACK"#"'栈底标志
Fori=1Top'循环扫描
a$=MYNAME$(i)'取一个段
Ifa$=""Then
ElseIfa$="#"Then
Do
c$=POPTRACK
Ifc$="#"ThenExitDo
PUSh**OPERc$'出内容进后缀缓冲
Loop
ExitFor
ElseIfa$"+"Anda$"-"Anda$"*"Anda$"/"Anda$")"Anda$"("Then'不是运算符
PUSh**OPER(a$)'直接进后缀缓冲
ElseIfa$="("Then'是左括号
PUSh**TRACKa$'直接进栈
ElseIfa$=")"Then'是右扩括号
Do
c$=POPTRACK'出直到遇到左括号
Ifc$="("ThenExitDo
PUSh**OPERc$'出内容进后缀缓冲
Loop
Else
c$=POPTRACK
Ifc$="#"Then'空栈,直接写入
PUSh**TRACKc$
PUSh**TRACKa$
Else
Do
'是运算符,栈顶退栈
IfISP(c$)>=ISP(a$)Then'栈内运算符优先于该运算符
PUSh**OPERc$
c$=POPTRACK
Else
PUSh**TRACKc$
PUSh**TRACKa$
ExitDo
EndIf
Loop
EndIf
EndIf
Nexti
Fori=1Tooperp
s$=s$+oper$(i):Ifi Nexti s=0:trackp=0 Fori=1Tooperp a$=oper$(i) IfLeft$(a$,1)>="0"AndLeft$(a$,1)