繁体   English   中英

计算器问题

[英]calculator issue

我想设计一个特殊的计算器..,我遇到了这样的问题:X = 1 +(12 * 4 + 2)我需要首先获取操作数的数量,例如这里我有两个操作数1和(12 * 4 + 2)我如何区分外+和内+?

谢谢

这里真是个很棒的社区..从最简单到最难的问题都有不同的答案。。盖茨我的问题不是计算器也不是与数学有关的任何其他问题。

我正在用Java实现统一算法(就像当您给它两个表达式时Prolog解释器所做的一样)

这是算法:

function unify(E1, E2);
    begin
        case
            both E1 and E2 are constants or the empty list:
                if E1 = E2 then return {}
                else return FAIL;
            E1 is a variable:
                if E1 occurs in E2 then return FAIL
                 else return {E2/E1}
            E2 is a variable
                if E2 occurs in E1 then FAIL
                    else return {E1/E2}
            either E1 or E2 are empty then return FAIL
            otherwise:
                begin
                    HE1 := first element of E1;
                    HE2 := first element of E2;
                    SUBS1 := unify(HE1, HE2);
                    if SUBS1 := FAIL then return FAIL;
                    TE1 := apply(SUBS1, rest of E1);
                    TE2 := apply(SUBS1, rest of E2);
                    SUBS2 := unify(TE1, TE2);
                    if SUBS2 = FAIL then return FAIL;
                         else return composition(SUBS1, SUBS2)
                end
            end

现在我的问题是我是否有这样的输入:a(X,Y)= a(b(c,Y),Z)。

我如何提取元素的数量(和值)(即第一个Expression的X和Y)

当我阅读并尝试解决此问题时,我遇到了不同的新技术..例如词法分析,语法分析,尽管我知道语法分析和标记(以字符串方式),但我对词法分析没有任何线索,而且我认为这不会解决我的问题。问题..我现在正在尝试实现乔伊·亚当斯所说的..我认为这对我的问题很有用..

这篇文章的家伙很抱歉...谢谢您的帮助

您的问题非常笼统,完整的答案可能需要占用一本书的几章。

话虽如此,我建议您从谷歌搜索开始,先学习一些术语,然后学习以下内容:

标记化解析 (从字符串中提取单个组件。)

中缀评估 (采用一对操作数和一个中间运算符并存储答案)

Postfix评估 (采用一对操作数和一个后继运算符-尚无道理,但可能需要阅读一些之后。)

..和进一步阅读:

编译器设计

...当您遇到特定问题时,请继续访问此网站。 不要忘记搜索与您已经提出的类似问题的答案!

为了解析简单的数学表达式,我有一个稍微不合常规但易于实现的解决方案:创建一个二叉树,并将每个标记逐一推入树中。 例:

X

  =
 /
X

  =
 / \
X   1

  =
 / \
X   +
   /
  1

  =
 / \
X   +
   / \
  1   (

  =
 / \
X   +
   / \
  1   (
       |
       12

  =
 / \
X   +
   / \
  1   (
       |
       *
      /
     12

  =
 / \
X   +
   / \
  1   (
       |
       *
      / \
     12  4

  =
 / \
X   +
   / \
  1   (
       |
       +
      /
     *
    / \
   12  4

  =
 / \
X   +
   / \
  1   (
       |
       +
      / \
     *   2
    / \
   12  4

  =
 / \
X   +
   / \
  1   ( )
       |
       +
      / \
     *   2
    / \
   12  4

推送的算法是:将新令牌作为子代放置在最后插入的令牌的右侧,然后使其向上浮动,直到满足操作顺序为止(较低的优先级高于较高的优先级,并且没有任何内容高于开放的括号(即'('),直到关闭为止(即'(... ...)')。

这是我在eC中这种解析器的实现: http ://www.funsitelots.com/pub/ecas0.zip。 您将需要Ecere SDK来构建它。 在form1.ec中查看PushOperator方法。 很抱歉,这不是世界上最容易阅读的代码。

我来看看口译员设计模式 谷歌以计算器为“模式”,并有不错的命中率,例如这个

这是我通过研究@Bob Kaufman的答案发现的一个奇妙链接:

users.cis.fiu.edu/~weiss/dsj2/code/Evaluator.java

这只是代码。 这是详细的说明(尽管它使用的是C ++,但是逻辑完全相同): http : //www.lawrence.edu/fast/greggj/CMSC270/Infix.html

您可以采用的一种方法是生成一个将运算符和运算符都提取出来的正则表达式。

您也可以看看一些用Java编写的公式引擎,例如JFormula(也有其他引擎)。 它们将具有公式所需的自己的语法,并且可能仍涉及某些解析,但是您将能够通过引擎处理数学表达式和计算顺序。

这是一个非常糟糕的解决方案,请执行其他所有人建议的操作-阅读该模式。 但是,仅仅为了使它正常工作,您也许可以做类似的事情

1 - remove all decimals and periods from the input
2 - Use a regular expression to find / remove any parenthesis and the stuff in between them
3 - Use the remaining operations to guess at the number of operands

For example
Your input : 
1+(12*4+2)
1 - remove all #'s and .'s
  +(*+)
2 - remove all ()'s and internals
  +
3 - guess number of operands
  1 operation, so 2 operands

就像我说的那样,这很糟糕,并且很容易失败。 但是,这可能足以让您入门。 在使用了一段时间后,您将开始发现问题,并有望开始理解为什么需要更强大的解决方案。

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM