我正在尝试制作这个程序,但是它没有工作,它没有为辅助矩阵的第二行提供值,我不明白为什么,任何人都可以帮助我吗?谢谢!
哦,我已经推出了一些调试线,显然,一切都很好,它只是没有归因于价值。
#include <stdio.h>
#include <math.h>
void zerar(int n,int m[][n]) {
int i, j;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
m[i][j] = 0;
}
}
}
void printm(int n, int matriz[][n]) {
int i,j;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("\t%d", matriz[i][j]);
}
printf("\n");
}
}
int det(int n, int m[][n]) {
int i, j, k, x, y, soma=0, aux[n][n];
zerar(n, aux);
if (n < 1) {}
else if (n == 1) {
return m[0][0];
}
else if (n == 2) {
soma = (m[0][0] * m[1][1]) - (m[0][1] * m[1][0]);
return soma;
}
else {
for (i=0; i<n; i++) {
for (j=1, x=0; j<n; j++) {
for (k=0, y=0; k<n; k++) {
if (k == i) {
continue;
}
else {
printf("\n\n");
printf("\nx=%d, y=%d, j=%d, k=%d, i=%d\n", x, y, j, k, i);
aux[x][y] = m[j][k];
printm(n-1, aux);
y++;
}
}
x++;
}
soma += m[0][i]*pow(-1, i+2)*det(n-1, aux);
}
return soma;
}
}
int main()
{
int m[3][3] = {{4, 3, 2}, {1, 4, 5}, {2, 1, 2}};
det(3, m);
printf("%d", det(3, m));
printf("\n\n");
printm(3, m);
printf("\n\n");
}
答案 0 :(得分:1)
当输入矩阵的大小为n x n
时,辅助矩阵的大小aux
必须为n-1 x n-1
。
更改
int i, j, k, x, y, soma=0, aux[n][n];
到
int i, j, k, x, y, soma=0, aux[n-1][n-1];
你在评论中说:
有人可以解释一下,为什么必须这样?
如果您使用aux[n][n]
且n
为3,则对象的内存布局为:
+---+---+---+---+---+---+---+---+---+
| | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
并将数据填充为2 x 2
矩阵。
0 1 2
+---+---+---+---+---+---+---+---+---+
| x | x | | x | x | | | | |
+---+---+---+---+---+---+---+---+---+
在下一个递归调用中,您将该内存视为2 x 2
数组。
0 1
+---+---+---+---+---+---+---+---+---+
| x | x | | x | x | | | | |
+---+---+---+---+---+---+---+---+---+
^ ^
| Ignored
Using uninitialized array element
理论上,如果您使用aux[n][n]
代替aux[n-1][n-1]
,则该程序会受到未定义的行为。