Почему я получаю ошибку сегментации, когда входные данные представляют собой матрицу порядка> 2? - PullRequest
0 голосов
/ 07 июня 2019

Вопрос в том, чтобы найти определитель матрицы NXN на языке Си.Я написал следующий код.Я получаю вывод для матрицы = 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;
}

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Как упоминалось в комментариях, у вас была бесконечная рекурсия, приводящая к переполнению стека, потому что вы передавали неправильное значение n рекурсивному вызову. Вместо n-- вы должны передать n-1. Обратите внимание, что переданное значение не должно изменяться в k -loop, оно всегда должно быть на единицу меньше значения, переданного в качестве аргумента функции.

Также упоминается в комментариях, верхняя граница вашего цикла k была отключена на единицу до вашего редактирования.

Остается проблема с заполнением подматрицы b[n-1][n-1]. То, что вы пытаетесь достичь, это заполнить b всеми значениями p, за исключением значений в строке 0 и значений в столбце k. Цикл над c не нужен, как и особый случай для k == 0. Правильное значение для выбора b[i][j] = p[i+1][(j < k) ? j : j+1]. Другими словами, скопируйте строки 1 в n-1. Для каждой строки скопируйте столбцы слева от k, а затем добавьте один к индексу столбцов, чтобы пропустить k '.

Исправляя их, код выдает правильные детерминанты для нескольких случаев, которые я пробовал.

0 голосов
/ 07 июня 2019
  • Матрица 2 порядка, которую вы создаете и получаете определитель, есть логика портится, вы работаете в бесконечном цикле и, наконец, вы пытаетесь получить доступ к значению массива вне привязки, и происходит дамп ядра. Я прикрепил снимок экрана ниже для ваша ссылка. введите описание изображения здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...