C++如何展开/因式分解方程(不用求解)

3
我是C++的初学者,正在试图找到一种函数,能够“扫描”输入以检测所输入的方程类型。
基本上,我想输入像(a-b)^2这样的内容,程序会将其展开为a^2-2*a*b+b^2;或者输入ax^2+by+c,程序会给我a(x-α)+β
之前我做的是简单地询问将要输入何种类型的方程,然后具体询问每个因子是什么(如下所示):
int a, a2;
int b, b2;
int inbetween;
cout << "Equation of type (ax+by)^2.\nPlease enter the factor of X : ";
cin >> a;
cout << "Please enter the factor of Y : ";
cin >> b;
a2 = a*a; //pow(a,2)
b2 = b*b; //pow(b,2)
inbetween = 2*a*b;
cout << "(" << a << "x + " << b << "y" << ")^2 = " << a2 << "x + " << inbetween << "xy + " << b2 << "y\n";
// (ax + by)^2 = a^2x + 2*a*b*xy + b^2y

但这正是我不想做的。

我想知道是否有一种方法可以扩展编码程序支持的任何类型的方程输入。

我希望我的表达清晰,英语并不是我的主要语言,我意识到我试图传达的内容并不是很清晰。


请搜索 [softwarerecs.se]。在StackOverflow上,软件推荐不属于讨论范围。 - Thomas Matthews
1
@ThomasMatthews 我觉得Fast Banana只是在问是否有解决这个问题的简单方法,而不是询问要使用什么技术。 - adentinger
1
实现一个函数来检测输入表达式的数学顺序和其他特征最可靠的方法是使用像boost的spirit这样的常用工具编写表达式解析器。然而,这并不一定是新手的任务。但你总得学会些什么。 - JimmyNJ
是的,我确实正在寻找“表达式解析器”,就像@JimmyNJ所说的那样。现在我会研究一下这个主题,非常感谢。 - SecureCake
也许你可以查询现有的网络服务,比如 Wolfram Alpha 或类似的网站提供了 API。我猜编写一个表达式解析器需要很多时间... - nonsensation
2个回答

3

你的问题已经很清楚了(在我看来,这实际上是一个非常有趣的问题)。

是的,这是可能的,但据我所知,没有简单的方法可以做到这一点;你需要自己编写程序。我认为你的程序已经很好了。

有一个叫做语言理论的数学领域,研究刚才你提出的问题。为了给你一个解决这种问题的思路,最好的方法是编写自己的语法。在编写解析器之前,你需要正式阐述语法规则,并使用正则表达式实现规则(然后你就会有两个问题了 ;D )。

从你的问题来看,这将需要大量编程,比如说95%的代码将用于确定表达式的类型并提取值,剩下的5%只是用于展开或因式分解。对于一个简单的程序来说,这是过度努力了,如果你问我的话。


你提供的这两个链接非常有趣!我正在查看正则表达式,但那些恰好是我需要的东西吗?从我浏览的简要内容来看,它们与我所需的完全对应,我将深入研究这些和Boost的Spirit,谢谢你和@JimmyNJ。 - SecureCake
@FastBanana 正如我在答案中提到的,我只是为了让你理解如何解决这种问题而进行了解释。如果你是C++的初学者,我建议你先学习基础知识,然后再深入研究像正则表达式这样更高级的东西。我会说,如果你还感兴趣的话,几个月后再回来学习正则表达式。 - adentinger

2
我认为Anthony D.已经很好地总结了答案,基本上你正在寻找一个词法分析器和解析器。如果您有兴趣学习更多知识,值得向您(以及其他可能发现您问题的人)介绍Yacc文档。虽然大部分文档都是针对Yacc的,但它写得非常好,并且详细到足以帮助您理解这个问题的不同挑战和复杂性。此外,如果您最终想要构建计算器,还有许多可以用作参考的Yacc计算器示例。

很好的建议。此外,那些想要实际制作基本语言(如计算器)的人也应该了解 Flex(“fast lexical analyzer”),这是一种相关技术,能够轻松地识别模式。Flex 和 Yacc 通常一起使用,Flex 用于识别模式,Yacc 用于在发现模式时执行操作。 - adentinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接