2017-03-07 8 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私はこれをしないFast Bananaはどの技術を使うべきかを求めています。この問題を解決する簡単な方法があるのか​​どうかだけです。 –

+1

入力式の数学的順序やその他の特徴を検出する関数を実装する最も信頼性の高い方法は、boostパーサーのような一般的なツールを使って式パーサーを記述することです。しかしこれは初心者のための仕事ではありません。しかし、何とか学ばなければなりません。 – JimmyNJ

答えて

3

あなたの質問は十分明確です(実際には非常に興味深い質問IMOです)。

はい、これは可能ですが、私が知る限り、これを行う簡単な方法はありません。あなた自身でこれをプログラムする必要があります。私はあなたのプログラムはそれが正しい方法だと思う。

という言語理論と呼ばれる数々の分野があり、あなたが今質問した問題の種類を研究しています。あなたにこの種の問題の解決策を知らせるために、これを解決する最善の方法はあなた自身の文法を書くことです。パーザを書く前に正式に文法規則を精緻化し、regular expressions(次にyou would have two problems; D)を使って規則を実装しなければならないでしょう。

あなたの問題の外見から、これは、コードの95%がどのような種類の式であるかを決定し、値を抽出することが多くのプログラミングを必要とし、残りの5%はちょうど拡大または分解する。あなたが私に尋ねるならば、単純なプログラムのための過度の努力。

+0

あなたが提供した2つのリンクは非常に面白いです!私は正規表現を見ていますが、それらは正確であり、必要なのは彼らだけではありませんか?簡単な表情から、私が尋ねてきたものに正確に対応してくれました。ブーストのスピリットと、ブーストのスピリットを詳しく見ていきます。 –

+0

@FastBanana私が私の答えで述べたように、この種の問題を解決する方法を理解する。あなたがC++の初心者であれば、正規表現のようなより高度なものを掘り下げる前に、まず最初に*基本を学ぶことをお勧めします。あなたがまだ興味を持っているなら、数ヶ月で正規表現に戻ってくると言います。 –

2

私はAnthony D.が答えをうまくまとめたと思います。基本的には、字句解析ツールとパーサを探しています。あなたがもっと学ぶことに興味があるなら、それはYacc documentationの方にあなた(およびあなたの質問を見つけるかもしれない他人)を導く価値があります。多くの文書はYacc特有のものですが、十分に書かれていて、この問題のさまざまな難題と複雑さを理由に考えるのに役立ちます。さらに、最終的に電卓を作ろうと思っている場合には、多くのYacc電卓の例が参考になります。

+0

優秀な提案。また、実際に基本的な言語を作成したい人(電卓のような)は、パターンを簡単に認識できる関連技術であるFlex(「** f ** ast ** lex **分析アナライザ」)を調べる必要があります。 FlexとYaccはよく一緒に使用され、パターンを認識するためにフレックス、パターンが見つかるとアクションを実行するためにYaccが使用されます。 –

関連する問題