用户:  密码: 记住我     找回密码 
| 文章 >> 编程通用 >> 算法

数学表达式计算器

日期 | 作者lucatabanelli | 浏览86 | 评分100 | 标签算法 评论

{S0}简介
这是另一个数学表达式计算器,使用它可以让用户键入文本格式的表达与三个变量(X,Y,Z),并根据计算的结果变量值。其主要思想
解析文本的功能,并建立一个树状结构,因为数学表达式始终是一个经营者与quot; somethingquot;左和quot; somethingquot;权。"somethingquot;可以是一个变量或一个数字或表达式本身。罪等功能,COS ...特殊的节点,其参数是一个表达式。很简单,是不是?
例如:2 * X - 4/sin(3 * X)根据操作的优先级是一个减法,如果我们建立这样的一棵树... ...
                  -----

                 |  -  |

                  -----

          _______|  |  |_______

         |        -----        |

       -----                 -----

      |  *  |               |  /  |

       -----                 -----

     _|  |  |_             _|  |  |_

    |  -----  |           |  -----  |

  -----     -----       -----     -----

 |  2  |   |  X  |     |  4  |   | sin |

 | nr. |   | var |     | nr. |   |-----|

  -----     -----       -----    |     |

                                  --|--

                                    |

                                  -----

                                 |  *  |

                                  -----

                                _|  |  |_

                               |  -----  |

                             -----     ----- 

                            |  3  |   |  X  |

                            | nr. |   | var |

                             -----     -----

...从左至右扫描树,我们可以读出原始的表达。建筑树
每个节点类型(操作员,操作数,函数)实施适当的类。{C}
我们构建表达式树的运算符优先级这样:函数表达式处理分右左总结|调用的每边的功能任期。功能项处理左MULT |格的权利要求每一方的功能因子。功能因子处理遗留下来的权力的权利,呼吁每边的功能电源。功能电源检测到一个新的表达式(如括号),功能(3个字母),变量,或数字结束工作。 计算结果
一旦我们有树,扫描从左至右计算的结果是相当简单:
Protected Overridable Function GetResult(ByVal objNode As Object) As Decimal

    'calculate the result of the function in terms of x,y,z

    'by recursively scanning the tree from left to right



    If objNode Is Nothing Then Return 0



    If TypeOf objNode Is clsFunction Then

        Select Case objNode.Name.ToLower

            Case "sin"

                Return System.Math.Sin(GetResult(objNode.Argument))

            Case "cos"

                Return System.Math.Cos(GetResult(objNode.Argument))

            Case "tan"

                Return System.Math.Tan(GetResult(objNode.Argument))

            Case "atn"

                Return System.Math.Atan(GetResult(objNode.Argument))

            Case "lne"

                Return System.Math.Log(GetResult(objNode.Argument))

            Case "log"

                Return System.Math.Log10(GetResult(objNode.Argument))

            Case "sqr"

                Return System.Math.Sqrt(GetResult(objNode.Argument))

        End Select

    ElseIf TypeOf objNode Is clsOperator Then

        Select Case objNode.operator

            Case "+"

                Return GetResult(objNode.Left) + GetResult(objNode.Right)

            Case "-"

                Return GetResult(objNode.Left) - GetResult(objNode.Right)

            Case "*"

                Return GetResult(objNode.Left) * GetResult(objNode.Right)

            Case "/"

                Return GetResult(objNode.Left) / GetResult(objNode.Right)

            Case "^"

                Return GetResult(objNode.Left) ^ GetResult(objNode.Right)

        End Select

    ElseIf objNode.isvariable Then

        Select Case objNode.variable

            Case "X"

                Return mX

            Case "Y"

                Return mY

            Case "Z"

                Return mZ

        End Select

    Else

        Return objNode.operand

    End If

End Function

的源代码,为更多的评论。使用代码
dim LtFn as New LTFunctions.Functions

With LtFn

   .Function = "sin(x)+2*p" 

   .X =-1 

   .Y = 0

   .Z = 0

   Messagebox.Show (Format(.Result, "standard"))

End With
关于作者:lucatabanelli


中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:JaykeHuempfner 时间:2011/12/06
喜。当我在这段代码的时候,我感到非常高兴。
这正是我在我的数学程序代码,而且它的工作完美。
好了,经过一个反正一些修改...或者几比几...

我下载的源代码,并给它添加一些代码。我添加的代码给LTFunctions支持:

六个变量 - 最多6个变量,可以在一个函数中使用
。2。黄金比例 - 黄金比例不断增加
。3。更多的功能 - 增加更多的三角函数,小数四舍五入功能,和其他功能
。 4。更好的语法错误处理 - "语法错误"的描述是如何呢?没有太多...一种新的方法称为CheckError返回一个更具描述性的的信息时发生语法错误。

我公布下LGPL许可他人使用,在以往的方式请他们,这些修改。如果你想,你可以下载代码https://sites.google.com/site/jaykerh/programs/ltfunctions-2

编辑:不得不做出确认的网址是正确的
评论会员:。gajatko 时间:2011/12/06
解析器是否支持更多的和其他的命名变量比(X,Y,Z)?或:将它发展到做
?我intrested在物理表达式,包括常量和多个变量。我还需要测试SB的解决方案,使用一个模型 - 给如1000个样本值和测试,如果它们是相同的,计算时认为两个表达式。
这是我的学生,有任务的计划,他们在那里输入一个表达式作为一个答案。简单的例子:"G ・ M ・米/ R ^ 2"或"* SIN(阿尔法)fi0"阿尔法是阿尔法Symbol字体...
评论会员:lucatabanelli 时间:2011/12/06
我张贴了这个解决方案如何表达可以是"存储"成一个树状结构,所以我们可以用它做我们所希望的。获取其结果仅仅是一个例子(下一步可以计算在给定的变量的衍生工具,但有时间???).{ BR}
解析器本身是不是该项目的主要组成部分,它仅支持在测试的形式显示。因此,加入支持瓦尔,consts和功能改善是很容易做到,因为你可以看到在源代码中。
随意修改和使用的源代码,因为你喜欢。

的问候。
评论会员:guyinfun 时间:2011/12/06
结帐的表达式计算器,我在我的{A}使用。它理解为单位,在给定的输入变量。此外,还采用了自动完成功能,告诉用户什么变量(在这种情况下单位)为输入。

由于库的目的是从外部文件(XML)或SQL数据库读取的变量,变量可以很容易地删除或添加的应用程序实例。后来有一天,我计划扩大这个添加的物理常数,因为物理常数的大多不是单位少,所以它们必须在单位的定义,以便表达式可以运行(乘法除了等)。


Grewal
http://www.mycoolaids.com
 文章分类
 桌面
 网页开发
 移动开发
 数据库
 多媒体
 编程语言
 平台,框架和库
 编程通用
 图形/设计
 开发周期
 一般阅读
 第三方产品
 作者资源
 其他
快速解答标签
c x 6850
VC x 7405