C程序来计算带有命令行参数的矩阵的行列式

时间:2018-12-15 12:06:34

标签: c matrix

所以我有这样的任务: “写一个程序来计算矩阵的行列式。矩阵的大小应作为程序的命令行参数输入。用户应在执行程序后从键盘上键入矩阵元素。应针对不同的行列式计算行列式方阵大小(<= 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");
    }
}

3 个答案:

答案 0 :(得分:0)

由于不允许使用动态内存分配,因此必须在主函数中创建矩阵并将其作为参数传递给其他函数。这使用了C的称为可变长度数组的功能:

int matrix[size*size];
inputMatrix(size, matrix);

如果也不允许使用可变长度数组,只需将其设为matrix[9]-您的作业中大小最大为3

答案 1 :(得分:0)

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");
    }
}

答案 2 :(得分:-1)

使用动态内存分配,查找n阶方矩阵(n是有限的)的行列式非常容易。但是,在这种情况下,重要的是在程序结束时释放内存。

您可以查看我的代码here