首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用命令行参数计算矩阵行列式的C程序

用命令行参数计算矩阵行列式的C程序
EN

Stack Overflow用户
提问于 2018-12-15 20:06:34
回答 3查看 148关注 0票数 0

所以我的任务是这样的:“写一个计算矩阵行列式的程序。矩阵的大小应该作为程序的命令行参数输入。一旦程序执行,用户应该从键盘输入矩阵元素。行列式应该计算不同的方阵大小(<=3),而不是单个固定的方阵大小。将您的程序划分为几个函数。使用指针。您将使用的数组的大小由用户在程序执行期间确定,因此不需要使用动态内存分配。”

我听说使用命令行参数无法完成此任务,但不能使用动态内存分配。我只是个初学者,所以我不知道。我还没有讲到计算行列式的部分,我只写了输入和打印矩阵的函数,但是已经有问题了。我真的不知道该怎么办。

这是我到目前为止所拥有的(它没有正确编译):

代码语言:javascript
复制
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");
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-15 21:40:39

Joni的答案解决了主要问题,但在OP的代码中还有其他问题需要修复。

对于初学者,我们必须决定是使用数组的数组(如int mat[3][3];)还是简单的数组(如int mat[9];),而在OP的代码中,对此有一些混淆:

代码语言:javascript
复制
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");
    }
}

因此,如果必须避免任何动态内存分配,我们可以这样写:

代码语言:javascript
复制
// ...
#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");
    }
}

如果你想使用普通数组,可以这样写:

代码语言:javascript
复制
// ...
#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");
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-12-15 20:29:33

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

代码语言:javascript
复制
int matrix[size*size];
inputMatrix(size, matrix);

如果可变长度数组也是不允许的,只需在赋值中将其设置为matrix[9] - size最多为3即可

票数 0
EN

Stack Overflow用户

发布于 2019-05-21 03:38:04

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

你可以查看我的代码here

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53792190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档