读取数学函数 f(x,y) 命令行参数的最佳方法是什么?

What's the best way to read a mathematical function f(x,y) command line argument?

main()开始,我希望用户通过命令行输入一个数学函数(I,e: 2xy)。从那里开始,我最初想遍历字符串并解析出不同的算术运算符 x、y 等。但是,对于更复杂的函数,这可能会变得相当复杂,(例如:(2x^2)/ 5 +sqrt(x^4) )。是否有更通用的方法能够解析像这样的数学函数字符串?

处理此类解析问题最有用的方法之一是将输入法从类似方程式切换到基于 RPN 的输入,其中参数在前,运算符在后。

重写你的复杂方程式最终看起来像:

2 2 x ^ * 5 / x 4 ^ sqrt +

这通常更容易实现,因为您可以使用一个简单的堆栈来实现——压入新参数,同时运算符将需要的部分从堆栈中拉出并将结果放回。大大简化了解析,但还是需要实现功能。

你需要的是一个表达式计算器

不久前,我为嵌入式系统上的命令行处理器和脚本语言编写了一个完整的 C 表达式求值器(即使用 C 语法编写的求值表达式)。我使用 this 算法描述作为起点。你可以直接使用附带的代码,但我不喜欢实现,并根据算法描述编写了自己的代码。

它需要做一些工作来支持所有 C 运算符、函数调用和变量,但这是一个清晰的解释,因此是一个很好的起点,特别是如果您不需要那种程度的完整性。

基本原理是表达式求值对于使用堆栈的计算机来说更容易 'Reverse Polish Notation',因此该算法将具有相关优先级和括号顺序的 in-fix 表示法表达式转换为 RPN,然后求值它通过弹出操作数、执行操作和推送结果,直到堆栈上没有剩余操作和一个值。

如果您选择处理隐式乘法运算符(例如 2xy 而不是 2 * x * y,它可能会变得更复杂一些。尤其是因为您需要明确地区分变量 xy 来自单个变量 xy。这可能只有在您只允许单个字符变量名称时才可行。我建议您要么这样做,然后在运算符堆栈中插入显式乘法运算符解析的一部分,或者您不允许隐式乘法。