2012-02-27 110 views
1

我试着做一个代码来计算用户输入的公式的值。也就是说,如果用户输入“10 + 5”,程序将打印出“总和为15”等等。起初,我认为这是一件容易的事,但如果意识到只是使用scanf orsth不会做到这一点。然后我搞砸了数组和循环来查看循环是否在输入中遇到“ - ”或“+”符号,然后将该字符保存在“ - ”或“+”之前,然后计算它,但是我无法做到这一点工作。 你能否请我带着正确的方向来完成这项工作。 非常感谢!计算输入。

+1

表达式求值通常要进行改变它们通过将中缀符号(例如,a + b)转换为后缀符号(例如,ab +),然后对其进行评估。这对初学者来说有点微不足道,但一旦你明白了,这很容易。 – vaisakh 2012-02-27 17:14:15

回答

2

这可能非常复杂,特别是当您达到运算符优先级并且您需要正确计算时,例如2 + 5 * 6,需要将其视为2 + (5 * 6)。解决这个问题的正确方法是构建表达式树(就像编译器一样)。例如

+ 
/\ 
2 * 
/\ 
    5 6 

通过创建二叉树做到这一点。每个节点都有一个操作和(最多)两个子节点。然后通过遍历表达式树来评估表达式。

+0

谢谢你的回答。我试图谷歌它的更多信息,因为即时通讯只是一个初学者,并不完全明白该怎么做。 – geekkid 2012-02-27 17:21:42

+0

@vaisakh提到的首先查询中缀,前缀和后缀符号以及如何从一个转换到另一个;使用后缀/前缀符号进行评估确实更容易,因为您可以免费获得运算符优先级 – scibuff 2012-02-27 17:23:16

2

你要做的是解析算术表达式,然后评估它们。互联网上有很多东西,所以,因为这是你的功课,我会把你留给谷歌。你的第一个想法,这很容易做,可能是一个天真的想法,但如果你没有太过雄心勃勃,这不是一个非常困难的问题。

+0

谢谢你的回复。我搜索了它,但在搜索10分钟后没有找到任何答案。这可能是因为我真的不知道程序员的终端和使用的技术语言,所以我的搜索非常简单,并且不是很具体。 顺便说一句,这不是我的家庭作业,我只是这样标记它,因为在这个论坛的人以前告诉我,我应该把这些问题作为家庭作业:d。 谢谢。我尝试在网络中搜索解析算术表达式,并查看我能找到的内容。 – geekkid 2012-02-27 17:18:44

+0

看看这里http://stackoverflow.com/questions/4589951/parsing-an-arithmetic-expression-and-building-a-tree-from-it-in-java – scibuff 2012-02-27 17:26:42

1

这可能有点头大,但你可以做的是使用c和词法分析器的语法引擎。

我相信,它被称为“野牛”和“函数yylex”

从我记得在学校里,它是我们如何让我们的Pascal编译器。

http://en.wikipedia.org/wiki/GNU_bison

创建一棵树后。您可以分析子树,然后根节点将成为子树的总和。

0

这些可能是你可能要考虑

  • 使用函数getline()或与fgets()获得输入
  • 从头开始
  • 在字符串做两遍,使用一些步骤一个队列为操作员,另一个为操作数(数字)
  • 第一遍过程中,您到达*或/,读取下一个数字,对下一个数字和您读取的数字执行操作,并将结果插入队列
  • 也第一遍期间,如果你读+或 - ,默默地推动运营商和操作数到它们各自的队列
  • 第二阶段手柄+期间-...使用队列会帮助你妥善处理连续弊例如4-3-3

这些都不是确切的步骤,但它是一个启发式值得探讨 - 试图通过这些工作,根据什么对你有意义等