【问题标题】:How to input a mathematical expression from keyboard? [closed]如何从键盘输入数学表达式? [关闭]
【发布时间】:2014-02-09 10:35:59
【问题描述】:

我有一个简单的 C 程序

int main()
{

    int n, maxn = 21;
    float SN, x;

    printf("input x:");
    scanf("%f", &x);

    printf("input maxn:");
    scanf("%d", &maxn);

    for(n=0;n<=maxn;n++){
        SN = SN + pow(x,n);
        n = n + 1;
    }

    printf("%f", SN);
    getch();
    return 0;
}

我需要使它具有通用性,以便用户可以输入任何表达式以用用户从键盘输入的任何内容替换 pow(x, n)。如何将表达式放入程序中?

【问题讨论】:

  • 有一个工具可以完全满足您的需求。它被称为 bc 并且它是免费软件ftp.gnu.org/gnu/bc 检查 url 并查看源代码是如何解析数学表达式的。如果您使用的是 windows,您可能必须使用 cygwin 来获取它的预编译版本。
  • 理论上有可能通过使用动态链接库来做与eval 类似的事情。您可以从用户字符串生成一个简单的代码,将其编译为动态库并加载到您的程序中。它闻起来像黑客,你需要在执行代码的机器上安装一个兼容的编译器。这个问题被搁置了,否则我会发布一个演示代码......

标签: c++ c


【解决方案1】:

C 和 C++ 不向您提供这个已经实现的功能,因为在编译时间(当表达式被语法分析时)和运行时间(当它们被评估时)之间有一个明确的界限。

为表达式实现解析器和编译器/求值器是一个很好的练习,但它并非微不足道,并且可能需要比您目前拥有的更多经验(鉴于您提出的问题)。

在我看来,解决这个问题的最容易理解的方法是 recursive descent parser,但对于四个操作、数字和变量,我猜它需要一百左右的代码。

yacc and bison 是旨在根据语法定义自动生成解析/评估代码的工具。我个人更喜欢手写解析器,因为您可以获得更好的控制(尤其是在错误处理或句法和语义级别交互时,但那是我,我也是 NIH syndrome 的一个坏例子)。

Python 或 Javascript 等更高级的语言为您提供此功能,该功能已经实现为 eval

【讨论】:

  • 是否有现有的图书馆可以帮助我?
  • @Euphe:这个问题的历史工具是 yacc/bison,请参阅编辑后的答案以获得一些描述链接。
  • 你有没有检查过你可以用提升精神做什么...stackoverflow.com/a/21419351/1000282
  • boost::spirit 卸载给刚开始编程的人太过分了。
  • @Alex: boost.spirit 对于任何人来说都是个坏主意。在我看来,这是一个惊人的例子,说明聪明的人可以在不知不觉中走多远。
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多