四则运算(抢分吧)

fvflove 2008-07-15 04:43:53
大家都知道四则运算吧.
我的问题怎么用VB进行四则混合运算:
所要求支持的运算符有以下:
1. + - * /
2. \(模运算) ^(多少次方)
3. ()括号
4.运算顺序.先括号,再多少次方\模运算,再* / 再+ -
5.要求自己学算法.(不能调用其它地方的比如JAVE)
6.要先将四则运算表达式(中缀表达式)转换为前缀或后缀表达式.(如果你不用前缀或后缀表达示,直接通过中缀表达式进行计算.我再加50分)
7.通过转换后的表达式进行计算.
8.以上一切要用VB代码,可以用的,不支持伪代码.
...全文
235 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
armbrave 2008-07-20
  • 打赏
  • 举报
回复
vansoft
我不得不说,你发的这个代码,写得有点多余,
Exit function 和 if ..<> 0
你能不能合在一起啊,代码要简洁点啊
fvflove 2008-07-17
  • 打赏
  • 举报
回复
张郎:
你的解决方案不错.从那里找到了.可能自己也不知道了吧.
vansoft
不是你自己的也应该说明出处啊.
游子 2008-07-17
  • 打赏
  • 举报
回复
我是来学习的。
熊孩子开学喽 2008-07-16
  • 打赏
  • 举报
回复
编译原理里面的东西,也不是什么新鲜事,
如果楼主是想要个解决方案,那么用楼上提到的那个SCRIPT的东西是最方便的了.
以前还见过用EXCEL对象来实现四则运算的,也差不多.
CathySun118 2008-07-16
  • 打赏
  • 举报
回复
Dim Num1, Num2 As Double '操作数
Dim StrNum1, StrNum2 As String
Dim FirstNum As Boolean '判断是否是数字开头
Dim PointFlag As Boolean '判断是否已有小数点
Dim RunSign As Integer '储存运算符号
Dim SignFlag As Boolean '判断是否已有运算符号
Dim equal As Double '运算结果
Dim equalflag As Boolean '运算结果有无标志 因为计算结果不能用退格按钮
Dim OffSign As Boolean '计算器关闭标志

Private Sub Command1_Click(Index As Integer)
If OffSign = False Then '计算器已打开
If Index = 16 Then '清除按钮
Call ClearData
Else
Select Case Index
Case 0 To 9
If FirstNum Then '如果是第一个字符
StrNum1 = Right(Str(Index), 1)
FirstNum = False
Else
If Len(StrNum1) <= 25 Then
StrNum1 = StrNum1 + Right(Str(Index), 1)
End If
End If
txtShow.Text = StrNum1
Case 10
If Not PointFlag Then '如果没有小数点
If FirstNum Then
StrNum1 = "0."
FirstNum = False
Else
StrNum1 = StrNum1 + "."
End If
Else '已有小数点
Exit Sub
End If
PointFlag = True
txtShow.Text = StrNum1
Case 12 To 15 '+ - × ÷
FirstNum = True '使下一次可以输入新数据
PointFlag = False '还原标记值

If SignFlag Then '前面已有运算符未运算
Call Run
Else
SignFlag = True
StrNum2 = StrNum1 '把字符串1复制给字符串2
StrNum1 = "" '字符串1清空
End If
RunSign = Index - 11 '储存键入的运算符
Case 11 '+/-
If txtShow.Text <> "0" And txtShow.Text <> "0." Then
If Left(txtShow.Text, 1) = "-" Then
txtShow.Text = Right(txtShow.Text, Len(txtShow.Text) - 1)
Else
txtShow.Text = "-" & txtShow.Text
End If
End If
StrNum1 = txtShow.Text
Case 16 '清除按钮
Call ClearData
Case 17 '退格
If Not equalflag And txtShow.Text <> "" And txtShow.Text <> "0." Then
txtShow.Text = Left(txtShow.Text, Len(txtShow.Text) - 1)
StrNum1 = txtShow.Text
End If
Case 18 '=
If Not SignFlag Then
equal = txtShow.Text
FirstNum = True
PointFlag = False
equalflag = True
Else
Call Run
SignFlag = False
equalflag = True
End If
End Select
End If
Else
OffSign = True '计算器已关闭
Exit Sub
End If
End Sub


Private Sub Command2_Click(Index As Integer)
Select Case Index
Case 0
OffSign = False
txtShow.Text = "0."
Command2(0).Enabled = False
Command2(1).Enabled = True
Case 1
OffSign = True
txtShow.Text = ""
FirstNum = True
Command2(1).Enabled = False
Command2(0).Enabled = True
End Select
End Sub
Private Sub Form_Load()
Me.Top = 3500
Me.Left = 5500
Num1 = 0
Num2 = 0
StrNum1 = ""
StrNum2 = ""
FirstNum = True '开头数字
PointFlag = False '小数点
RunSign = 0
SignFlag = False '无运算符号
equalflag = False '无计算结果
OffSign = True '关闭
Command2(0).Enabled = True
Command2(1).Enabled = False
End Sub
Public Sub Run()
Dim ch As String
Num1 = Val(StrNum2)
Num2 = Val(StrNum1)
On Error GoTo Err:
Select Case RunSign
Case 1 '加
equal = Num1 + Num2
Case 2 '减
equal = Num1 - Num2
Case 3 '乘
equal = Num1 * Num2
Case 4 '除
equal = Num1 / Num2
End Select
StrNum2 = Trim(Str(equal))
If Left(StrNum2, 1) = "." Then
StrNum2 = "0" + StrNum2
ElseIf Left(StrNum2, 2) = "-." Then
StrNum2 = "-0." + Right(StrNum2, Len(StrNum2) - 2)
End If
StrNum1 = StrNum2
txtShow.Text = StrNum2
FirstNum = True '计算结果后复位标志
Exit Sub
Err:
txtShow.Text = "除数不能为0"
OffSign = True
End Sub
Public Sub ClearData()
Num1 = 0
Num2 = 0
StrNum1 = ""
StrNum2 = ""
FirstNum = True
PointFlag = False
RunSign = 0
SignFlag = False
txtShow.Text = "0."
OffSign = False
equalflag = False
End Sub
Private Sub mnuAbout_Click()
frmAbout.Show
End Sub
Private Sub mnuExit_Click()
Unload Me
End Sub

zhufenghappy 2008-07-16
  • 打赏
  • 举报
回复
判断左右括号个数是否相同可以
If UBound(Split(Expression, "(")) <> UBound(Split(Expression, ")")) Then
MsgBox "左右括号个数不相等!"
'作退出处理
End If
Expression是字符串。
其他问题具体分析阿。
东方之珠 2008-07-16
  • 打赏
  • 举报
回复
你的问题就是用VB计算表达式.
引用 MS Script Control 1.0

Dim Evals As New ScriptControl
Evals.Language = "VBScript"
MsgBox Evals.Eval("1+2*(3+1)")
smalle 2008-07-16
  • 打赏
  • 举报
回复
楼主得先去看看编译原理?
fvflove 2008-07-16
  • 打赏
  • 举报
回复
不错.能写到这样,都不错.
可是有一个不如意的地方.
如果表达式错误不能发现.

如:
"1+2*(3+1))"
如多了一个")"

或其它一些问题.

72小时的时间,一定给你分.
vansoft 2008-07-16
  • 打赏
  • 举报
回复
Option Explicit

Private Function Eval(ByVal s As String) As Variant
Dim Lb As Long, Rb As Long
Lb = InStrRev(s, "(")
While Lb <> 0
Rb = InStr(Lb, s, ")")
s = Replace(s, Mid$(s, Lb, Rb - Lb + 1), CStr(Eval(Mid$(s, Lb + 1, Rb - Lb - 1))))
Lb = InStrRev(s, "(")
Wend
If IsNumeric(s) Then
Eval = Val(s)
Else
Dim High As Long
High = InStr(s, "+")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) + Eval(Right$(s, Len(s) - High))
Exit Function
End If
High = InStrRev(s, "-")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) - Eval(Right$(s, Len(s) - High))
Exit Function
End If
High = InStr(s, "*")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) * Eval(Right$(s, Len(s) - High))
Exit Function
End If
High = InStrRev(s, "/")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) / Eval(Right$(s, Len(s) - High))
Exit Function
End If
High = InStrRev(s, "%")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) Mod Eval(Right$(s, Len(s) - High))
Exit Function
End If
High = InStrRev(s, "!=")
If High <> 0 Then
Eval = Eval(Left$(s, High - 1)) <> Eval(Right$(s, Len(s) - High - 1))
Exit Function
End If
High = InStrRev(s, "==")
If High <> 0 Then
Eval = (Eval(Left$(s, High - 1)) = Eval(Right$(s, Len(s) - High - 1)))
Exit Function
End If
End If
End Function

'主函数
Public Sub main()
Dim Expression As String
Expression = "149.5+((100+(6+(90-5*2*2)*4+(1-1))+202)%441)*2*2+0.88+150.5"
MsgBox Eval(Expression)
End Sub
dbcontrols 2008-07-16
  • 打赏
  • 举报
回复
支持

[Quote=引用 8 楼 chenjl1031 的回复:]
你的问题就是用VB计算表达式.
引用 MS Script Control 1.0

Dim Evals As New ScriptControl
Evals.Language = "VBScript"
MsgBox Evals.Eval("1+2*(3+1)")
[/Quote]
fvflove 2008-07-15
  • 打赏
  • 举报
回复

5.要求自己学算法.(不能调用其它地方的比如JAVE)

zzyong00 2008-07-15
  • 打赏
  • 举报
回复
呵呵,有个简单的scriptcontrol
fj182 2008-07-15
  • 打赏
  • 举报
回复
你真强悍,估计也是无满意答案结贴。
fvflove 2008-07-15
  • 打赏
  • 举报
回复
VB 论坛里面没有人敢接招吗?

72小时后.如果没有好的解决方案,以无满意答案结贴.

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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