2017-03-07 107 views
3

我是C++的初学者,并且正在尝试查找是否存在允许“扫描”输入以检测输入的方程式类型的函数。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 

但是这正是我不想做。

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

我希望自己足够清楚,英语不是我的主要语言我发现我想表达的内容并不十分清楚。

+0

搜索[softwarerecs.se]。软件推荐对于StackOverflow是无关紧要的。 –

+1

@ThomasMatthews我不是这个快速香蕉是要求使用什么技术;只是为了解决这个问题是否有一个简单的方法。 –

+1

实现检测输入表达式的数学顺序和其他特征的函数的最可靠方法是使用像boost这样的通用工具编写表达式分析器。然而,这对新手来说不一定是一项任务。但你必须以某种方式学习。 – JimmyNJ

回答

3

你的问题已经够清楚了(这实际上是一个非常有趣的IMO问题)。

是的,这是可能的,但据我所知没有简单的方法做到这一点;你将不得不自己编程。我认为你的计划很好。

有一个数学整体领域,称为语言理论它研究你刚才问的那种问题。为了让你了解这类问题的解决方案,解决这个问题的最好方法是编写你自己的语法。在编写解析器之前,您必须正式阐述语法规则,并使用regular expressions(然后you would have two problems; D)实施规则。

从问题的外观来看,这需要进行大量的编程工作,比如95%的代码将决定它是什么类型的表达式并提取这些值,其余5%将仅用于扩大或分解。如果你问我一个简单的程序,那就太费劲了。

+0

你提供的两个链接是非常有趣的!我正在看正则表达式,但那些正是我所需要的并不是它们吗?从简短的看,我有他们完全符合我的要求,我会更深入地了解这些和升压的精神,谢谢你和@JimmyNJ –

+0

@FastBanana正如我在我的回答中提到的,我只是解释这个,所以你可以了解如何解决这类问题。如果您是C++的初学者,我会鼓励您在深入研究像正则表达式这样的更高级的东西之前先学习基础知识。我想说,如果你还有兴趣,可以在几个月内回到正则表达式。 –

2

我想安东尼D.已经很好地总结了答案,基本上你正在寻找一个词法分析器和解析器。如果您有兴趣了解更多信息,值得指导您(以及其他可能会发现您的问题的人)朝Yacc documentation。尽管大部分文档都是Yacc特有的,但它的编写和详细程度已足以帮助您解决这个问题的不同挑战和复杂性。此外,如果您最终想要构建计算器,则可以使用大量Yacc计算器示例作为参考。

+0

优秀的建议。另外,那些想要真正制作基本语言(如计算器)的人也应该关注Flex(“** f ** ast ** lex **分析器”),这是一种可以轻松识别模式的相关技术。 Flex和Yacc经常一起使用,flex可以识别模式,Yacc可以在发现模式时执行操作。 –