-1

这是对这个问题的跟进。在这一点上,我希望程序自己识别变量,然后向用户询问变量值 .so 而不是看起来像:

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    

该程序的功能应如下所示:

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

your variables are : X1,X2,Y    

now Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    

所以用户不再需要告诉机器变量是什么。怎么能做到这一点?

我已经检查了这个问题,但它与我需要的完全不同,而且它也在 python 中

更新:特别是我想迭代调车场算法,以便它可以找到变量。我在 http://paste.ubuntu.com/9999494/下面放了一个解析器代码的链接

4

2 回答 2

0

您应该存储所有函数的名称,然后查找所有既不是函数也不是数字的参数。

因此,当您扫描 input 时ADD(X, DIV(3, Y)),它应该检测到ADDandDIV是函数,而 3 是一个数字。这留下了 X 和 Y,因此它们必须是变量。基本上,每当您检测到一个括号时,您应该寻找匹配的右括号,然后在逗号处拆分这些括号的内容并评估每个部分。如果某个部分既不是数字也不是函数,则它必须是变量。

于 2015-02-01T10:36:07.827 回答
0

我建议使用以下算法:

  1. 将文本拆分为由 '(', ')' 或 ',' 分隔的标记
  2. 搜索过滤掉已知函数和数字的标记
  3. 剩下的都是变量

这是使用 Java 8 流的可能实现:

List<String> getVariables(String expression, List<String> functions) {
    return Collections.list(new StringTokenizer(expression, "(),")).stream()
        .map(Object::toString)
        .filter(token -> !functions.contains(token))
        .filter(token -> !token.matches("\-?\d+\.?\d*"))
        .collect(Collectors.toList());
}
于 2015-02-01T11:33:54.623 回答