我正在编写一个程序,使用大小最大为3x3的指针来计算矩阵的行列式,并且我从编写2x2矩阵的公式开始。
我遇到一个错误,它在乘法表达式的开头的括号内显示“表达式必须具有算术类型”。
该程序似乎将值识别为指针,而不是仅将值相乘,但是我不确定。我该如何解决?
void determinant(int size, int matrix[][MAXSIZE])
{
int d;
if(size == 2)
{
d = matrix * ((matrix + 1) + 1) - ((matrix + 1) + 0) * ((matrix + 0) + 1);
printf("Determinant of your matrix: %d\n", d);
}
}
答案 0 :(得分:2)
为什么不只是matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]
?
不过,您可能应该向函数传递比int matrix[][]
更类型安全的参数(例如,创建某种struct MATRIX_2_2
)。
为了便于练习,如果您真的想使用指针算术,则可能需要编写如下内容:
d = (**matrix) * (*(*(matrix + 1) + 1)) - (*(*(matrix + 0) + 1)) * (*(*(matrix + 1) + 0));
在这里,每个第一个取消引用(即星号)都将获取矩阵的一维数组,第二个将获取一个特定值。
答案 1 :(得分:1)
计算determinant的问题是一个基本的数学问题(与C完全无关),大多数线性代数课程都会解释如何做到这一点。您实际上需要了解如何“手动”计算。
一个不同的问题是如何在C程序中表示矩阵(作为abstract data type)。我建议使用flexible array members(以及包含它们的指向struct
的指针),我将在this答案中详细说明如何做到这一点(当然,您需要根据需要完成此操作) )。
通过结合两种方法(数学方面和编程方面),您可以完成家庭作业。
编译时不要忘记启用所有警告和调试信息(例如,使用GCC和here一起使用gcc -Wall -Wextra -g
进行编译,并阅读{{3} }。