如何设置数学程序

时间:2010-06-16 13:17:56

标签: c#

我需要编写一个程序(C#),允许用户使用变量和数字创建通用公式。例如:

D = A + (A - C / X)(7.8 - 6.6)
F = E + (E - C / X)(7.8 - 6.6)
FinalResult = (A + D)(0.9) + (E + F)(0.32) + B(0.1) + .023

其中所有变量对我来说都意味着要转到数据库并根据值查找并在其位置返回一个数字。所以A例如是2.12(C和E也是一样)

构建此计划的最佳方式是什么?我如何让我的程序阅读这些公式?

我已经看过一些MathML,但不知道如何开始(或者它的一个例子)

- 更新 -

我提到MathML只是在SO上看到了涉及它的其他一些问题。你们都是对的,我不需要展示它,我只需要确定某人想要的东西并用它来计算一些东西。

我的变量将映射到数据库中的某些内容。例如,A会告诉我使用以下内容:

Vend_Key = 3
Trmnl_Key = 5
Prod_Key = 7

然后用于从数据库返回一个数字。

我需要一个数据库来保存人们创建的公式。我必须有一个可以运行并执行这些功能的计划任务,并将信息保存在其他地方。

2 个答案:

答案 0 :(得分:2)

所以基本上你需要一个计算器?

如果是这样,那么我首先要做的就是搜索&用它们的值替换变量字母,然后你可以使用一些算法来评估表达式,例如首先将它转换为后缀表示法(在算法中更容易评估),使用类似这样的东西(google for infix to postfix algorithm for more and实施例):

  • 从左到右扫描中缀字符串。
  • 初始化空堆栈。
  • 如果扫描的字符是操作数,请将其添加到Postfix字符串。如果扫描的字符是操作符并且堆栈为空则将字符推送到堆栈。

    • 如果扫描的字符是操作数且堆栈不为空,请将字符的优​​先级与堆栈顶部的元素(topStack)进行比较。如果topStack优先于扫描的字符,则弹出堆栈,否则将扫描的字符推送到堆栈。只要stack不为空且topStack优先于字符,就重复此步骤。

    重复此步骤,直到扫描完所有字符。

  • (扫描完所有字符后,我们必须添加堆栈可能具有的任何字符到Postfix字符串。)如果stack不为空,请将topStack添加到Postfix字符串并弹出堆栈。只要堆栈不为空,就重复此步骤。
  • 返回Postfix字符串。

当你准备好后缀字符串时,你可以使用简单的后缀评估算法,它基本上是这样的:

  • 从左到右扫描Postfix字符串。
  • 初始化空堆栈。
  • 如果扫描的字符是操作数,请将其添加到堆栈中。如果扫描的字符是操作符,则堆栈中将至少有两个操作数。

    • 如果扫描的字符是操作符,那么我们将堆栈的最顶层元素(topStack)存储在变量temp中。弹出堆栈。现在评估topStack(Operator)temp。让这个操作的结果是retVal。弹出堆栈并将retVal推入堆栈。

    重复此步骤,直到扫描完所有字符。

  • 扫描完所有字符后,堆栈中只有一个元素。返回topStack。

topStack将是你表达的结果。

答案 1 :(得分:0)

我正在开发一个我自己的项目,它也是用户输入的公式。我一直在计划工作的方式是解析各种字母。然后做一个表达式树。

每个运算符都有2个值。创建一个包含2个值和运算符类型的类。 2个值可以是值或更多运算符。当您评估树时,它将调用顶级操作员,该操作员将调用其子项,并调用其子项等等,直到评估完成并返回结果。

用于读取:获取传递给程序的字符串并开始解析它。首先扫描乘法和除法。在这些情况下,您可以简单地转换为单个值,与括号相同。输入这些值后,立即搜索加法和减法。将这些输入到表达式树中,然后让孩子们拥有。完成后,你就可以在表达式树中得到整个方程式。