计算输入。

时间:2012-02-27 17:08:23

标签: c

我尝试制作一个代码来计算用户输入的公式的值。即,如果用户输入“10 + 5”,程序将打印“总和为15”等。首先,我认为这是一件容易的事,但如果意识到只使用scanf orsth就不会做。然后我乱搞数组和循环,看看循环是否在输入中遇到“ - ”或“+”符号,然后在“ - ”或“+”之前保存字符,然后再计算它,但我无法做到这一点工作要么。 能否请您指导我如何完成这项工作。 非常感谢你!

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

  +
 / \
2   *
   / \
  5   6

您可以通过创建二叉树来完成此操作。每个节点都有一个操作和(最多)两个子节点。然后通过遍历表达式树来评估表达式。

答案 2 :(得分:1)

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

我相信它被称为“BISON”和“YYLEX”

从我在学校里记得的,我们是如何制作我们的pascal编译器的。

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

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

答案 3 :(得分:0)

这些可能是您可能需要考虑的一些步骤

  • 使用getline()或fgets()
  • 获取输入
  • 从头开始阅读字符串
  • 执行两次传递,对操作符使用一个队列,为操作数(数字)使用另一个队列
  • 在第一次通过期间,您到达*或/,读取下一个号码,对下一个号码和您之前读取的号码执行操作,并将结果插入队列
  • 也是在第一次通过期间,如果您读取+或 - ,则将操作员和操作数静默地推入各自的队列
  • 在第二阶段句柄+和-...使用队列将帮助您正确处理连续的弊端,例如4-3-3

这些不是精确的步骤,但它是一种值得研究的启发式方法 - 尝试解决这些问题,根据对您有意义的方式进行更改等。