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