【问题标题】:Why am I getting segmentation error when the input is a matrix of order>2?当输入是阶矩阵 > 2 时,为什么会出现分段错误?
【发布时间】:2019-06-07 07:01:37
【问题描述】:

问题是在 C 语言中找到一个 NXN 矩阵的行列式。我写了以下代码。我得到一个 n=2 矩阵的输出。但是对于 n>2,程序会说“分段错误(核心转储)”。请帮帮我。我已经尝试尽可能正确地编写代码。任何语法错误的突出显示将不胜感激。提前致谢。 (我使用的是 Ubuntu 18.04 LTS 终端。)

Input - 2 (Order of Matrix)
        1 (Enter the Elements)
        2
        3
        4
Output -1 2 (Entered Matrix)
        3 4  
       -2 (Value of Determinant)
Input - 3 (Order of Matrix)
        1 (Enter the Elements)
        2
        3
        4
        5
        6 
        7
        8
        9
Output -1 2 3 (Entered Matrix)
        4 5 6
        7 8 9 
        Segementation Fault(Core Dumped)

#include <stdio.h>
int determinent(int n,int p[n][n]);
int main()
{
int n,i,j;
printf("Enter the order of the matrix:\n");
scanf("%d",&n);
int a[n][n];
printf("Enter the elements of the NXN matrix.\n");
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        scanf("%d",&a[i][j]);
    }
}
printf("The entered matrix is:\n");
for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        printf("%d ",a[i][j]);
    }
    printf("\n");
}
printf("\n");
printf("The determinent of the matrix is %d\n",determinent(n,a));
return 0;
}

int determinent(int n,int p[n][n])
{
int det,k,m,s=1,i,j,l=0;
if(n==2)
{
    det = p[0][0]*p[1][1] - p[0][1]*p[1][0];
}
else
{
    for(k=0;k<n;k++,s=-s,l++)
    {
        if(l==0)
        {
            det = 0;
        }

        int b[n-1][n-1];
        m = (p[0][k])*(s);
        for(i=0;i<n-1;i++)
        {
            for(j=0;j<n-1;j++)
            {
                if(k==0)
                {
                    b[i][j] = p[i+1][j+1];
                }
                else
                {
                    int c;
                    for(c=0;c<k;c++)
                    {   
                        b[i][j] = p[i+1][j+1];
                    }
                    for(c=k+1;c<n;c++)
                    {
                        b[i][j] = p[i+1][c]; 
                    }    
                }
            }
        }
    n = n-1;    
    det = det + m*determinent(n,b);
    }
    }
    return det;
}

【问题讨论】:

  • OT:为了便于阅读和理解:1) 请一致地缩进代码。在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进。 2)单独的代码块:forifelsewhiledo...whileswitchcasedefault通过一个空行。 3) 用 2 或 3 个空行分隔函数(保持一致)。 4) 变量名称应指明content 或usage(或更好,两者兼有)。单个字符的名称是没有意义的。 5) 遵循公理:每行只有一个语句,并且(最多)每条语句有一个变量声明。
  • 发布的输出与发布的代码输出不匹配。这会导致混乱,并且往往会导致问题被否决

标签: c arrays


【解决方案1】:

正如 cmets 中提到的,您有无限递归导致堆栈溢出,因为您将错误的值 n 传递给递归调用。而不是n--,您应该传递n-1。请注意,在k-循环中传递的值不应改变,它应始终比作为函数参数传入的值小一。

在 cmets 中也提到,您的 k 循环的上限在您编辑之前偏离了 1。

剩下的问题是如何填充子矩阵b[n-1][n-1]。您想要实现的是用p 的所有值填充b,除了0 行和k 列中的值。 c 上的循环是不必要的,k == 0 的特殊情况也是如此。要选择的正确值是b[i][j] = p[i+1][(j &lt; k) ? j : j+1]。换句话说,将行1 复制到n-1。对于每一行,将列复制到k 的左侧,然后在列索引中添加一个以跳过第k。

修复这些问题后,代码会为我尝试的几种情况生成正确的决定因素。

【讨论】:

  • 这是一个有用的答案。我会尝试修改程序。非常感谢。
  • 非常感谢朋友。你得到了解决方案。问题出在“c”变量循环中。我不知道,我会检查它为什么它不起作用,但是是的,你写 b[ i ][ j ] 的方法就像一个魅力。再次非常感谢!
【解决方案2】:
  • 您制作的 2 阶矩阵并得到一个行列式值,有逻辑 搞砸了,你正在进入一个无限循环,最后你试图访问一个超出范围的数组值并且核心转储正在发生。我附上了下面的屏幕截图 供你参考。 enter image description here

【讨论】:

  • 你能详细说明一下吗
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多