乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 117|回复: 4

[原创]用VB实现字符形式的表达式的计算.

[复制链接]

2

主题

77

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2003-10-29 10:04:00 | 显示全部楼层 |阅读模式
有时需要计算以字符串保存的数学表达式,又没有直接的函数可供调用,但可以根据表达式的运算规则编制这样的模块程序来实现.
原理:
1.建立两个堆栈,并自左至右扫描表达式;
2.如遇操作数,一律压入堆栈;
3.如遇操作符,如优于栈顶操作符,则压入堆栈,否则以操作符栈顶的操作符计算数据栈顶的两个操作数,以此类推.
CalExp类(3K)
主函数如下:
  1. Option Explicit
  2. '
  3. '
  4. '---------------------------------
  5. 'Class  :CalExp
  6. '
  7. 'Program:zeng29
  8. 'Date   :2003/10/25
  9. 'Ver.   :1.0.0
  10. '
  11. '---------------------------------
  12. '
  13. '
  14. Private Const cPi = 3.14159265358979
  15. Private Const cE = 2.71828182845905
  16. Public Function CalExpression(sExp As String) As Variant
  17.     Dim ReadPoint As Integer, i As Integer, j As Integer, sChar As String
  18.     Dim sOpArray As Variant, iOpPower As Variant, sFunArray As Variant
  19.     Dim DataStack() As Double, OpStack() As String
  20.     Dim sCurOP As String, iIndex As Integer, iFlag As Integer, sPara As String
  21.     Dim sFunName As String, vRet As Variant
  22.     Dim dData1 As Variant, dData2 As Variant, sOp As String
  23.    
  24.     '初始化...
  25.     ReDim DataStack(0)
  26.     ReDim OpStack(0)
  27.     sOpArray = Array("+", "-", "*", "/", "^", "%")
  28.     iOpPower = Array(1, 1, 3, 3, 4, 2)
  29.     sFunArray = Array("sin", "cos", "tan", "asin", "acos", "atn", "abs", "ln", "pi", "e")
  30.     ReadPoint = 1
  31.    
  32.     While ReadPoint  0 And i  ReadPoint Then sPara = sPara & sChar
  33.             Next i
  34.             If iFlag  0 Then
  35.                 CalExpression = "错误的表达式:括号不成对!"
  36.                 Exit Function
  37.             End If
  38.         
  39.         '读取数值...
  40.         ElseIf IsNumeric(sChar) Or sChar = "." Or (ReadPoint = 1 And (sChar = "+" Or sChar = "-")) Then
  41.             sPara = ""
  42.             For i = ReadPoint To Len(sExp)
  43.                 sChar = Mid(sExp, i, 1)
  44.                 If IsNumeric(sChar) Or sChar = "." Or (i = 1 And (sChar = "+" Or sChar = "-")) Then
  45.                     sPara = sPara & sChar
  46.                 ElseIf IsNumeric(sPara) Then
  47.                     PushToStc DataStack, sPara
  48.                     ReadPoint = i
  49.                     Exit For
  50.                 Else
  51.                     CalExpression = "非法的表达式:" & sPara & sChar
  52.                     Exit Function
  53.                 End If
  54.             Next i
  55.             If i > Len(sExp) And IsNumeric(sPara) Then PushToStc DataStack, sPara
  56.             ReadPoint = i
  57.         Else
  58.             vRet = GetIndex(sOpArray, sChar)
  59.             
  60.             '读取操作符...
  61.             If vRet  "Null" Then
  62. ReCheck:
  63.                 If PopFromStc(OpStack, False) = "Null" Then
  64.                     PushToStc OpStack, sChar
  65.                 Else
  66.                     If iOpPower(vRet) > iOpPower(GetIndex(sOpArray, PopFromStc(OpStack, False))) Then
  67.                         PushToStc OpStack, sChar
  68.                     Else
  69.                         dData2 = PopFromStc(DataStack)
  70.                         dData1 = PopFromStc(DataStack)
  71.                         sOp = PopFromStc(OpStack)
  72.                         PushToStc DataStack, ProCal(dData1, dData2, sOp)
  73.                         GoTo ReCheck
  74.                     End If
  75.                 End If
  76.             Else
  77.             
  78.                 '读取函数...
  79.                 vRet = Asc(LCase(sChar))
  80.                 If vRet >= Asc("a") And vRet = Asc("a") And vRet  0 And (j  i) Then sPara = sPara & sChar
  81.                             Next j
  82.                             If iFlag  0 Then
  83.                                 CalExpression = "错误的表达式:括号不成对!"
  84.                                 Exit Function
  85.                             End If
  86.                         End If
  87.                         If i = Len(sExp) And sFunName  "" Then
  88.                             CalExpression = "函数的用法:函数名([参数])"
  89.                             Exit Function
  90.                         End If
  91.                     Next i
  92.                 Else
  93.                     CalExpression = "错误的表达式:不知道的操作符:" & sChar
  94.                     Exit Function
  95.                 End If
  96.             End If
  97.             ReadPoint = ReadPoint + 1
  98.         End If
  99. ReadNext:
  100.     Wend
  101.    
  102.     '运算最终结果...
  103.     If UBound(DataStack) = 1 Then
  104.         CalExpression = PopFromStc(DataStack)
  105.     Else
  106.         Do
  107.             dData2 = PopFromStc(DataStack)
  108.             dData1 = PopFromStc(DataStack)
  109.             sOp = PopFromStc(OpStack)
  110.             If IsNumeric(dData1) And IsNumeric(dData2) And sOp  "Null" Then
  111.                 PushToStc DataStack, ProCal(dData1, dData2, sOp)
  112.             Else
  113.                 CalExpression = "非法的表达式!"
  114.                 Exit Function
  115.             End If
  116.         Loop Until PopFromStc(OpStack, False) = "Null"
  117.         CalExpression = PopFromStc(DataStack)
  118.     End If
  119. End Function

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

26

主题

177

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
281
发表于 2003-11-29 21:49:00 | 显示全部楼层
怎么用?
我导入模块后写
k="2*3"
msgbox calexpression(k)
不能运行,显示:函数未定义。
我把calex类模块的内容全部复制到自己建立的模块1时,就可以使用了。
回复

使用道具 举报

6

主题

60

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
84
发表于 2003-12-1 15:01:00 | 显示全部楼层
这与数据结构里面的算符优先算法很相似阿~~~~
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2010-7-30 11:50:00 | 显示全部楼层
cvbndvhcnddfd
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2018-2-3 20:35:00 | 显示全部楼层
表达式可用于CAD的常用计算中,好!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 08:05 , Processed in 0.560255 second(s), 67 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表