我试着做一个代码来计算用户输入的公式的值。也就是说,如果用户输入“10 + 5”,程序将打印出“总和为15”等等。起初,我认为这是一件容易的事,但如果意识到只是使用scanf orsth不会做到这一点。然后我搞砸了数组和循环来查看循环是否在输入中遇到“ - ”或“+”符号,然后将该字符保存在“ - ”或“+”之前,然后计算它,但是我无法做到这一点工作。 你能否请我带着正确的方向来完成这项工作。 非常感谢!计算输入。
计算输入。
回答
这可能非常复杂,特别是当您达到运算符优先级并且您需要正确计算时,例如2 + 5 * 6
,需要将其视为2 + (5 * 6)
。解决这个问题的正确方法是构建表达式树(就像编译器一样)。例如
+
/\
2 *
/\
5 6
通过创建二叉树做到这一点。每个节点都有一个操作和(最多)两个子节点。然后通过遍历表达式树来评估表达式。
你要做的是解析算术表达式,然后评估它们。互联网上有很多东西,所以,因为这是你的功课,我会把你留给谷歌。你的第一个想法,这很容易做,可能是一个天真的想法,但如果你没有太过雄心勃勃,这不是一个非常困难的问题。
谢谢你的回复。我搜索了它,但在搜索10分钟后没有找到任何答案。这可能是因为我真的不知道程序员的终端和使用的技术语言,所以我的搜索非常简单,并且不是很具体。 顺便说一句,这不是我的家庭作业,我只是这样标记它,因为在这个论坛的人以前告诉我,我应该把这些问题作为家庭作业:d。 谢谢。我尝试在网络中搜索解析算术表达式,并查看我能找到的内容。 – geekkid 2012-02-27 17:18:44
看看这里http://stackoverflow.com/questions/4589951/parsing-an-arithmetic-expression-and-building-a-tree-from-it-in-java – scibuff 2012-02-27 17:26:42
这可能有点头大,但你可以做的是使用c和词法分析器的语法引擎。
我相信,它被称为“野牛”和“函数yylex”
从我记得在学校里,它是我们如何让我们的Pascal编译器。
http://en.wikipedia.org/wiki/GNU_bison
创建一棵树后。您可以分析子树,然后根节点将成为子树的总和。
这些可能是你可能要考虑
- 使用函数getline()或与fgets()获得输入
- 从头开始
- 在字符串做两遍,使用一些步骤一个队列为操作员,另一个为操作数(数字)
- 第一遍过程中,您到达*或/,读取下一个数字,对下一个数字和您读取的数字执行操作,并将结果插入队列
- 也第一遍期间,如果你读+或 - ,默默地推动运营商和操作数到它们各自的队列
- 第二阶段手柄+期间-...使用队列会帮助你妥善处理连续弊例如4-3-3
这些都不是确切的步骤,但它是一个启发式值得探讨 - 试图通过这些工作,根据什么对你有意义等
- 1. SSRS:使用输入计算
- 2. jQuery的计算总输入
- 3. 在输入中计算
- 4. 如何计算输入值
- 5. 动态计算输入值
- 6. 字数组输入和输出并计算输入量
- 7. 'SImple'2类Java计算器不接受输入或做计算
- 8. 根据输入的内容计算出价格的Javascript计算
- 9. 的Javascript计算问题时,有计算的输入值
- 10. 像计算器一样计算内部输入
- 11. 找到算法来计算特定输入的具体输出
- 12. Java:计算输入值的次数
- 13. 计算输入字段的总和
- 14. 根据现场输入计算总和
- 15. 用Python计算用户输入时间
- 16. 输入框之间的计算
- 17. 自动计算输入字段值
- 18. 计算输入的abs()值 - Python
- 19. AngularJS - 多结合 - 计算输入值
- 20. 计算总规模文件输入
- 21. 在java连续输入计算器
- 22. 计算文本框的输入值
- 23. 计算器输入是字符串
- 24. TypeError用户输入值的计算
- 25. 计算输入中的元音
- 26. 分数计算器输入错误
- 27. 无限输入的C++计算器
- 28. 显示并计算输入号码
- 29. 重置计算器输入框为js
- 30. 计算字符串输入的长度
表达式求值通常要进行改变它们通过将中缀符号(例如,a + b)转换为后缀符号(例如,ab +),然后对其进行评估。这对初学者来说有点微不足道,但一旦你明白了,这很容易。 – vaisakh 2012-02-27 17:14:15