2017-11-25 305 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

一個簡單的方法是遍歷矩陣序列一次,只執行乘法。在應用乘法運算後,創建一個由矩陣組成的新序列。例如,如果初始序列是這樣

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

處理乘法後的順序是這樣的:

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

這從序列中刪除所有乘法,帶給你一個問題,你已經知道如何解決。

注:您的代碼有一個差一錯誤:當j等於countermatrices[j+1]引用的元件一個過去matrices[]數組的末尾。

您可以通過在循環內檢查j+1 < counter來解決此問題。另一種方法是將matrices[0]複製到temp中,而不是執行不受約束的初始操作。通過這種方式,您可以在零處啓動j,以確保代碼即使對於單個矩陣的「退化」情況也能正常工作。

+0

謝謝你,第一個內存解決方案做了竅門,不再有內存泄漏,因此只有原始問題仍然存在 - 操作的順序:) – Welsy

+0

另外 - 這是一個聰明的想法,我怎麼沒有想到這一點。我想我會在研究上面提出的解決方案之前嘗試實現這一點。 – Welsy

+0

@Welsy如果你有括號,抽象語法樹就會被需要。既然你的情況非常簡單,那麼簡單的乘法優先解決方案應該可以工作。 – dasblinkenlight