2017-11-25 16 views
2

私はの問題を抱えており、数学演算の命令をの規則で自分のコードに実装しています。 私は2つの配列を持っています。行列の配列(最大100個の行列)と演算の配列(最大99個の演算)。演算は、行列の加算、減算、および乗算(+ - *で表される)のみです。数学演算のアルゴリズムのアルゴリズム

私の行列は構造ですが、それは単なる詳細です。私はそれらに関する全ての機能を持っています。

私は操作を実行するための機能も持っています。

struct Matrix compute(struct Matrix mat1, struct Matrix mat2, char op) 

この機能には、操作を決定して正しいものを実行するスイッチがあります。

改善が必要なコードはこれです。現時点で

// counter = number of matrices in the array 
// therefore there's also counter-1 operations 

struct Matrix temp = compute(matrices[0], matrices[1], operations[0]); 
for(int j = 1; j < counter; ++j) 
{ 
    temp = compute(temp, matrices[j+1], operations[j]); 
} 
get_matrix(temp); //outputs the matrix to stdout 

は、このコードは、(入力が正しかったと操作が実行され得ると仮定)乗算を含まないマトリックスおよび操作の正確全ての配列を評価します。

何が必要ですか?私は正しい方向にバットでキックが必要です。

+0

オペランドが行列である式に対して演算の順序を強制する方法が必要だと言っていますか?そして、現在、例えば乗算に失敗する。オペランドが数字の場合は「1 + 2 + 4 * 0」は「0」と評価される。 – Miket25

+0

@ Miket25はい、まさに私が言っていることです。また、コードのこの部分にはメモリリークがあります(マトリックスは動的に割り当てられます)。ただし、Imは、表示されたコードの下に2行だけテンポラリ行列を解放します。しかし、それは私が後で解決できる問題です。 – Welsy

+0

リサーチビルディング**抽象構文木**。このツリー内のノードは行列とオペランドになります。次に、このツリーを再帰的にエバリュートし、操作の順序を達成します。 **再帰的な降下解析**をお勧めします。それは簡単に学ぶことができます。再帰的降下構文解析による演算器の順序については、良い例をオンラインで手に入れて、この問題に適用することができます。 – Miket25

答えて

2

簡単なアプローチの1つは、行列のシーケンスを1回歩き、乗算のみを実行することです。乗算が適用された後に行列で構成された新しいシーケンスを作成します。初期シーケンスは乗算を処理した後、この

|A| * |B| + |C| * |D| * |E| - |F| + |G| * |H| 

シーケンスのようなものである場合たとえば、次のようになります。

|A*B| + |C*D*E| - |F| + |G*H| 

これが問題にあなたをもたらす、シーケンスからすべての乗算を削除しますすでに解決する方法を知っています。

注:コードはoff-by-oneエラーを有する:jcountermatrices[j+1]参照matrices[]アレイの端過去素子1に等しい場合。

ループ内のj+1 < counterを確認することでこれを修正できます。もう1つの方法は、最初の操作を境界外に実行する代わりに、matrices[0]tempにコピーすることです。このようにして、jをゼロから開始して、コードが単一の行列の「縮退」の場合でも機能することを確認できます。

+0

ありがとう、最初のメモリソリューションは、トリックをした、もうメモリリークがないので、元の問題だけが残っている - 操作の順序:) – Welsy

+0

また、それは巧妙なアイデアです、どのように私は考えていませんでした。上記のソリューションを調べる前に、最初に実装しようと考えています。 – Welsy

+0

@Welsy括弧がある場合、抽象構文木が必要になります。あなたのケースはとても簡単なので、単純な乗算型のソリューションが有効です。 – dasblinkenlight