【问题标题】:C program to find the determinant of a 2x2 matrix [closed]C程序查找2x2矩阵的行列式[关闭]
【发布时间】:2022-12-31 05:51:02
【问题描述】:

程序提示/说明

编写一个 C 程序来计算 n x n 方阵的行列式,其中 n 也是一个输入。

我的解决方案尝试

我为该程序编写了以下代码,但我一直将输出作为随机整数获取,并且无法弄清楚我做错了什么。

我想我可能在使用“&”运算符时或在函数定义的某处犯了错误。 (我不太熟悉将数组作为参数输入的函数。)

#include <stdio.h>
int n;
int  det(int aa[n][n], int n)
{
    int i, j, k, c1=0, c2=0, determinant=0;
    int sign=1;
    if(n==1)
    {
        return aa[0];
    }
    else if(n==2)
    {
        determinant = aa[0][0]*aa[1][1]-aa[0][1]*aa[1][0];
        return determinant;
    }
    else
    {
        int minor[n-1][n-1];
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                for(k=0; k<n; k++)
                {
                    if(j!=0 && k!=i)
                    {
                        minor[c1][c2]=aa[j][k];
                        c2++;
                        if(c2>(n-2))
                        {
                            c1++;
                            c2=0;
                        }
                    }
                }
                determinant = determinant + sign*aa[0][i]*det(minor, n-1);
                sign = sign*(-1);
            }

        }
    return determinant;
    }
}

main()
{
    int n, i, j, delta;
    printf("Enter order of matrix :");
    scanf("%d",&n);
    int a[n][n];
    for(i = 0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            a[i][j]=0;
        }
    }
    for(i = 0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("Enter the value for a[%d][%d]\n", i, j);
            scanf("%d", &a[n][n]);
        }
    }
    delta = det(a, n);
    printf("The determinant of your matrix is: %d", delta);
}

【问题讨论】:

  • int det(int aa[n][n], int n)实际上应该是int det(int n, int aa[n][n])。争论的顺序很重要。然后去掉全局变量n
  • nxn 还是 2x2?这里有很大的不同。
  • 如果你的功能绝不有效,您可以对输入进行硬编码并显示实际和预期的输出,而不是期望每个人都运行一个交互式程序自己想出答案应该是什么,
  • @evg 是的,它效率低下,但它是一个很好的练习。
  • 你应该做的第一件事是enable warnings and treat them as errors。接下来,使用调试器查找逻辑中的错误(有很多)。

标签: c determinants


【解决方案1】:

scanf("%d", &amp;a[n][n]); 更改为 scanf("%d", &amp;a[i][j]);

main() 更改为 int main(void)

return aa[0]; 更改为 return aa[0][0];

删除第 2 行的 int n;

int det(int aa[n][n], int n) 更改为 int det(int n, int aa[n][n]);

delta = det(a, n); 更改为 delta = det(n, a);

det(minor, n-1) 更改为 det(n-1, minor)

关于后三个,当函数声明为int det(int aa[n][n], int n)时,解析int aa[n][n]声明时n参数不在范围内。所以int aa[n][n]中使用的n是外部的n。从未使用过外部nmain 使用自己在本地声明的 n。交换参数顺序会改变这一点,因此参数 n 用于参数 aa 的声明中。

【讨论】:

  • 您是否实际检查过您提出的更改是否会产生一个有效的程序?
  • @picchiolu:我测试了 2×2 的情况,但没有更进一步。
  • 3x3 已经不行了,已经...
  • 递归调用似乎在错误的地方。
  • @n.m.:不,不是。小矩阵的构造是错误的。但这与这个答案没有任何关系。 OP 询问该程序不适用于 2×2 矩阵,我回答了这个问题。第三方在我回答后把问题的标题编辑成n×n,这是不合适的。但是 Stack Overflow 不应该是学生转储代码并为他们完全调试和开发代码的地方。如果问题是关于 n×n 矩阵,那就太宽泛了。我已经投票决定关闭拼写错误。
猜你喜欢
  • 2014-12-09
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2016-03-06
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多