2017-03-07 35 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可以在發現模式時執行操作。 –