我的代码中存在实现数学运算顺序规则的问题。 我有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 :(得分:2)
一种简单的方法是遍历矩阵序列一次,并仅执行乘法运算。在应用乘法之后创建由矩阵组成的新序列。例如,如果初始序列是这样的
|A| * |B| + |C| * |D| * |E| - |F| + |G| * |H|
处理乘法后的序列如下所示:
|A*B| + |C*D*E| - |F| + |G*H|
这将删除序列中的所有乘法,从而引发您已经知道如何解决的问题。
注意:您的代码有一个错误:当j
等于counter
时,matrices[j+1]
会引用一个结尾的元素matrices[]
数组。
您可以通过检查循环内的j+1 < counter
来解决此问题。另一种方法是将matrices[0]
复制到temp
,而不是执行超出范围的初始操作。通过这种方式,您可以从零开始j
,以确保代码甚至可以用于单个矩阵的“退化”情况。