所以我的任务是这样的:“写一个计算矩阵行列式的程序。矩阵的大小应该作为程序的命令行参数输入。一旦程序执行,用户应该从键盘输入矩阵元素。行列式应该计算不同的方阵大小(<=3),而不是单个固定的方阵大小。将您的程序划分为几个函数。使用指针。您将使用的数组的大小由用户在程序执行期间确定,因此不需要使用动态内存分配。”
我听说使用命令行参数无法完成此任务,但不能使用动态内存分配。我只是个初学者,所以我不知道。我还没有讲到计算行列式的部分,我只写了输入和打印矩阵的函数,但是已经有问题了。我真的不知道该怎么办。
这是我到目前为止所拥有的(它没有正确编译):
void inputMatrix(int size);
void printMatrix(int *matrix, int size);
int main(int argc, char *argv[])
{
int size = atoi(argv[1]);
int *matrix;
inputMatrix(size);
printMatrix(*matrix, size);
return 0;
}
void inputMatrix(int size)
{
int i, j;
int *matrix;
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
scanf("%d", (*(matrix + i) + j));
}
}
}
void printMatrix(int *matrix, int size)
{
int i, j;
int *matrix;
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("%d ", *(*(matrix +i) + j));
}
printf("\n");
}
}
发布于 2018-12-15 21:40:39
Joni的答案解决了主要问题,但在OP的代码中还有其他问题需要修复。
对于初学者,我们必须决定是使用数组的数组(如int mat[3][3];
)还是简单的数组(如int mat[9];
),而在OP的代码中,对此有一些混淆:
int main(int argc, char *argv[])
{
// ...
int *matrix; // <-- This pointer is uninitialized, its value is indeterminated
// ...
printMatrix(*matrix, size);
// ^ dereferencing it, you are passing an 'int'
}
// ...
void printMatrix(int *matrix, int size)
{ // ^ a pointer to an int is expected
int i, j;
int *matrix; // <-- This is a local variable that will shadow the parameter
// with the same name and it is also uninitialized.
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("%d ", *(*(matrix +i) + j));
// ^^^^ this is equivalent to 'matrix[i][j]',
// but 'matrix' is only a pointer to 'int'
}
printf("\n");
}
}
因此,如果必须避免任何动态内存分配,我们可以这样写:
// ...
#define MAX_SIZE 3
int main(int argc, char *argv[])
{
int matrix[MAX_SIZE][MAX_SIZE];
// read 'size' from command line arguments, then
inputMatrix(size, matrix); // <-- Note that I'm passing 'matrix' here too.
printMatrix(size, matrix);
// ...
}
// The functions must be modified accordingly, e.g.:
void printMatrix(int size, int matrix[][MAX_SIZE])
// The inner dimension must be specified ^^^^^^
{
for(int i = 0; i < size; i++)
{
for(int j = 0; j < size; j++)
{
printf("%d ", *(*(matrix + i) + j)); // <-- "Use pointers." they said
}
printf("\n");
}
}
如果你想使用普通数组,可以这样写:
// ...
#define MAX_SIZE 9 // <-- the total size: 3*3
int main(int argc, char *argv[])
{
int matrix[MAX_SIZE];
// ...
printMatrix(size, matrix);
// ...
}
void printMatrix(int size, int matrix[])
{
for(int i = 0; i < size; i++)
{
for(int j = 0; j < size; j++)
{
printf("%d ", *(matrix + (i * size + j));
// Note the math ^^^^^^^^^^^^^^^^^
// In this simple case of row wise traversal, it could be as simple as
// *(matrix++)
}
printf("\n");
}
}
发布于 2018-12-15 20:29:33
由于不允许使用动态内存分配,因此必须在main函数中创建矩阵,并将其作为参数传递给其他函数。这使用了C语言的一个称为可变长度数组的特性:
int matrix[size*size];
inputMatrix(size, matrix);
如果可变长度数组也是不允许的,只需在赋值中将其设置为matrix[9]
- size最多为3即可
发布于 2019-05-21 03:38:04
使用动态内存分配,很容易找到n阶(n是有限)方阵的行列式。但是,在这种情况下,重要的是在程序结束时释放内存。
你可以查看我的代码here!
https://stackoverflow.com/questions/53792190
复制相似问题